From c737d04c758e03e32f692a31ed2a665ccbafa931 Mon Sep 17 00:00:00 2001 From: Ben Byer Date: Tue, 1 Apr 2008 00:40:46 -0700 Subject: [PATCH] The AppKit thread should not be calling directly into the X server functions to change state when the keyboard is reloaded; instead, pass it as an event. (cherry picked from commit 7e653f806ff5508aace059312156f319a9ed4479) --- hw/xquartz/darwin.h | 7 +------ hw/xquartz/darwinEvents.c | 7 ++++--- hw/xquartz/darwinKeyboard.c | 12 +++++++----- hw/xquartz/darwinKeyboard.h | 2 +- hw/xquartz/quartzKeyboard.h | 1 - 5 files changed, 13 insertions(+), 16 deletions(-) diff --git a/hw/xquartz/darwin.h b/hw/xquartz/darwin.h index 01e6f41f2..df92d8b49 100644 --- a/hw/xquartz/darwin.h +++ b/hw/xquartz/darwin.h @@ -91,13 +91,8 @@ extern int darwinMainScreenY; * Special ddx events understood by the X server */ enum { - kXquartzUpdateModifiers // update all modifier keys + kXquartzReloadKeymap // Reload system keymap = LASTEvent+1, // (from X.h list of event names) - kXquartzUpdateButtons, // update state of mouse buttons 2 and up - kXquartzScrollWheel, // scroll wheel event - /* - * Quartz-specific events -- not used in IOKit mode - */ kXquartzActivate, // restore X drawing and cursor kXquartzDeactivate, // clip X drawing and switch to Aqua cursor kXquartzSetRootClip, // enable or disable drawing to the X screen diff --git a/hw/xquartz/darwinEvents.c b/hw/xquartz/darwinEvents.c index b6cd3f2b0..3afbaf890 100644 --- a/hw/xquartz/darwinEvents.c +++ b/hw/xquartz/darwinEvents.c @@ -289,6 +289,7 @@ Bool DarwinEQInit(DevicePtr pKbd, DevicePtr pPtr) { FatalError("Couldn't allocate event buffer\n"); mieqInit(); + mieqSetHandler(kXquartzReloadKeymap, DarwinKeyboardReloadHandler); mieqSetHandler(kXquartzActivate, DarwinEventHandler); mieqSetHandler(kXquartzDeactivate, DarwinEventHandler); mieqSetHandler(kXquartzSetRootClip, DarwinEventHandler); @@ -322,7 +323,7 @@ void ProcessInputEvents(void) { // Empty the signaling pipe int x = sizeof(xe); while (x == sizeof(xe)) { - DEBUG_LOG("draining pipe\n"); +// DEBUG_LOG("draining pipe\n"); x = read(darwinEventReadFD, &xe, sizeof(xe)); } } @@ -412,8 +413,8 @@ void DarwinSendKeyboardEvents(int ev_type, int keycode) { this_seed = QuartzSystemKeymapSeed(); if (this_seed != last_seed) { - last_seed = this_seed; - DarwinKeyboardReload(darwinKeyboard); + last_seed = this_seed; + DarwinSendDDXEvent(kXquartzReloadKeymap, 0); } } diff --git a/hw/xquartz/darwinKeyboard.c b/hw/xquartz/darwinKeyboard.c index 355d9f066..6f2758e53 100644 --- a/hw/xquartz/darwinKeyboard.c +++ b/hw/xquartz/darwinKeyboard.c @@ -850,16 +850,18 @@ static Bool InitModMap(register KeyClassPtr keyc) { } -void DarwinKeyboardReload(DeviceIntPtr pDev) { +void DarwinKeyboardReloadHandler(int screenNum, xEventPtr xe, DeviceIntPtr dev, int nevents) { KeySymsRec keySyms; - + if (dev == NULL) dev = darwinKeyboard; + + DEBUG_LOG("DarwinKeyboardReloadHandler(%p)\n", dev); DarwinLoadKeyboardMapping(&keySyms); - if (SetKeySymsMap(&pDev->key->curKeySyms, &keySyms)) { + if (SetKeySymsMap(&dev->key->curKeySyms, &keySyms)) { /* now try to update modifiers. */ - memmove(pDev->key->modifierMap, keyInfo.modMap, MAP_LENGTH); - InitModMap(pDev->key); + memmove(dev->key->modifierMap, keyInfo.modMap, MAP_LENGTH); + InitModMap(dev->key); } else DEBUG_LOG("SetKeySymsMap=0\n"); SendMappingNotify(MappingKeyboard, MIN_KEYCODE, NUM_KEYCODES, 0); diff --git a/hw/xquartz/darwinKeyboard.h b/hw/xquartz/darwinKeyboard.h index 5cf64c7d1..762f65919 100644 --- a/hw/xquartz/darwinKeyboard.h +++ b/hw/xquartz/darwinKeyboard.h @@ -31,7 +31,7 @@ /* Provided for darwinEvents.c */ extern darwinKeyboardInfo keyInfo; -void DarwinKeyboardReload(DeviceIntPtr pDev); +void DarwinKeyboardReloadHandler(int screenNum, xEventPtr xe, DeviceIntPtr dev, int nevents); void DarwinKeyboardInit(DeviceIntPtr pDev); int DarwinModifierNXKeycodeToNXKey(unsigned char keycode, int *outSide); int DarwinModifierNXKeyToNXKeycode(int key, int side); diff --git a/hw/xquartz/quartzKeyboard.h b/hw/xquartz/quartzKeyboard.h index 8131b5650..4f495bb46 100644 --- a/hw/xquartz/quartzKeyboard.h +++ b/hw/xquartz/quartzKeyboard.h @@ -46,7 +46,6 @@ typedef struct darwinKeyboardInfo_struct { } darwinKeyboardInfo; /* These functions need to be implemented by Xquartz, XDarwin, etc. */ -void DarwinKeyboardReload(DeviceIntPtr pDev); Bool QuartzReadSystemKeymap(darwinKeyboardInfo *info); unsigned int QuartzSystemKeymapSeed(void);