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