| /* |
| * Focus functions |
| * |
| * Copyright 1993 David Metcalfe |
| * Copyright 1994 Alexandre Julliard |
| * |
| static char Copyright[] = "Copyright David Metcalfe, 1993"; |
| static char Copyright2[] = "Copyright Alexandre Julliard, 1994"; |
| */ |
| |
| #include "win.h" |
| #include "color.h" |
| |
| static HWND hWndFocus = 0; |
| |
| /***************************************************************** |
| * FOCUS_SetXFocus |
| * |
| * Set the X focus. |
| */ |
| static void FOCUS_SetXFocus( HWND hwnd ) |
| { |
| XWindowAttributes win_attr; |
| Window win; |
| |
| /* Only mess with the X focus if there's no desktop window */ |
| if (rootWindow != DefaultRootWindow(display)) return; |
| |
| if (!hwnd) /* If setting the focus to 0, uninstall the colormap */ |
| { |
| if (COLOR_WinColormap != DefaultColormapOfScreen(screen)) |
| XUninstallColormap( display, COLOR_WinColormap ); |
| return; |
| } |
| |
| /* Set X focus and install colormap */ |
| |
| if (!(win = WIN_GetXWindow( hwnd ))) return; |
| if (!XGetWindowAttributes( display, win, &win_attr ) || |
| (win_attr.map_state != IsViewable)) |
| return; /* If window is not viewable, don't change anything */ |
| XSetInputFocus( display, win, RevertToParent, CurrentTime ); |
| if (COLOR_WinColormap != DefaultColormapOfScreen(screen)) |
| XInstallColormap( display, COLOR_WinColormap ); |
| } |
| |
| |
| /***************************************************************** |
| * SetFocus (USER.22) |
| */ |
| |
| HWND SetFocus(HWND hwnd) |
| { |
| HWND hWndPrevFocus, hwndParent; |
| WND *wndPtr; |
| |
| if (hwnd == hWndFocus) return hWndFocus; /* Nothing to do! */ |
| |
| if (hwnd) |
| { |
| /* Check if we can set the focus to this window */ |
| |
| hwndParent = hwnd; |
| while ((wndPtr = WIN_FindWndPtr( hwndParent )) != NULL) |
| { |
| if ((wndPtr->dwStyle & WS_MINIMIZE) || |
| (wndPtr->dwStyle & WS_DISABLED)) return 0; |
| if (!(wndPtr->dwStyle & WS_CHILD)) break; |
| hwndParent = wndPtr->hwndParent; |
| } |
| |
| /* Now hwndParent is the top-level ancestor. Activate it. */ |
| |
| if (hwndParent != GetActiveWindow()) |
| { |
| SetWindowPos( hwndParent, HWND_TOP, 0, 0, 0, 0, |
| SWP_NOSIZE | SWP_NOMOVE ); |
| if (!IsWindow( hwnd )) return 0; /* Abort if window destroyed */ |
| } |
| } |
| |
| /* Change focus and send messages */ |
| |
| hWndPrevFocus = hWndFocus; |
| hWndFocus = hwnd; |
| if (hWndPrevFocus) SendMessage( hWndPrevFocus, WM_KILLFOCUS, hwnd, 0 ); |
| if (hwnd == hWndFocus) /* Maybe already changed during WM_KILLFOCUS */ |
| { |
| if (hwnd) SendMessage( hWndFocus, WM_SETFOCUS, hWndPrevFocus, 0 ); |
| FOCUS_SetXFocus( hwnd ); |
| } |
| return hWndPrevFocus; |
| } |
| |
| |
| /***************************************************************** |
| * GetFocus (USER.23) |
| */ |
| |
| HWND GetFocus(void) |
| { |
| return hWndFocus; |
| } |
| |
| |