modernc.org/xcb@v1.0.15/examples/eventex/eventex.c (about) 1 // +build ignore 2 3 // src: https://www.x.org/releases/current/doc/libxcb/tutorial/index.html#eventex 4 5 #include <stdlib.h> 6 #include <stdio.h> 7 8 #include <xcb/xcb.h> 9 10 void 11 print_modifiers (uint32_t mask) 12 { 13 const char **mod, *mods[] = { 14 "Shift", "Lock", "Ctrl", "Alt", 15 "Mod2", "Mod3", "Mod4", "Mod5", 16 "Button1", "Button2", "Button3", "Button4", "Button5" 17 }; 18 printf ("Modifier mask: "); 19 for (mod = mods ; mask; mask >>= 1, mod++) 20 if (mask & 1) 21 printf(*mod); 22 putchar ('\n'); 23 } 24 25 int 26 main () 27 { 28 xcb_connection_t *c; 29 xcb_screen_t *screen; 30 xcb_window_t win; 31 xcb_generic_event_t *e; 32 uint32_t mask = 0; 33 uint32_t values[2]; 34 35 /* Open the connection to the X server */ 36 c = xcb_connect (NULL, NULL); 37 38 /* Get the first screen */ 39 screen = xcb_setup_roots_iterator (xcb_get_setup (c)).data; 40 41 /* Ask for our window's Id */ 42 win = xcb_generate_id (c); 43 44 /* Create the window */ 45 mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK; 46 values[0] = screen->white_pixel; 47 values[1] = XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_BUTTON_PRESS | 48 XCB_EVENT_MASK_BUTTON_RELEASE | XCB_EVENT_MASK_POINTER_MOTION | 49 XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_LEAVE_WINDOW | 50 XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_KEY_RELEASE; 51 xcb_create_window (c, /* Connection */ 52 0, /* depth */ 53 win, /* window Id */ 54 screen->root, /* parent window */ 55 0, 0, /* x, y */ 56 150, 150, /* width, height */ 57 10, /* border_width */ 58 XCB_WINDOW_CLASS_INPUT_OUTPUT, /* class */ 59 screen->root_visual, /* visual */ 60 mask, values); /* masks */ 61 62 /* Map the window on the screen */ 63 xcb_map_window (c, win); 64 65 xcb_flush (c); 66 67 while ((e = xcb_wait_for_event (c))) { 68 switch (e->response_type & ~0x80) { 69 case XCB_EXPOSE: { 70 xcb_expose_event_t *ev = (xcb_expose_event_t *)e; 71 72 printf ("Window %ld exposed. Region to be redrawn at location (%d,%d), with dimension (%d,%d)\n", 73 ev->window, ev->x, ev->y, ev->width, ev->height); 74 break; 75 } 76 case XCB_BUTTON_PRESS: { 77 xcb_button_press_event_t *ev = (xcb_button_press_event_t *)e; 78 print_modifiers(ev->state); 79 80 switch (ev->detail) { 81 case 4: 82 printf ("Wheel Button up in window %ld, at coordinates (%d,%d)\n", 83 ev->event, ev->event_x, ev->event_y); 84 break; 85 case 5: 86 printf ("Wheel Button down in window %ld, at coordinates (%d,%d)\n", 87 ev->event, ev->event_x, ev->event_y); 88 break; 89 default: 90 printf ("Button %d pressed in window %ld, at coordinates (%d,%d)\n", 91 ev->detail, ev->event, ev->event_x, ev->event_y); 92 } 93 break; 94 } 95 case XCB_BUTTON_RELEASE: { 96 xcb_button_release_event_t *ev = (xcb_button_release_event_t *)e; 97 print_modifiers(ev->state); 98 99 printf ("Button %d released in window %ld, at coordinates (%d,%d)\n", 100 ev->detail, ev->event, ev->event_x, ev->event_y); 101 break; 102 } 103 case XCB_MOTION_NOTIFY: { 104 xcb_motion_notify_event_t *ev = (xcb_motion_notify_event_t *)e; 105 106 printf ("Mouse moved in window %ld, at coordinates (%d,%d)\n", 107 ev->event, ev->event_x, ev->event_y); 108 break; 109 } 110 case XCB_ENTER_NOTIFY: { 111 xcb_enter_notify_event_t *ev = (xcb_enter_notify_event_t *)e; 112 113 printf ("Mouse entered window %ld, at coordinates (%d,%d)\n", 114 ev->event, ev->event_x, ev->event_y); 115 break; 116 } 117 case XCB_LEAVE_NOTIFY: { 118 xcb_leave_notify_event_t *ev = (xcb_leave_notify_event_t *)e; 119 120 printf ("Mouse left window %ld, at coordinates (%d,%d)\n", 121 ev->event, ev->event_x, ev->event_y); 122 break; 123 } 124 case XCB_KEY_PRESS: { 125 xcb_key_press_event_t *ev = (xcb_key_press_event_t *)e; 126 print_modifiers(ev->state); 127 128 printf ("Key pressed in window %ld\n", 129 ev->event); 130 break; 131 } 132 case XCB_KEY_RELEASE: { 133 xcb_key_release_event_t *ev = (xcb_key_release_event_t *)e; 134 print_modifiers(ev->state); 135 136 printf ("Key released in window %ld\n", 137 ev->event); 138 break; 139 } 140 default: 141 /* Unknown event type, ignore it */ 142 printf("Unknown event: %d\n", e->response_type); 143 break; 144 } 145 /* Free the Generic Event */ 146 free (e); 147 } 148 149 return 0; 150 }