/********************************************************************** * EVENT_FocusIn */ static void EVENT_FocusIn( HWND hwnd, XEvent *xev ) { XFocusChangeEvent *event = &xev->xfocus; XIC xic; if (!hwnd) return; TRACE( "win %p xwin %lx detail=%s\n", hwnd, event->window, focus_details[event->detail] ); if (event->detail == NotifyPointer) return; if ((xic = X11DRV_get_ic( hwnd ))) { wine_tsx11_lock(); XSetICFocus( xic ); wine_tsx11_unlock(); } if (use_take_focus) return; /* ignore FocusIn if we are using take focus */ if (!can_activate_window(hwnd)) { HWND hwnd = GetFocus(); if (hwnd) hwnd = GetAncestor( hwnd, GA_ROOT ); if (!hwnd) hwnd = GetActiveWindow(); if (!hwnd) hwnd = x11drv_thread_data()->last_focus; if (hwnd && can_activate_window(hwnd)) set_focus( hwnd, CurrentTime ); } else SetForegroundWindow( hwnd ); }
void X11DRV_ForceXIMReset(HWND hwnd) { XIC ic = X11DRV_get_ic(hwnd); if (ic) { char* leftover; TRACE("Forcing Reset %p\n",ic); leftover = XmbResetIC(ic); XFree(leftover); } }
/********************************************************************** * EVENT_FocusOut * * Note: only top-level windows get FocusOut events. */ static void EVENT_FocusOut( HWND hwnd, XEvent *xev ) { XFocusChangeEvent *event = &xev->xfocus; HWND hwnd_tmp; Window focus_win; int revert; XIC xic; if (!hwnd) return; TRACE( "win %p xwin %lx detail=%s\n", hwnd, event->window, focus_details[event->detail] ); if (event->detail == NotifyPointer) return; if (ximInComposeMode) return; x11drv_thread_data()->last_focus = hwnd; if ((xic = X11DRV_get_ic( hwnd ))) { wine_tsx11_lock(); XUnsetICFocus( xic ); wine_tsx11_unlock(); } if (hwnd != GetForegroundWindow()) return; SendMessageW( hwnd, WM_CANCELMODE, 0, 0 ); /* don't reset the foreground window, if the window which is getting the focus is a Wine window */ wine_tsx11_lock(); XGetInputFocus( thread_display(), &focus_win, &revert ); if (focus_win) { if (XFindContext( thread_display(), focus_win, winContext, (char **)&hwnd_tmp ) != 0) focus_win = 0; } wine_tsx11_unlock(); if (!focus_win) { /* Abey : 6-Oct-99. Check again if the focus out window is the Foreground window, because in most cases the messages sent above must have already changed the foreground window, in which case we don't have to change the foreground window to 0 */ if (hwnd == GetForegroundWindow()) { TRACE( "lost focus, setting fg to 0\n" ); SetForegroundWindow( 0 ); } } }
void X11DRV_SetPreeditState(HWND hwnd, BOOL fOpen) { XIC ic; XIMPreeditState state; XVaNestedList attr; ic = X11DRV_get_ic(hwnd); if (!ic) return; if (fOpen) state = XIMPreeditEnable; else state = XIMPreeditDisable; attr = XVaCreateNestedList(0, XNPreeditState, state, NULL); if (attr != NULL) { XSetICValues(ic, XNPreeditAttributes, attr, NULL); XFree(attr); } }