/* * 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; }