-
Notifications
You must be signed in to change notification settings - Fork 192
Handle resize events [Feature request #196] #197
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
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -81,6 +81,17 @@ enum { | |
| GC_MAX | ||
| }; | ||
|
|
||
| enum { | ||
| NET_WM_WINDOW_TYPE, | ||
| NET_WM_WINDOW_TYPE_DOCK, | ||
| NET_WM_DESKTOP, | ||
| NET_WM_STRUT_PARTIAL, | ||
| NET_WM_STRUT, | ||
| NET_WM_STATE, | ||
| NET_WM_STATE_STICKY, | ||
| NET_WM_STATE_ABOVE, | ||
| }; | ||
|
|
||
| #define MAX_FONT_COUNT 5 | ||
|
|
||
| static xcb_connection_t *c; | ||
|
|
@@ -100,6 +111,18 @@ static int bu = 1; // Underline height | |
| static rgba_t fgc, bgc, ugc; | ||
| static rgba_t dfgc, dbgc, dugc; | ||
| static area_stack_t area_stack; | ||
| static const char *atom_names[] = { | ||
| "_NET_WM_WINDOW_TYPE", | ||
| "_NET_WM_WINDOW_TYPE_DOCK", | ||
| "_NET_WM_DESKTOP", | ||
| "_NET_WM_STRUT_PARTIAL", | ||
| "_NET_WM_STRUT", | ||
| "_NET_WM_STATE", | ||
| // Leave those at the end since are batch-set | ||
| "_NET_WM_STATE_STICKY", | ||
| "_NET_WM_STATE_ABOVE", | ||
| }; | ||
| static xcb_atom_t atom_list[sizeof(atom_names) / sizeof(char *)]; | ||
|
|
||
| void | ||
| update_gc (void) | ||
|
|
@@ -342,7 +365,6 @@ set_attribute (const char modifier, const char attribute) | |
| } | ||
| } | ||
|
|
||
|
|
||
| area_t * | ||
| area_get (xcb_window_t win, const int btn, const int x) | ||
| { | ||
|
|
@@ -416,7 +438,7 @@ area_add (char *str, const char *optend, char **end, monitor_t *mon, const int x | |
| } | ||
|
|
||
| if (area_stack.at + 1 > area_stack.max) { | ||
| fprintf(stderr, "Cannot add any more clickable areas (used %d/%d)\n", | ||
| fprintf(stderr, "Cannot add any more clickable areas (used %d/%d)\n", | ||
| area_stack.at, area_stack.max); | ||
| return false; | ||
| } | ||
|
|
@@ -703,34 +725,11 @@ font_load (const char *pattern) | |
| font_list[font_count++] = ret; | ||
| } | ||
|
|
||
| enum { | ||
| NET_WM_WINDOW_TYPE, | ||
| NET_WM_WINDOW_TYPE_DOCK, | ||
| NET_WM_DESKTOP, | ||
| NET_WM_STRUT_PARTIAL, | ||
| NET_WM_STRUT, | ||
| NET_WM_STATE, | ||
| NET_WM_STATE_STICKY, | ||
| NET_WM_STATE_ABOVE, | ||
| }; | ||
|
|
||
| void | ||
| set_ewmh_atoms (void) | ||
| { | ||
| const char *atom_names[] = { | ||
| "_NET_WM_WINDOW_TYPE", | ||
| "_NET_WM_WINDOW_TYPE_DOCK", | ||
| "_NET_WM_DESKTOP", | ||
| "_NET_WM_STRUT_PARTIAL", | ||
| "_NET_WM_STRUT", | ||
| "_NET_WM_STATE", | ||
| // Leave those at the end since are batch-set | ||
| "_NET_WM_STATE_STICKY", | ||
| "_NET_WM_STATE_ABOVE", | ||
| }; | ||
| const int atoms = sizeof(atom_names)/sizeof(char *); | ||
| const int atoms = sizeof(atom_names) / sizeof(char *); | ||
| xcb_intern_atom_cookie_t atom_cookie[atoms]; | ||
| xcb_atom_t atom_list[atoms]; | ||
| xcb_intern_atom_reply_t *atom_reply; | ||
|
|
||
| // As suggested fetch all the cookies first (yum!) and then retrieve the | ||
|
|
@@ -768,6 +767,44 @@ set_ewmh_atoms (void) | |
| } | ||
| } | ||
|
|
||
| void | ||
| update_ewmh_atoms (void) | ||
| { | ||
| // Only desktops that support EWMH should continue | ||
| if (!atom_list[0]) | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is a |
||
| return; | ||
|
|
||
| // Update struts | ||
| for (monitor_t *mon = monhead; mon; mon = mon->next) { | ||
| int strut[12] = {0}; | ||
| if (topbar) { | ||
| strut[2] = bh; | ||
| strut[8] = mon->x; | ||
| strut[9] = mon->x + mon->width - 1; | ||
| } else { | ||
| strut[3] = bh; | ||
| strut[10] = mon->x; | ||
| strut[11] = mon->x + mon->width - 1; | ||
| } | ||
|
|
||
| xcb_change_property(c, XCB_PROP_MODE_REPLACE, mon->window, atom_list[NET_WM_STRUT_PARTIAL], XCB_ATOM_CARDINAL, 32, 12, strut); | ||
| xcb_change_property(c, XCB_PROP_MODE_REPLACE, mon->window, atom_list[NET_WM_STRUT], XCB_ATOM_CARDINAL, 32, 4, strut); | ||
| } | ||
| } | ||
|
|
||
| void | ||
| create_pixmap (monitor_t *mon) | ||
| { | ||
| if (mon->pixmap) { | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. No brackets on 1-line |
||
| xcb_free_pixmap(c, mon->pixmap); | ||
| } | ||
|
|
||
| int depth = (visual == scr->root_visual) ? XCB_COPY_FROM_PARENT : 32; | ||
|
|
||
| mon->pixmap = xcb_generate_id(c); | ||
| xcb_create_pixmap(c, depth, mon->pixmap, mon->window, mon->width, bh); | ||
| } | ||
|
|
||
| monitor_t * | ||
| monitor_new (int x, int y, int width, int height) | ||
| { | ||
|
|
@@ -790,11 +827,9 @@ monitor_new (int x, int y, int width, int height) | |
| ret->x, ret->y, width, bh, 0, | ||
| XCB_WINDOW_CLASS_INPUT_OUTPUT, visual, | ||
| XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL | XCB_CW_OVERRIDE_REDIRECT | XCB_CW_EVENT_MASK | XCB_CW_COLORMAP, | ||
| (const uint32_t []){ bgc.v, bgc.v, dock, XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_BUTTON_PRESS, colormap }); | ||
|
|
||
| ret->pixmap = xcb_generate_id(c); | ||
| xcb_create_pixmap(c, depth, ret->pixmap, ret->window, width, bh); | ||
| (const uint32_t []){ bgc.v, bgc.v, dock, XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_BUTTON_PRESS | XCB_EVENT_MASK_STRUCTURE_NOTIFY, colormap }); | ||
|
|
||
| create_pixmap(ret); | ||
| return ret; | ||
| } | ||
|
|
||
|
|
@@ -1262,6 +1297,7 @@ main (int argc, char **argv) | |
| xcb_generic_event_t *ev; | ||
| xcb_expose_event_t *expose_ev; | ||
| xcb_button_press_event_t *press_ev; | ||
| xcb_configure_notify_event_t *notify_ev; | ||
| char input[4096] = {0, }; | ||
| bool permanent = false; | ||
| int geom_v[4] = { -1, -1, 0, 0 }; | ||
|
|
@@ -1383,6 +1419,26 @@ main (int argc, char **argv) | |
| } | ||
| } | ||
| break; | ||
| case XCB_CONFIGURE_NOTIFY: | ||
| notify_ev = (xcb_configure_notify_event_t *)ev; | ||
|
|
||
| for (monitor_t *mon = monhead; mon; mon = mon->next) { | ||
| if (mon->window != notify_ev->window) | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Once the matching |
||
| continue; | ||
|
|
||
| mon->x = notify_ev->x; | ||
| mon->y = notify_ev->y; | ||
| bw = mon->width = notify_ev->width; | ||
| bh = notify_ev->height; | ||
|
|
||
| create_pixmap(mon); // Xorg doesn't allow resizing pixmaps, so we create a new one | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Put the comment above the code so that the lines are not too long. |
||
| update_ewmh_atoms(); | ||
|
|
||
| // Reprocess last input using the new geometry | ||
| parse(input); | ||
| redraw = true; | ||
| } | ||
| break; | ||
| } | ||
|
|
||
| free(ev); | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's just add a
NET_WM_ATOM_MAXto avoid thesizeof/sizeofrepeated twice.