itSelect and print what's under cursor on exit - 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 6e984bc6d761614be9bb1da31217a40fbb587ccd /scm/xmenu/commit/6e984bc6d761614be9bb1da31217a40fbb587ccd.gph z3bra.org 70 1parent 8f3bd60df8e72fdbbcef34f94578590ccb791a38 /scm/xmenu/commit/8f3bd60df8e72fdbbcef34f94578590ccb791a38.gph z3bra.org 70 hAuthor: Willy Goiffon URL:mailto:dev@z3bra.org z3bra.org 70 iDate: Tue, 19 Nov 2019 18:17:56 +0100 Err z3bra.org 70 i Err z3bra.org 70 iSelect and print what's under cursor on exit Err z3bra.org 70 i Err z3bra.org 70 iDiffstat: Err z3bra.org 70 i M font.c | 2 +- Err z3bra.org 70 i M xmenu.c | 53 ++++++++++++++++++++++++++++--- Err z3bra.org 70 i Err z3bra.org 70 i2 files changed, 50 insertions(+), 5 deletions(-) Err z3bra.org 70 i--- Err z3bra.org 70 1diff --git a/font.c b/font.c /scm/xmenu/file/font.c.gph z3bra.org 70 it@@ -76,7 +76,7 @@ xr_create_canvas(xcb_connection_t *dpy, xcb_drawable_t xid) Err z3bra.org 70 i XCB_RENDER_CP_POLY_MODE | XCB_RENDER_CP_POLY_EDGE, val); Err z3bra.org 70 i Err z3bra.org 70 i return pic; Err z3bra.org 70 i-} Err z3bra.org 70 i+} Err z3bra.org 70 i Err z3bra.org 70 i static xcb_render_picture_t Err z3bra.org 70 i xr_create_pen(xcb_connection_t *dpy, xcb_render_color_t color) Err z3bra.org 70 1diff --git a/xmenu.c b/xmenu.c /scm/xmenu/file/xmenu.c.gph z3bra.org 70 it@@ -16,6 +16,7 @@ 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+int current = -1; 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 it@@ -31,6 +32,31 @@ 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+outline(xcb_drawable_t xid, int x, int y, int w, int h) Err z3bra.org 70 i+{ Err z3bra.org 70 i+ int mask, val[3]; Err z3bra.org 70 i+ xcb_gcontext_t gc; Err z3bra.org 70 i+ xcb_rectangle_t r; Err z3bra.org 70 i+ Err z3bra.org 70 i+ gc = xcb_generate_id(dpy); Err z3bra.org 70 i+ Err z3bra.org 70 i+ mask = XCB_GC_FUNCTION | XCB_GC_LINE_WIDTH | XCB_GC_SUBWINDOW_MODE; Err z3bra.org 70 i+ val[0] = XCB_GX_INVERT; Err z3bra.org 70 i+ val[1] = 0; Err z3bra.org 70 i+ val[2] = XCB_SUBWINDOW_MODE_INCLUDE_INFERIORS; Err z3bra.org 70 i+ xcb_create_gc(dpy, gc, xid, mask, val); Err z3bra.org 70 i+ Err z3bra.org 70 i+ /* draw inverted rectangle */ Err z3bra.org 70 i+ r.x = x; Err z3bra.org 70 i+ r.y = y; Err z3bra.org 70 i+ r.width = w; Err z3bra.org 70 i+ r.height = h; Err z3bra.org 70 i+ xcb_poly_rectangle(dpy, xid, gc, 1, &r); 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 drawentries() Err z3bra.org 70 i { Err z3bra.org 70 i size_t i, w, h; Err z3bra.org 70 it@@ -85,9 +111,11 @@ main(int argc, char *argv[]) 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_LEAVE_WINDOW 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+ | XCB_EVENT_MASK_POINTER_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 it@@ -100,13 +128,12 @@ main(int argc, char *argv[]) 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- 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 int loop = 1; Err z3bra.org 70 i while(loop) { Err z3bra.org 70 i+ int last = current; Err z3bra.org 70 i+ 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 it@@ -114,7 +141,13 @@ main(int argc, char *argv[]) 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+ if (((xcb_key_press_event_t *)ev)->detail == 9) { Err z3bra.org 70 i+ current = -1; Err z3bra.org 70 i+ loop = 0; Err z3bra.org 70 i+ } Err z3bra.org 70 i+ break; Err z3bra.org 70 i+ case XCB_BUTTON_RELEASE: Err z3bra.org 70 i+ if (((xcb_button_release_event_t *)ev)->event == wid) 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 it@@ -124,9 +157,21 @@ main(int argc, char *argv[]) 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+ case XCB_LEAVE_NOTIFY: Err z3bra.org 70 i+ current = -1; Err z3bra.org 70 i+ outline(wid, 0, (height/nent) * last, width, height/nent); Err z3bra.org 70 i+ break; Err z3bra.org 70 i+ case XCB_MOTION_NOTIFY: Err z3bra.org 70 i+ current = nent * (((xcb_motion_notify_event_t *)ev)->event_y * 1.0 / height); Err z3bra.org 70 i+ outline(wid, 0, (height/nent) * last, width, height/nent); Err z3bra.org 70 i+ outline(wid, 0, (height/nent) * current, width, height/nent); 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+ if (current >= 0) Err z3bra.org 70 i+ printf("%s\n", entries[current]); 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 .