itRespond to various X events received on window - xmenu - drop-down menu for X11 Err z3bra.org 70 hgit clone git://git.z3bra.org/xmenu.git URL:git://git.z3bra.org/xmenu.git z3bra.org 70 1Log /scm/xmenu/log.gph z3bra.org 70 1Files /scm/xmenu/files.gph z3bra.org 70 1Refs /scm/xmenu/refs.gph z3bra.org 70 i--- Err z3bra.org 70 1commit 8f3bd60df8e72fdbbcef34f94578590ccb791a38 /scm/xmenu/commit/8f3bd60df8e72fdbbcef34f94578590ccb791a38.gph z3bra.org 70 1parent 9a12b6f436404472e429ded821d4b60020f2594b /scm/xmenu/commit/9a12b6f436404472e429ded821d4b60020f2594b.gph z3bra.org 70 hAuthor: Willy Goiffon URL:mailto:dev@z3bra.org z3bra.org 70 iDate: Tue, 19 Nov 2019 08:57:36 +0100 Err z3bra.org 70 i Err z3bra.org 70 iRespond to various X events received on window Err z3bra.org 70 i Err z3bra.org 70 iDiffstat: Err z3bra.org 70 i M config.def.h | 6 +++--- Err z3bra.org 70 i M xmenu.c | 80 ++++++++++++++++++++----------- Err z3bra.org 70 i Err z3bra.org 70 i2 files changed, 55 insertions(+), 31 deletions(-) Err z3bra.org 70 i--- Err z3bra.org 70 1diff --git a/config.def.h b/config.def.h /scm/xmenu/file/config.def.h.gph z3bra.org 70 it@@ -1,6 +1,6 @@ Err z3bra.org 70 i-/* internal padding */ Err z3bra.org 70 i-int padx = 32; Err z3bra.org 70 i-int pady = 16; Err z3bra.org 70 i+/* original window size */ Err z3bra.org 70 i+int width = 128; Err z3bra.org 70 i+int height = 256; Err z3bra.org 70 i Err z3bra.org 70 i /* widget colors, given as RGB hex values */ Err z3bra.org 70 i uint32_t background = 0x3f3f3f; Err z3bra.org 70 1diff --git a/xmenu.c b/xmenu.c /scm/xmenu/file/xmenu.c.gph z3bra.org 70 it@@ -12,11 +12,18 @@ Err z3bra.org 70 i #include "config.h" Err z3bra.org 70 i #include "font.h" Err z3bra.org 70 i Err z3bra.org 70 i+#define MAX(a,b) (((a)>(b))?(a):(b)) Err z3bra.org 70 i+#define MIN(a,b) (((a)<(b))?(a):(b)) Err z3bra.org 70 i+ Err z3bra.org 70 i int verbose = 0; Err z3bra.org 70 i xcb_connection_t *dpy; Err z3bra.org 70 i xcb_screen_t *screen; Err z3bra.org 70 i xcb_window_t wid; Err z3bra.org 70 i Err z3bra.org 70 i+size_t nent = 0; Err z3bra.org 70 i+size_t maxwidth = 0; Err z3bra.org 70 i+size_t maxheight = 0; Err z3bra.org 70 i+ Err z3bra.org 70 i void Err z3bra.org 70 i usage(FILE *fd, char *name) Err z3bra.org 70 i { Err z3bra.org 70 it@@ -24,12 +31,26 @@ usage(FILE *fd, char *name) Err z3bra.org 70 i } Err z3bra.org 70 i Err z3bra.org 70 i int Err z3bra.org 70 i+drawentries() Err z3bra.org 70 i+{ Err z3bra.org 70 i+ size_t i, w, h; Err z3bra.org 70 i+ Err z3bra.org 70 i+ for (i = 0; i < nent; i++) { Err z3bra.org 70 i+ w = (width - xft_txtw(entries[i])) / 2; Err z3bra.org 70 i+ h = (height/nent) * (i + 0.5) - maxheight/2 + (maxheight - xft_txth(entries[i])); Err z3bra.org 70 i+ xft_drawtext(dpy, wid, w, h, foreground, entries[i]); Err z3bra.org 70 i+ } Err z3bra.org 70 i+ Err z3bra.org 70 i+ return 0; Err z3bra.org 70 i+} Err z3bra.org 70 i+ Err z3bra.org 70 i+int Err z3bra.org 70 i main(int argc, char *argv[]) Err z3bra.org 70 i { Err z3bra.org 70 i char *argv0; Err z3bra.org 70 i long dpi; Err z3bra.org 70 i int mask, val[4]; Err z3bra.org 70 i- size_t width, height; Err z3bra.org 70 i+ xcb_generic_event_t *ev = NULL; Err z3bra.org 70 i Err z3bra.org 70 i ARGBEGIN { Err z3bra.org 70 i case 'h': Err z3bra.org 70 it@@ -63,46 +84,49 @@ main(int argc, char *argv[]) Err z3bra.org 70 i Err z3bra.org 70 i val[0] = background; Err z3bra.org 70 i val[1] = XCB_EVENT_MASK_EXPOSURE Err z3bra.org 70 i+ | XCB_EVENT_MASK_KEY_PRESS Err z3bra.org 70 i | XCB_EVENT_MASK_BUTTON_PRESS Err z3bra.org 70 i | XCB_EVENT_MASK_BUTTON_RELEASE Err z3bra.org 70 i- | XCB_EVENT_MASK_BUTTON_MOTION; Err z3bra.org 70 i- Err z3bra.org 70 i- int nentries = 0; Err z3bra.org 70 i- char **n = entries; Err z3bra.org 70 i- width = 0; Err z3bra.org 70 i- height = pady; Err z3bra.org 70 i- while(*n) { Err z3bra.org 70 i- height = (xft_txth(*n) > height) ? xft_txth(*n) : height; Err z3bra.org 70 i- width = (xft_txtw(*n) > width) ? xft_txtw(*n) : width; Err z3bra.org 70 i- printf("%s (%ldx%ld)\n", *n, xft_txtw(*n), xft_txth(*n)); Err z3bra.org 70 i- n++; Err z3bra.org 70 i- nentries++; Err z3bra.org 70 i+ | XCB_EVENT_MASK_BUTTON_MOTION Err z3bra.org 70 i+ | XCB_EVENT_MASK_STRUCTURE_NOTIFY; Err z3bra.org 70 i+ Err z3bra.org 70 i+ for (nent = 0; entries[nent]; nent++) { Err z3bra.org 70 i+ maxwidth = MAX(xft_txtw(entries[nent]), maxwidth); Err z3bra.org 70 i+ maxheight = MAX(xft_txth(entries[nent]), maxheight); Err z3bra.org 70 i } Err z3bra.org 70 i Err z3bra.org 70 i wid = xcb_generate_id(dpy); Err z3bra.org 70 i xcb_create_window(dpy, screen->root_depth, wid, screen->root, Err z3bra.org 70 i- 0, 0, width + padx * 2, (height + pady) * nentries + pady, 0, Err z3bra.org 70 i+ 0, 0, width, height, 0, Err z3bra.org 70 i XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, mask, val); Err z3bra.org 70 i Err z3bra.org 70 i- printf("window: %ldx%ld\n", width + padx * 2, (height + pady) * nentries + pady); Err z3bra.org 70 i+ Err z3bra.org 70 i+ //xcb_grab_key(dpy, 1, wid, XCB_NONE, 9, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC); Err z3bra.org 70 i Err z3bra.org 70 i xcb_map_window(dpy, wid); Err z3bra.org 70 i Err z3bra.org 70 i- n = entries; Err z3bra.org 70 i- nentries = 0; Err z3bra.org 70 i- while (*n) { Err z3bra.org 70 i- xft_drawtext(dpy, wid, Err z3bra.org 70 i- (width + padx * 2)/2 - (xft_txtw(*n))/2, Err z3bra.org 70 i- (height + pady) * nentries + pady + (height - xft_txth(*n))/2, Err z3bra.org 70 i- foreground, *n); Err z3bra.org 70 i- n++; Err z3bra.org 70 i- nentries++; Err z3bra.org 70 i+ int loop = 1; Err z3bra.org 70 i+ while(loop) { Err z3bra.org 70 i+ xcb_flush(dpy); Err z3bra.org 70 i+ ev = xcb_wait_for_event(dpy); Err z3bra.org 70 i+ if (!ev) Err z3bra.org 70 i+ break; Err z3bra.org 70 i+ Err z3bra.org 70 i+ switch(ev->response_type & ~0x80) { Err z3bra.org 70 i+ case XCB_KEY_PRESS: Err z3bra.org 70 i+ if (((xcb_key_press_event_t *)ev)->detail == 9) Err z3bra.org 70 i+ loop = 0; Err z3bra.org 70 i+ break; Err z3bra.org 70 i+ case XCB_CONFIGURE_NOTIFY: Err z3bra.org 70 i+ width = ((xcb_configure_notify_event_t *)ev)->width; Err z3bra.org 70 i+ height = ((xcb_configure_notify_event_t *)ev)->height; Err z3bra.org 70 i+ break; Err z3bra.org 70 i+ case XCB_EXPOSE: Err z3bra.org 70 i+ drawentries(); Err z3bra.org 70 i+ break; Err z3bra.org 70 i+ } Err z3bra.org 70 i } Err z3bra.org 70 i Err z3bra.org 70 i- xcb_flush(dpy); Err z3bra.org 70 i- Err z3bra.org 70 i- sleep(50); Err z3bra.org 70 i- Err z3bra.org 70 i xcb_disconnect(dpy); Err z3bra.org 70 i return 0; Err z3bra.org 70 i } Err z3bra.org 70 .