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  }