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  }