if (!is_altgr_key)
{
if (GetKeyState (VK_CONTROL) < 0)
- {
- event->key.state |= GDK_CONTROL_MASK;
-#if 0
- if (event->key.keyval < ' ')
- event->key.keyval += '@';
-#endif
- }
-#if 0
- else if (event->key.keyval < ' ')
- {
- event->key.state |= GDK_CONTROL_MASK;
- event->key.keyval += '@';
- }
-#endif
+ event->key.state |= GDK_CONTROL_MASK;
if (GetKeyState (VK_MENU) < 0)
event->key.state |= GDK_MOD1_MASK;
}
return state;
}
+static guint
+vk_from_char (guint c)
+{
+ switch (c)
+ {
+ case '\b':
+ return 'H';
+ case '\t':
+ return 'I';
+ default:
+ return (VkKeyScanEx (c, _gdk_input_locale) & 0xFF);
+ }
+}
+
static void
-build_keypress_event (GdkWindowImplWin32 *impl,
- GdkEvent *event,
- MSG *msg)
+build_keypress_event (GdkEvent *event,
+ MSG *msg)
{
HIMC himc;
gint i, bytecount, ucount;
if (msg->message == WM_IME_COMPOSITION)
{
himc = ImmGetContext (msg->hwnd);
-
bytecount = ImmGetCompositionStringW (himc, GCS_RESULTSTR,
wbuf, sizeof (wbuf));
+ ImmReleaseContext (msg->hwnd, himc);
+
ucount = bytecount / 2;
event->key.hardware_keycode = wbuf[0]; /* ??? */
}
else
{
- event->key.hardware_keycode = msg->wParam;
if (msg->message == WM_CHAR || msg->message == WM_SYSCHAR)
{
bytecount = MIN ((msg->lParam & 0xFFFF), sizeof (buf));
for (i = 0; i < bytecount; i++)
buf[i] = msg->wParam;
+ event->key.hardware_keycode = vk_from_char (msg->wParam);
}
else /* WM_IME_CHAR */
{
event->key.keyval = GDK_VoidSymbol;
+ event->key.hardware_keycode = 0; /* ??? */
if (msg->wParam & 0xFF00)
{
/* Contrary to some versions of the documentation,
}
static void
-build_keyrelease_event (GdkWindowImplWin32 *impl,
- GdkEvent *event,
- MSG *msg)
+build_keyrelease_event (GdkEvent *event,
+ MSG *msg)
{
guchar buf;
wchar_t wbuf;
if (msg->message == WM_CHAR || msg->message == WM_SYSCHAR)
{
- event->key.hardware_keycode = msg->wParam;
if (msg->wParam < ' ')
event->key.keyval = msg->wParam + '@';
else
event->key.keyval = gdk_unicode_to_keyval (wbuf);
}
+ event->key.hardware_keycode = vk_from_char (msg->wParam);
}
else
{
{
POINT pt;
- if (!(GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl)->event_mask & GDK_LEAVE_NOTIFY_MASK))
+ if (!(GDK_WINDOW_OBJECT (window)->event_mask & GDK_LEAVE_NOTIFY_MASK))
return;
/* Leave events are at (current_x,current_y) in current_window */
{
POINT pt;
- if (!(GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl)->event_mask & GDK_ENTER_NOTIFY_MASK))
+ if (!(GDK_WINDOW_OBJECT (window)->event_mask & GDK_ENTER_NOTIFY_MASK))
return;
/* Enter events are at LOWORD (msg->lParam), HIWORD
}
while (TRUE)
{
- if ((*doesnt_want_it) (GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (*window)->impl)->event_mask, msg))
+ if ((*doesnt_want_it) (GDK_WINDOW_OBJECT (*window)->event_mask, msg))
{
/* Owner doesn't want it, propagate to parent. */
if (GDK_WINDOW (GDK_WINDOW_OBJECT (*window)->parent) == _gdk_parent_root)
CHARSETINFO charset_info;
/* Invariant:
- * window_impl == GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl)
+ * private == GDK_WINDOW_OBJECT (window)
*/
GdkWindow *window;
- GdkWindowImplWin32 *window_impl;
+ GdkWindowObject *private;
+
#define ASSIGN_WINDOW(rhs) \
(window = rhs, \
- window_impl = (window ? GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl) : NULL))
+ private = (GdkWindowObject *) window)
+
+ GdkWindowImplWin32 *impl;
GdkWindow *orig_window, *new_window;
gint xoffset, yoffset;
return_val = !GDK_WINDOW_DESTROYED (window);
if (return_val && (event->key.window == k_grab_window
- || (window_impl->event_mask & GDK_KEY_RELEASE_MASK)))
+ || (private->event_mask & GDK_KEY_RELEASE_MASK)))
{
if (window == k_grab_window
- || (window_impl->event_mask & GDK_KEY_PRESS_MASK))
+ || (private->event_mask & GDK_KEY_PRESS_MASK))
{
/* Append a GDK_KEY_PRESS event to the pushback list
* (from which it will be fetched before the release
* event).
*/
GdkEvent *event2 = _gdk_event_new ();
- build_keypress_event (window_impl, event2, msg);
+ build_keypress_event (event2, msg);
event2->key.window = window;
gdk_drawable_ref (window);
_gdk_event_queue_append (event2);
GDK_NOTE (EVENTS, print_event (event2));
}
/* Return the key release event. */
- build_keyrelease_event (window_impl, event, msg);
+ build_keyrelease_event (event, msg);
}
- else if (return_val && (window_impl->event_mask & GDK_KEY_PRESS_MASK))
+ else if (return_val && (private->event_mask & GDK_KEY_PRESS_MASK))
{
/* Return just the key press event. */
- build_keypress_event (window_impl, event, msg);
+ build_keypress_event (event, msg);
}
else
return_val = FALSE;
if (!p_grab_window)
{
/* No explicit active grab, let's start one automatically */
- gint owner_events = window_impl->event_mask
- & (GDK_BUTTON_PRESS_MASK|GDK_BUTTON_RELEASE_MASK);
+ gint owner_events = (private->event_mask & (GDK_BUTTON_PRESS_MASK|GDK_BUTTON_RELEASE_MASK));
GDK_NOTE (EVENTS, g_print ("...automatic grab started\n"));
gdk_pointer_grab (window,
owner_events,
- window_impl->event_mask,
+ private->event_mask,
NULL, NULL, 0);
p_grab_automatic = TRUE;
}
LOWORD (msg->lParam), HIWORD (msg->lParam)));
if (track_mouse_event == NULL
&& current_window != NULL
- && (GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (current_window)->impl)->event_mask & GDK_LEAVE_NOTIFY_MASK))
+ && (GDK_WINDOW_OBJECT (current_window)->event_mask & GDK_LEAVE_NOTIFY_MASK))
{
GDK_NOTE (EVENTS, g_print ("...synthesizing LEAVE_NOTIFY event\n"));
case WM_MOUSELEAVE:
GDK_NOTE (EVENTS, g_print ("WM_MOUSELEAVE: %p\n", msg->hwnd));
- if (!(window_impl->event_mask & GDK_LEAVE_NOTIFY_MASK))
+ if (!(private->event_mask & GDK_LEAVE_NOTIFY_MASK))
break;
event->crossing.type = GDK_LEAVE_NOTIFY;
"SET" : "KILL"),
msg->hwnd));
- if (!(window_impl->event_mask & GDK_FOCUS_CHANGE_MASK))
+ if (!(private->event_mask & GDK_FOCUS_CHANGE_MASK))
break;
event->focus_change.type = GDK_FOCUS_CHANGE;
if (GDK_WINDOW_OBJECT (window)->input_only)
break;
- if (!(window_impl->event_mask & GDK_EXPOSURE_MASK))
+ if (!(private->event_mask & GDK_EXPOSURE_MASK))
break;
#if 0 /* we need to process exposes even with GDK_NO_BG
if (p_grab_window != NULL && p_grab_cursor != NULL)
hcursor = p_grab_cursor;
else if (!GDK_WINDOW_DESTROYED (window))
- hcursor = window_impl->hcursor;
+ hcursor = GDK_WINDOW_IMPL_WIN32 (private->impl)->hcursor;
else
hcursor = NULL;
GDK_NOTE (EVENTS, g_print ("WM_SHOWWINDOW: %p %d\n",
msg->hwnd, msg->wParam));
- if (!(window_impl->event_mask & GDK_STRUCTURE_MASK))
+ if (!(private->event_mask & GDK_STRUCTURE_MASK))
break;
event->any.type = (msg->wParam ? GDK_MAP : GDK_UNMAP);
(msg->wParam == SIZE_RESTORED ? "RESTORED" : "?"))))),
LOWORD (msg->lParam), HIWORD (msg->lParam)));
- if (!(window_impl->event_mask & GDK_STRUCTURE_MASK))
+ if (!(private->event_mask & GDK_STRUCTURE_MASK))
break;
if (msg->wParam == SIZE_MINIMIZED)
event->configure.y = pt.y;
event->configure.width = LOWORD (msg->lParam);
event->configure.height = HIWORD (msg->lParam);
- GDK_WINDOW_OBJECT (window)->x = event->configure.x;
- GDK_WINDOW_OBJECT (window)->y = event->configure.y;
- window_impl->width = event->configure.width;
- window_impl->height = event->configure.height;
+ private->x = event->configure.x;
+ private->y = event->configure.y;
+ GDK_WINDOW_IMPL_WIN32 (private->impl)->width = event->configure.width;
+ GDK_WINDOW_IMPL_WIN32 (private->impl)->height = event->configure.height;
- if (GDK_WINDOW_OBJECT (window)->resize_count > 1)
- GDK_WINDOW_OBJECT (window)->resize_count -= 1;
+ if (private->resize_count > 1)
+ private->resize_count -= 1;
return_val = !GDK_WINDOW_DESTROYED (window);
- if (return_val
- && GDK_WINDOW_OBJECT (window)->extension_events != 0)
+ if (return_val && private->extension_events != 0)
_gdk_input_configure_event (&event->configure, window);
}
break;
event->configure.y = lpr->top + ncm.iCaptionHeight;
event->configure.width = lpr->right - lpr->left - 2 * ncm.iBorderWidth;
event->configure.height = lpr->bottom - lpr->top - ncm.iCaptionHeight;
- GDK_WINDOW_OBJECT (window)->x = event->configure.x;
- GDK_WINDOW_OBJECT (window)->y = event->configure.y;
- window_impl->width = event->configure.width;
- window_impl->height = event->configure.height;
+ private->x = event->configure.x;
+ private->y = event->configure.y;
+ GDK_WINDOW_IMPL_WIN32 (private->impl)->width = event->configure.width;
+ GDK_WINDOW_IMPL_WIN32 (private->impl)->height = event->configure.height;
- if (GDK_WINDOW_OBJECT (window)->resize_count > 1)
- GDK_WINDOW_OBJECT (window)->resize_count -= 1;
+ if (private->resize_count > 1)
+ private->resize_count -= 1;
return_val = !GDK_WINDOW_DESTROYED (window);
- if (return_val
- && GDK_WINDOW_OBJECT (window)->extension_events != 0)
+ if (return_val && private->extension_events != 0)
_gdk_input_configure_event (&event->configure, window);
}
break;
case WM_GETMINMAXINFO:
GDK_NOTE (EVENTS, g_print ("WM_GETMINMAXINFO: %p\n", msg->hwnd));
+ impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
mmi = (MINMAXINFO*) msg->lParam;
- if (window_impl->hint_flags & GDK_HINT_MIN_SIZE)
+ if (impl->hint_flags & GDK_HINT_MIN_SIZE)
{
- mmi->ptMinTrackSize.x = window_impl->hint_min_width;
- mmi->ptMinTrackSize.y = window_impl->hint_min_height;
+ mmi->ptMinTrackSize.x = impl->hint_min_width;
+ mmi->ptMinTrackSize.y = impl->hint_min_height;
}
- if (window_impl->hint_flags & GDK_HINT_MAX_SIZE)
+ if (impl->hint_flags & GDK_HINT_MAX_SIZE)
{
- mmi->ptMaxTrackSize.x = window_impl->hint_max_width;
- mmi->ptMaxTrackSize.y = window_impl->hint_max_height;
+ mmi->ptMaxTrackSize.x = impl->hint_max_width;
+ mmi->ptMaxTrackSize.y = impl->hint_max_height;
/* kind of WM functionality, limit maximized size to screen */
- mmi->ptMaxPosition.x = 0; mmi->ptMaxPosition.y = 0;
- mmi->ptMaxSize.x = MIN(window_impl->hint_max_width, gdk_screen_width ());
- mmi->ptMaxSize.y = MIN(window_impl->hint_max_height, gdk_screen_height ());
+ mmi->ptMaxPosition.x = 0;
+ mmi->ptMaxPosition.y = 0;
+ mmi->ptMaxSize.x = MIN (impl->hint_max_width, gdk_screen_width ());
+ mmi->ptMaxSize.y = MIN (impl->hint_max_height, gdk_screen_height ());
}
- else if (window_impl->hint_flags & GDK_HINT_MIN_SIZE)
+ else if (impl->hint_flags & GDK_HINT_MIN_SIZE)
{
/* need to initialize */
mmi->ptMaxSize.x = gdk_screen_width ();
mmi->ptMaxSize.y = gdk_screen_height ();
}
- /* lovely API inconsistence: return FALSE when handled */
- if (ret_val_flagp)
- *ret_val_flagp = !(window_impl->hint_flags &
- (GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE));
+ /* lovely API inconsistence: return FALSE when handled */
+ if (ret_val_flagp)
+ *ret_val_flagp = !(impl->hint_flags & (GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE));
break;
case WM_MOVE:
msg->hwnd,
LOWORD (msg->lParam), HIWORD (msg->lParam)));
- if (!(window_impl->event_mask & GDK_STRUCTURE_MASK))
+ if (!(private->event_mask & GDK_STRUCTURE_MASK))
break;
if (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD
GetClientRect (msg->hwnd, &rect);
event->configure.width = rect.right;
event->configure.height = rect.bottom;
- GDK_WINDOW_OBJECT (window)->x = event->configure.x;
- GDK_WINDOW_OBJECT (window)->y = event->configure.y;
- window_impl->width = event->configure.width;
- window_impl->height = event->configure.height;
+ private->x = event->configure.x;
+ private->y = event->configure.y;
+ GDK_WINDOW_IMPL_WIN32 (private->impl)->width = event->configure.width;
+ GDK_WINDOW_IMPL_WIN32 (private->impl)->height = event->configure.height;
return_val = !GDK_WINDOW_DESTROYED (window);
}
break;
-#if 0 /* not quite right, otherwise it may be faster/better than WM_(MOVE|SIZE)
- * remove decoration (frame) sizes ?
+
+#if 0 /* Not quite right, otherwise it may be faster/better than
+ * WM_(MOVE|SIZE) remove decoration (frame) sizes ?
*/
case WM_WINDOWPOSCHANGED :
- if (!(window_impl->event_mask & GDK_STRUCTURE_MASK))
+ if (!(private->event_mask & GDK_STRUCTURE_MASK))
break;
if (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD
event->configure.y = lpwp->y;
event->configure.width = lpwp->cx;
event->configure.height = lpwp->cy;
- GDK_WINDOW_OBJECT (window)->x = event->configure.x;
- GDK_WINDOW_OBJECT (window)->y = event->configure.y;
- window_impl->width = event->configure.width;
- window_impl->height = event->configure.height;
+ private->x = event->configure.x;
+ private->y = event->configure.y;
+ GDK_WINDOW_IMPL_WIN32 (private->impl)->width = event->configure.width;
+ GDK_WINDOW_IMPL_WIN32 (private->impl)->height = event->configure.height;
return_val = !GDK_WINDOW_DESTROYED (window);