Skip to content

Commit bc631c2

Browse files
iacoreDemiMarie
andauthored
Apply suggestions from code review
FIxes: QubesOS/qubes-issues#7396 Co-authored-by: Demi Marie Obenour <[email protected]>
1 parent 3c94f90 commit bc631c2

File tree

1 file changed

+8
-51
lines changed

1 file changed

+8
-51
lines changed

gui-daemon/xside.c

Lines changed: 8 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -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 */
23772336
static 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

Comments
 (0)