Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

set_struts improvements #1849

Merged
merged 2 commits into from
Apr 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 1 addition & 30 deletions src/display-x11.cc
Original file line number Diff line number Diff line change
Expand Up @@ -313,37 +313,8 @@ bool display_output_x11::main_loop_wait(double t) {

/* update struts */
if ((changed != 0) && own_window_type.get(*state) == window_type::PANEL) {
int sidenum = -1;

NORM_ERR("defining struts");

alignment align = text_alignment.get(*state);
switch (align) {
case alignment::TOP_LEFT:
case alignment::TOP_RIGHT:
case alignment::TOP_MIDDLE: {
sidenum = 2;
break;
}
case alignment::BOTTOM_LEFT:
case alignment::BOTTOM_RIGHT:
case alignment::BOTTOM_MIDDLE: {
sidenum = 3;
break;
}
case alignment::MIDDLE_LEFT: {
sidenum = 0;
break;
}
case alignment::MIDDLE_RIGHT: {
sidenum = 1;
break;
}
default:
break;
}

if (sidenum != -1) set_struts(sidenum);
set_struts(text_alignment.get(*state));
}
}
#endif
Expand Down
95 changes: 50 additions & 45 deletions src/x11.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1108,60 +1108,65 @@ constexpr size_t operator*(x11_strut index) {
}

/* reserve window manager space */
void set_struts(int sidenum) {
Atom strut;
if ((strut = ATOM(_NET_WM_STRUT)) != None) {
/* reserve space at left, right, top, bottom */
signed long sizes[12] = {0};
int i;

/* define strut depth */
switch (sidenum) {
case 0:
/* left side */
sizes[0] = window.x + window.width;
void set_struts(alignment align) {
// Middle and none align don't have least significant bit set.
// Ensures either vertical or horizontal axis are start/end
if ((*align & 0b0101) == 0) return;

Atom strut = ATOM(_NET_WM_STRUT);
if (strut != None) {
long sizes[STRUT_COUNT] = {0};

switch (horizontal_alignment(align)) {
case axis_align::START:
sizes[*x11_strut::LEFT] =
std::clamp(window.x + window.width, 0, display_width);
sizes[*x11_strut::LEFT_START_Y] =
std::clamp(window.y, 0, display_height);
sizes[*x11_strut::LEFT_END_Y] =
std::clamp(window.y + window.height, 0, display_height);
break;
case 1:
/* right side */
sizes[1] = display_width - window.x;
case axis_align::END:
sizes[*x11_strut::RIGHT] =
std::clamp(display_width - window.x, 0, display_width);
sizes[*x11_strut::RIGHT_START_Y] =
std::clamp(window.y, 0, display_height);
sizes[*x11_strut::RIGHT_END_Y] =
std::clamp(window.y + window.height, 0, display_height);
break;
case 2:
/* top side */
sizes[2] = window.y + window.height;
break;
case 3:
/* bottom side */
sizes[3] = display_height - window.y;
break;
}

/* define partial strut length */
if (sidenum <= 1) {
sizes[4 + (sidenum * 2)] = window.y;
sizes[5 + (sidenum * 2)] = window.y + window.height;
} else if (sidenum <= 3) {
sizes[4 + (sidenum * 2)] = window.x;
sizes[5 + (sidenum * 2)] = window.x + window.width;
}

/* check constraints */
for (i = 0; i < 12; i++) {
if (sizes[i] < 0) {
sizes[i] = 0;
} else {
if (i <= 1 || i >= 8) {
if (sizes[i] > display_width) { sizes[i] = display_width; }
} else {
if (sizes[i] > display_height) { sizes[i] = display_height; }
case axis_align::MIDDLE:
switch (vertical_alignment(align)) {
case axis_align::START:
sizes[*x11_strut::TOP] =
std::clamp(window.y + window.height, 0, display_height);
sizes[*x11_strut::TOP_START_X] =
std::clamp(window.x, 0, display_width);
sizes[*x11_strut::TOP_END_X] =
std::clamp(window.x + window.width, 0, display_width);
break;
case axis_align::END:
sizes[*x11_strut::BOTTOM] =
std::clamp(display_height - window.y, 0, display_height);
sizes[*x11_strut::BOTTOM_START_X] =
std::clamp(window.x, 0, display_width);
sizes[*x11_strut::BOTTOM_END_X] =
std::clamp(window.x + window.width, 0, display_width);
break;
case axis_align::MIDDLE:
// can't reserve space in middle of the screen
default:
break;
}
}
default:
break;
}

XChangeProperty(display, window.window, strut, XA_CARDINAL, 32,
PropModeReplace, reinterpret_cast<unsigned char *>(&sizes),
4);

if ((strut = ATOM(_NET_WM_STRUT_PARTIAL)) != None) {
strut = ATOM(_NET_WM_STRUT_PARTIAL);
if (strut != None) {
XChangeProperty(display, window.window, strut, XA_CARDINAL, 32,
PropModeReplace,
reinterpret_cast<unsigned char *>(&sizes), 12);
Expand Down
2 changes: 1 addition & 1 deletion src/x11.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ void destroy_window(void);
void create_gc(void);
void set_transparent_background(Window win);
void get_x11_desktop_info(Display *current_display, Atom atom);
void set_struts(int);
void set_struts(alignment alignment);
void x11_init_window(lua::state &l, bool own);
void deinit_x11();

Expand Down