/***********************************************************************
* macdrv_send_text_input_event
*/
-int macdrv_send_text_input_event(int pressed, unsigned int flags, int repeat, int keyc, void* data)
+void macdrv_send_text_input_event(int pressed, unsigned int flags, int repeat, int keyc, void* data, int* done)
{
- __block BOOL ret;
-
- OnMainThread(^{
+ OnMainThreadAsync(^{
+ BOOL ret;
+ macdrv_event* event;
WineWindow* window = (WineWindow*)[NSApp keyWindow];
if (![window isKindOfClass:[WineWindow class]])
{
}
else
ret = FALSE;
- });
- return ret;
+ event = macdrv_create_event(SENT_TEXT_INPUT, window);
+ event->sent_text_input.handled = ret;
+ event->sent_text_input.done = done;
+ [[window queue] postEvent:event];
+ macdrv_release_event(event);
+ });
}
"QUERY_EVENT",
"REASSERT_WINDOW_POSITION",
"RELEASE_CAPTURE",
+ "SENT_TEXT_INPUT",
"STATUS_ITEM_MOUSE_BUTTON",
"STATUS_ITEM_MOUSE_MOVE",
"WINDOW_BROUGHT_FORWARD",
event_mask |= event_mask_for_type(QUERY_EVENT);
event_mask |= event_mask_for_type(REASSERT_WINDOW_POSITION);
event_mask |= event_mask_for_type(RELEASE_CAPTURE);
+ event_mask |= event_mask_for_type(SENT_TEXT_INPUT);
event_mask |= event_mask_for_type(WINDOW_BROUGHT_FORWARD);
event_mask |= event_mask_for_type(WINDOW_CLOSE_REQUESTED);
event_mask |= event_mask_for_type(WINDOW_DRAG_BEGIN);
case RELEASE_CAPTURE:
macdrv_release_capture(hwnd, event);
break;
+ case SENT_TEXT_INPUT:
+ macdrv_sent_text_input(event);
+ break;
case STATUS_ITEM_MOUSE_BUTTON:
macdrv_status_item_mouse_button(event);
break;
LPIMEPRIVATE myPrivate;
HWND hwndDefault;
UINT repeat;
- INT rc;
+ int done = 0;
TRACE("uVKey 0x%04x uScanCode 0x%04x fuState %u hIMC %p\n", uVKey, uScanCode, fuState, hIMC);
UnlockRealIMC(hIMC);
TRACE("Processing Mac 0x%04x\n", vkey);
- rc = macdrv_process_text_input(uVKey, uScanCode, repeat, lpbKeyState, hIMC);
+ macdrv_process_text_input(uVKey, uScanCode, repeat, lpbKeyState, hIMC, &done);
- if (!rc)
+ while (!done)
+ MsgWaitForMultipleObjectsEx(0, NULL, INFINITE, QS_POSTMESSAGE | QS_SENDMESSAGE, 0);
+
+ if (done < 0)
{
UINT msgs = 0;
UINT msg = (uScanCode & 0x8000) ? WM_KEYUP : WM_KEYDOWN;
IME_NotifyComplete(himc);
}
+/***********************************************************************
+ * macdrv_sent_text_input
+ */
+void macdrv_sent_text_input(const macdrv_event *event)
+{
+ TRACE("handled: %s\n", event->sent_text_input.handled ? "TRUE" : "FALSE");
+ *event->sent_text_input.done = event->sent_text_input.handled ? 1 : -1;
+}
+
/**************************************************************************
* query_ime_char_rect
/***********************************************************************
* macdrv_process_text_input
*/
-BOOL macdrv_process_text_input(UINT vkey, UINT scan, UINT repeat, const BYTE *key_state, void *himc)
+void macdrv_process_text_input(UINT vkey, UINT scan, UINT repeat, const BYTE *key_state, void *himc, int* done)
{
struct macdrv_thread_data *thread_data = macdrv_thread_data();
unsigned int flags;
int keyc;
- BOOL ret = FALSE;
TRACE("vkey 0x%04x scan 0x%04x repeat %u himc %p\n", vkey, scan, repeat, himc);
if (thread_data->keyc2vkey[keyc] == vkey) break;
if (keyc >= sizeof(thread_data->keyc2vkey)/sizeof(thread_data->keyc2vkey[0]))
- goto done;
+ return;
TRACE("flags 0x%08x keyc 0x%04x\n", flags, keyc);
- ret = macdrv_send_text_input_event(((scan & 0x8000) == 0), flags, repeat, keyc, himc);
-
-done:
- TRACE(" -> %s\n", ret ? "TRUE" : "FALSE");
- return ret;
+ macdrv_send_text_input_event(((scan & 0x8000) == 0), flags, repeat, keyc, himc, done);
}
* Mac IME driver
*/
-extern BOOL macdrv_process_text_input(UINT vkey, UINT scan, UINT repeat, const BYTE *key_state,
- void *himc) DECLSPEC_HIDDEN;
+extern void macdrv_process_text_input(UINT vkey, UINT scan, UINT repeat, const BYTE *key_state,
+ void *himc, int* done) DECLSPEC_HIDDEN;
extern void macdrv_im_set_text(const macdrv_event *event) DECLSPEC_HIDDEN;
+extern void macdrv_sent_text_input(const macdrv_event *event) DECLSPEC_HIDDEN;
extern BOOL query_ime_char_rect(macdrv_query* query) DECLSPEC_HIDDEN;
#endif /* __WINE_MACDRV_H */
QUERY_EVENT,
REASSERT_WINDOW_POSITION,
RELEASE_CAPTURE,
+ SENT_TEXT_INPUT,
STATUS_ITEM_MOUSE_BUTTON,
STATUS_ITEM_MOUSE_MOVE,
WINDOW_BROUGHT_FORWARD,
struct {
struct macdrv_query *query;
} query_event;
+ struct {
+ int handled;
+ int *done;
+ } sent_text_input;
struct {
macdrv_status_item item;
int button;
extern void macdrv_add_view_opengl_context(macdrv_view v, macdrv_opengl_context c) DECLSPEC_HIDDEN;
extern void macdrv_remove_view_opengl_context(macdrv_view v, macdrv_opengl_context c) DECLSPEC_HIDDEN;
extern uint32_t macdrv_window_background_color(void) DECLSPEC_HIDDEN;
-extern int macdrv_send_text_input_event(int pressed, unsigned int flags, int repeat, int keyc,
- void* data) DECLSPEC_HIDDEN;
+extern void macdrv_send_text_input_event(int pressed, unsigned int flags, int repeat, int keyc,
+ void* data, int* done) DECLSPEC_HIDDEN;
/* keyboard */