4 * Copyright 1993 David Metcalfe
5 * 1994 Alexandre Julliard
17 static HWND hwndFocus = 0;
19 /*****************************************************************
23 * Explicit colormap management seems to work only with OLVWM.
25 void FOCUS_SetXFocus( HWND hwnd )
27 XWindowAttributes win_attr;
30 /* Only mess with the X focus if there's */
31 /* no desktop window and no window manager. */
32 if ((rootWindow != DefaultRootWindow(display)) || Options.managed) return;
34 if (!hwnd) /* If setting the focus to 0, uninstall the colormap */
36 if (COLOR_GetSystemPaletteFlags() & COLOR_PRIVATE)
37 XUninstallColormap( display, COLOR_GetColormap() );
41 /* Set X focus and install colormap */
43 if (!(win = WIN_GetXWindow( hwnd ))) return;
44 if (!XGetWindowAttributes( display, win, &win_attr ) ||
45 (win_attr.map_state != IsViewable))
46 return; /* If window is not viewable, don't change anything */
48 XSetInputFocus( display, win, RevertToParent, CurrentTime );
49 if (COLOR_GetSystemPaletteFlags() & COLOR_PRIVATE)
50 XInstallColormap( display, COLOR_GetColormap() );
55 /*****************************************************************
58 void FOCUS_SwitchFocus(HWND hFocusFrom, HWND hFocusTo)
62 if (hFocusFrom) SendMessage16( hFocusFrom, WM_KILLFOCUS, (WPARAM)hFocusTo, 0L);
63 if( !hFocusTo || hFocusTo != hwndFocus )
66 SendMessage16( hFocusTo, WM_SETFOCUS, (WPARAM)hFocusFrom, 0L);
67 FOCUS_SetXFocus( hFocusTo );
71 /*****************************************************************
74 HWND SetFocus(HWND hwnd)
76 HWND hWndPrevFocus, hwndTop = hwnd;
77 WND *wndPtr = WIN_FindWndPtr( hwnd );
81 /* Check if we can set the focus to this window */
83 while ( (wndPtr->dwStyle & (WS_CHILD | WS_POPUP)) == WS_CHILD )
85 if ( wndPtr->dwStyle & ( WS_MINIMIZE | WS_DISABLED) )
87 if (!(wndPtr = wndPtr->parent)) return 0;
88 hwndTop = wndPtr->hwndSelf;
91 if( hwnd == hwndFocus ) return hwnd;
94 if( HOOK_CallHooks( WH_CBT, HCBT_SETFOCUS, (WPARAM)hwnd, (LPARAM)hwndFocus) )
97 /* activate hwndTop if needed. */
98 if (hwndTop != GetActiveWindow())
100 if (!WINPOS_SetActiveWindow(hwndTop, 0, 0)) return 0;
102 if (!IsWindow( hwnd )) return 0; /* Abort if window destroyed */
105 else if( HOOK_CallHooks( WH_CBT, HCBT_SETFOCUS, 0, (LPARAM)hwndFocus ) )
108 /* Change focus and send messages */
109 hWndPrevFocus = hwndFocus;
111 FOCUS_SwitchFocus( hwndFocus , hwnd );
113 return hWndPrevFocus;
117 /*****************************************************************