mirror of
https://github.com/Llewellynvdm/conky.git
synced 2024-11-17 02:25:09 +00:00
set_struts improvements (#1849)
Simplify and speed up strut code Signed-off-by: Tin Švagelj <tin.svagelj@live.com>
This commit is contained in:
parent
93ffab51a0
commit
c5ee70177c
@ -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
|
||||
|
95
src/x11.cc
95
src/x11.cc
@ -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;
|
||||
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;
|
||||
|
||||
/* define strut depth */
|
||||
switch (sidenum) {
|
||||
case 0:
|
||||
/* left side */
|
||||
sizes[0] = window.x + window.width;
|
||||
break;
|
||||
case 1:
|
||||
/* right side */
|
||||
sizes[1] = display_width - window.x;
|
||||
break;
|
||||
case 2:
|
||||
/* top side */
|
||||
sizes[2] = window.y + window.height;
|
||||
break;
|
||||
case 3:
|
||||
/* bottom side */
|
||||
sizes[3] = display_height - window.y;
|
||||
break;
|
||||
}
|
||||
Atom strut = ATOM(_NET_WM_STRUT);
|
||||
if (strut != None) {
|
||||
long sizes[STRUT_COUNT] = {0};
|
||||
|
||||
/* 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; }
|
||||
}
|
||||
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 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 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);
|
||||
|
@ -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();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user