@@ -385,7 +385,10 @@ static Window mkwindow(Ghandles * g, struct windowdata *vm_window)
385385 XIEventMask xi_mask ;
386386 xi_mask .deviceid = XIAllMasterDevices ; // https://stackoverflow.com/questions/44095001/getting-double-rawkeypress-events-using-xinput2
387387 xi_mask .mask_len = XIMaskLen (XI_LASTEVENT );
388- xi_mask .mask = calloc (xi_mask .mask_len , sizeof (char ));
388+ if (!(xi_mask .mask = calloc (xi_mask .mask_len , sizeof (char )))) {
389+ fputs ("Out of memory!\n" , stderr );
390+ exit (1 );
391+ }
389392 XISetMask (xi_mask .mask , XI_KeyPress );
390393 XISetMask (xi_mask .mask , XI_KeyRelease );
391394 XISetMask (xi_mask .mask , XI_FocusIn );
@@ -666,6 +669,7 @@ static void mkghandles(Ghandles * g)
666669 fprintf (stderr , "MIT-SHM X extension missing!\n" );
667670 if (!XQueryExtension (g -> display , "XInputExtension" , & g -> xi_opcode , & ev_base , & err_base )) {
668671 fprintf (stderr , "X Input extension not available. Key press events not available. Upgrade your X11 server now.\n" );
672+ exit (1 );
669673 }
670674 /* get the work area */
671675 XSelectInput (g -> display , g -> root_win , PropertyChangeMask );
@@ -1357,7 +1361,10 @@ static void process_xievent_keypress(Ghandles * g, const XIDeviceEvent * ev)
13571361 struct msg_hdr hdr ;
13581362 struct msg_keypress k ;
13591363 CHECK_NONMANAGED_WINDOW (g , ev -> event );
1364+ // yes, ev->event is the window number
13601365 update_wm_user_time (g , ev -> event , ev -> time );
1366+ if (ev -> flags & XIKeyRepeat )
1367+ return ; // don't send key repeat events
13611368 if (is_special_keypress (g , ev , vm_window -> remote_winid ))
13621369 return ;
13631370 k .type = ev -> evtype ; // ev->type is always Generic Event
@@ -2325,54 +2332,6 @@ static void process_xevent_xembed(Ghandles * g, const XClientMessageEvent * ev)
23252332
23262333}
23272334
2328- // reference code for handling xi2 events
2329- // static void process_xievent(Ghandles * g, XIDeviceEvent event) {
2330- // switch (event.evtype)
2331- // {
2332- // case XI_RawButtonPress:
2333- // case XI_RawButtonRelease:
2334- // case XI_RawMotion:
2335- // case XI_RawKeyPress:
2336- // case XI_RawKeyRelease:
2337- // break;
2338- // case XI_KeyPress:
2339- // case XI_KeyRelease:
2340- // printf(" flags: %s\n", (event->flags & XIKeyRepeat) ? "repeat" : "");
2341- // // TODO: handle events
2342- // break;
2343- // case XI_ButtonPress:
2344- // case XI_ButtonRelease:
2345- // case XI_Motion:
2346- // printf(" flags: %s\n", (event->flags & XIPointerEmulated) ? "emulated" : "");
2347- // // TODO: handle events
2348- // break;
2349- // }
2350- // }
2351-
2352- // static XKeyEvent xkeyevent_from_xinput_event(const XIDeviceEvent* xi_event) {
2353- // XKeyEvent fake_event;
2354- // switch (xi_event->evtype) {
2355- // case XI_KeyPress: fake_event.type = KeyPress; break;
2356- // case XI_KeyRelease: fake_event.type = KeyRelease; break;
2357- // default: assert(false); // stop immediately
2358- // }
2359- // fake_event.serial = xi_event->serial;
2360- // fake_event.send_event = false;
2361- // fake_event.display = xi_event->display;
2362- // fake_event.window = xi_event->event;
2363- // fake_event.root = xi_event->root;
2364- // fake_event.subwindow = xi_event->child; // from Manual page XKeyEvent(3)
2365- // fake_event.time = xi_event->time;
2366- // fake_event.x = xi_event->event_x;
2367- // fake_event.y = xi_event->event_y;
2368- // fake_event.x_root = xi_event->root_x;
2369- // fake_event.y_root = xi_event->root_y;
2370- // fake_event.state = xi_event->mods.effective;
2371- // fake_event.keycode = xi_event->detail;
2372- // fake_event.same_screen = true; // don't know how to fill this
2373- // return fake_event;
2374- // }
2375-
23762335/* dispatch local Xserver event */
23772336static void process_xevent (Ghandles * g )
23782337{
@@ -2384,12 +2343,10 @@ static void process_xevent(Ghandles * g)
23842343 cookie -> extension == g -> xi_opcode ) {
23852344 XIEvent * xi_event = cookie -> data ; // from test_xi2.c in xinput cli utility
23862345
2387- XIDeviceEvent * xi_device = (XIDeviceEvent * )xi_event ;
23882346 switch (xi_event -> evtype ) {
23892347 // ideally raw input events are better, but I'm relying on X server's built-in event filtering and routing feature here
23902348 case XI_KeyPress :
23912349 case XI_KeyRelease :
2392- if (xi_device && (xi_device -> flags & XIKeyRepeat )) break ; // don't send key repeat events
23932350 process_xievent_keypress (g , xi_device );
23942351 break ;
23952352 case XI_FocusIn :
0 commit comments