tCreate a window on screen - xmenu - drop-down menu for X11
 (HTM) git clone git://git.z3bra.org/xmenu.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
 (DIR) commit 7ee5c0bf82d7491c1f62d381fcde373ec154d066
 (DIR) parent 6aa884a39d72c6c64ccb4efdf2417c90df0fef72
 (HTM) Author: Willy Goiffon <dev@z3bra.org>
       Date:   Fri,  8 Nov 2019 22:11:42 +0100
       
       Create a window on screen
       
       Diffstat:
         M config.def.h                        |       7 +++++++
         M xmenu.c                             |      40 +++++++++++++++++++++++++++++++
       
       2 files changed, 47 insertions(+), 0 deletions(-)
       ---
 (DIR) diff --git a/config.def.h b/config.def.h
       t@@ -0,0 +1,7 @@
       +/* widget size */
       +int width = 320;
       +int height = 480;
       +
       +/* widget colors, given as RGB hex values */
       +uint32_t background = 0x666666;
       +uint32_t foreground = 0xffffff;
 (DIR) diff --git a/xmenu.c b/xmenu.c
       t@@ -1,11 +1,18 @@
        #include <stdio.h>
       +#include <stdint.h>
        #include <stdlib.h>
       +#include <unistd.h>
        
        #include <xcb/xcb.h>
        
        #include "arg.h"
        #include "config.h"
        
       +int verbose = 0;
       +xcb_connection_t *dpy;
       +xcb_screen_t *screen;
       +xcb_window_t wid;
       +
        void
        usage(FILE *fd, char *name)
        {
       t@@ -15,17 +22,50 @@ usage(FILE *fd, char *name)
        int
        main(int argc, char *argv[])
        {
       +        int mask, val[4];
                char *argv0;
       +
                ARGBEGIN {
                case 'h':
                        usage(stdout, argv0);
                        return 0;
                        break;
       +        case 'v':
       +                verbose++;
       +                break;
                default:
                        usage(stderr, argv0);
                        return -1;
                        break;
                } ARGEND;
        
       +        dpy = xcb_connect(NULL, NULL);
       +        if (xcb_connection_has_error(dpy))
       +                return -1;
       +
       +        screen = xcb_setup_roots_iterator(xcb_get_setup(dpy)).data;
       +        if (!screen)
       +                return -1;
       +
       +        mask = XCB_CW_BACK_PIXEL
       +                | XCB_CW_EVENT_MASK;
       +
       +        val[0] = background;
       +        val[1] = XCB_EVENT_MASK_EXPOSURE
       +                | XCB_EVENT_MASK_BUTTON_PRESS
       +                | XCB_EVENT_MASK_BUTTON_RELEASE
       +                | XCB_EVENT_MASK_BUTTON_MOTION;
       +
       +        wid = xcb_generate_id(dpy);
       +        xcb_create_window(dpy, screen->root_depth, wid, screen->root,
       +                0, 0, width, height, 0, XCB_WINDOW_CLASS_INPUT_OUTPUT,
       +                screen->root_visual, mask, val);
       +
       +        xcb_map_window(dpy, wid);
       +        xcb_flush(dpy);
       +
       +        sleep(50);
       +
       +        xcb_disconnect(dpy);
                return 0;
        }