Ken Thomases : winemac: Implement MsgWaitForMultipleObjectsEx and infrastructure for processing events .
Alexandre Julliard
julliard at winehq.org
Mon Jan 21 13:52:23 CST 2013
Module: wine
Branch: master
Commit: 4e83d2fca0861906f40eae8c4ed7afe8513833a2
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4e83d2fca0861906f40eae8c4ed7afe8513833a2
Author: Ken Thomases <ken at codeweavers.com>
Date: Mon Jan 21 00:08:08 2013 -0600
winemac: Implement MsgWaitForMultipleObjectsEx and infrastructure for processing events.
---
dlls/winemac.drv/Makefile.in | 1 +
dlls/winemac.drv/event.c | 125 +++++++++++++++++++++++++++++++++++++
dlls/winemac.drv/macdrv.h | 1 +
dlls/winemac.drv/winemac.drv.spec | 1 +
4 files changed, 128 insertions(+), 0 deletions(-)
diff --git a/dlls/winemac.drv/Makefile.in b/dlls/winemac.drv/Makefile.in
index 0dfcbc4..1de19ef 100644
--- a/dlls/winemac.drv/Makefile.in
+++ b/dlls/winemac.drv/Makefile.in
@@ -4,6 +4,7 @@ EXTRALIBS = -framework AppKit
C_SRCS = \
display.c \
+ event.c \
gdi.c \
macdrv_main.c \
surface.c \
diff --git a/dlls/winemac.drv/event.c b/dlls/winemac.drv/event.c
new file mode 100644
index 0000000..fcef550
--- /dev/null
+++ b/dlls/winemac.drv/event.c
@@ -0,0 +1,125 @@
+/*
+ * MACDRV event driver
+ *
+ * Copyright 1993 Alexandre Julliard
+ * 1999 Noel Borthwick
+ * Copyright 2011, 2012, 2013 Ken Thomases for CodeWeavers Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "config.h"
+
+#include "macdrv.h"
+#include "winuser.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(event);
+
+
+/* return the name of an Mac event */
+static const char *dbgstr_event(int type)
+{
+ return wine_dbg_sprintf("Unknown event %d", type);
+}
+
+
+/***********************************************************************
+ * get_event_mask
+ */
+static macdrv_event_mask get_event_mask(DWORD mask)
+{
+ if ((mask & QS_ALLINPUT) == QS_ALLINPUT) return -1;
+ return 0;
+}
+
+
+/***********************************************************************
+ * macdrv_handle_event
+ */
+void macdrv_handle_event(macdrv_event *event)
+{
+ HWND hwnd = macdrv_get_window_hwnd(event->window);
+ const macdrv_event *prev;
+ struct macdrv_thread_data *thread_data = macdrv_thread_data();
+
+ TRACE("%s for hwnd/window %p/%p\n", dbgstr_event(event->type), hwnd,
+ event->window);
+
+ prev = thread_data->current_event;
+ thread_data->current_event = event;
+
+ switch (event->type)
+ {
+ default:
+ TRACE(" ignoring\n");
+ break;
+ }
+
+ thread_data->current_event = prev;
+}
+
+
+/***********************************************************************
+ * process_events
+ */
+static int process_events(macdrv_event_queue queue, macdrv_event_mask mask)
+{
+ macdrv_event event;
+ int count = 0;
+
+ while (macdrv_get_event_from_queue(queue, mask, &event))
+ {
+ count++;
+ macdrv_handle_event(&event);
+ macdrv_cleanup_event(&event);
+ }
+ if (count) TRACE("processed %d events\n", count);
+ return count;
+}
+
+
+/***********************************************************************
+ * MsgWaitForMultipleObjectsEx (MACDRV.@)
+ */
+DWORD CDECL macdrv_MsgWaitForMultipleObjectsEx(DWORD count, const HANDLE *handles,
+ DWORD timeout, DWORD mask, DWORD flags)
+{
+ DWORD ret;
+ struct macdrv_thread_data *data = macdrv_thread_data();
+ macdrv_event_mask event_mask = get_event_mask(mask);
+
+ TRACE("count %d, handles %p, timeout %u, mask %x, flags %x\n", count,
+ handles, timeout, mask, flags);
+
+ if (!data)
+ {
+ if (!count && !timeout) return WAIT_TIMEOUT;
+ return WaitForMultipleObjectsEx(count, handles, flags & MWMO_WAITALL,
+ timeout, flags & MWMO_ALERTABLE);
+ }
+
+ if (data->current_event) event_mask = 0; /* don't process nested events */
+
+ if (process_events(data->queue, event_mask)) ret = count - 1;
+ else if (count || timeout)
+ {
+ ret = WaitForMultipleObjectsEx(count, handles, flags & MWMO_WAITALL,
+ timeout, flags & MWMO_ALERTABLE);
+ if (ret == count - 1) process_events(data->queue, event_mask);
+ }
+ else ret = WAIT_TIMEOUT;
+
+ return ret;
+}
diff --git a/dlls/winemac.drv/macdrv.h b/dlls/winemac.drv/macdrv.h
index dee2fd8..7fe4109 100644
--- a/dlls/winemac.drv/macdrv.h
+++ b/dlls/winemac.drv/macdrv.h
@@ -83,6 +83,7 @@ enum macdrv_window_messages
struct macdrv_thread_data
{
macdrv_event_queue queue;
+ const macdrv_event *current_event;
};
extern DWORD thread_data_tls_index DECLSPEC_HIDDEN;
diff --git a/dlls/winemac.drv/winemac.drv.spec b/dlls/winemac.drv/winemac.drv.spec
index 53b9785..f2ffffc 100644
--- a/dlls/winemac.drv/winemac.drv.spec
+++ b/dlls/winemac.drv/winemac.drv.spec
@@ -9,6 +9,7 @@
@ cdecl DestroyWindow(long) macdrv_DestroyWindow
@ cdecl EnumDisplayMonitors(long ptr ptr long) macdrv_EnumDisplayMonitors
@ cdecl GetMonitorInfo(long ptr) macdrv_GetMonitorInfo
+@ cdecl MsgWaitForMultipleObjectsEx(long ptr long long long) macdrv_MsgWaitForMultipleObjectsEx
@ cdecl SetLayeredWindowAttributes(long long long long) macdrv_SetLayeredWindowAttributes
@ cdecl SetParent(long long long) macdrv_SetParent
@ cdecl SetWindowRgn(long long long) macdrv_SetWindowRgn
More information about the wine-cvs
mailing list