# Copyright (c) 2012 CEF Python, see the Authors file. # All rights reserved. Licensed under BSD 3-clause license. # Project website: https://github.com/cztomczak/cefpython include "cefpython.pyx" class WindowUtils(object): @staticmethod def OnSetFocus(WindowHandle windowHandle, long msg, long wparam, long lparam): cdef PyBrowser pyBrowser = GetBrowserByWindowHandle(windowHandle) if not pyBrowser: return 0 pyBrowser.SetFocus(True) return 0 @staticmethod def OnSize(WindowHandle windowHandle, long msg, long wparam, long lparam): cdef PyBrowser pyBrowser = GetBrowserByWindowHandle(windowHandle) if not pyBrowser: return DefWindowProc(windowHandle, msg, wparam, lparam) cdef HWND innerHwnd = pyBrowser.GetWindowHandle() cdef RECT rect2 GetClientRect(windowHandle, &rect2) cdef HDWP hdwp = BeginDeferWindowPos(1) hdwp = DeferWindowPos(hdwp, innerHwnd, NULL, rect2.left, rect2.top, rect2.right - rect2.left, rect2.bottom - rect2.top, SWP_NOZORDER) EndDeferWindowPos(hdwp) return DefWindowProc(windowHandle, msg, wparam, lparam) @staticmethod def OnEraseBackground(WindowHandle windowHandle, long msg, long wparam, long lparam): cdef PyBrowser pyBrowser = GetBrowserByWindowHandle(windowHandle) if not pyBrowser: return DefWindowProc(windowHandle, msg, wparam, lparam) # Dont erase the background if the browser window has been loaded, # this avoids flashing. if pyBrowser.GetWindowHandle(): return 0 return DefWindowProc(windowHandle, msg, wparam, lparam) @staticmethod def SetTitle(PyBrowser pyBrowser, str pyTitle): # Each browser window should have a title (Issue 3). # When popup is created, the window that sits in taskbar # has no title. if not pyTitle: return cdef WindowHandle windowHandle if pyBrowser.GetUserData("__outerWindowHandle"): windowHandle = \ pyBrowser.GetUserData("__outerWindowHandle") else: windowHandle = pyBrowser.GetWindowHandle() assert windowHandle, ( "WindowUtils.SetTitle() failed: windowHandle is empty") # Get window title. cdef int sizeOfTitle = 100 cdef wchar_t* widecharTitle = ( calloc(sizeOfTitle, wchar_t_size)) GetWindowTextW(windowHandle, widecharTitle, sizeOfTitle) cdef str currentTitle = WidecharToPyString(widecharTitle) free(widecharTitle) # Must keep alive while c_str() is passed. cdef CefString cefTitle PyToCefString(pyTitle, cefTitle) if pyBrowser.GetUserData("__outerWindowHandle"): if not currentTitle: SetWindowTextW(windowHandle, cefTitle.ToWString().c_str()) else: # For independent popups we always change title to what page # is displayed currently. SetWindowTextW(windowHandle, cefTitle.ToWString().c_str()) @staticmethod def SetIcon(PyBrowser pyBrowser, py_string icon="inherit"): # `icon` parameter is not implemented. # Popup window inherits icon from the main window. if pyBrowser.GetUserData("__outerWindowHandle"): return None windowHandle = pyBrowser.GetWindowHandle() assert windowHandle, ( "WindowUtils.SetIcon() failed: windowHandle is empty") iconBig = SendMessage( windowHandle, WM_GETICON, ICON_BIG, 0) iconSmall = SendMessage( windowHandle, WM_GETICON, ICON_SMALL, 0) cdef WindowHandle parentWindowHandle if not iconBig and not iconSmall: parentWindowHandle = pyBrowser.GetOpenerWindowHandle() parentIconBig = SendMessage( parentWindowHandle, WM_GETICON, ICON_BIG, 0) parentIconSmall = SendMessage( parentWindowHandle, WM_GETICON, ICON_SMALL, 0) # If parent is main application window, then # GetOpenerWindowHandle() returned innerWindowHandle # of the parent window, try again. if not parentIconBig and not parentIconSmall: parentWindowHandle = GetParent( parentWindowHandle) Debug("WindowUtils.SetIcon(): popup inherits icon from " "parent window: %s" % parentWindowHandle) parentIconBig = SendMessage( parentWindowHandle, WM_GETICON, ICON_BIG, 0) parentIconSmall = SendMessage( parentWindowHandle, WM_GETICON, ICON_SMALL, 0) if parentIconBig: SendMessage(windowHandle, WM_SETICON, ICON_BIG, parentIconBig) if parentIconSmall: SendMessage(windowHandle, WM_SETICON, ICON_SMALL, parentIconSmall) @staticmethod def GetParentHandle(WindowHandle windowHandle): return GetParent(windowHandle) @staticmethod def IsWindowHandle(WindowHandle windowHandle): IF UNAME_SYSNAME == "Windows": return bool(IsWindow(windowHandle)) ELSE: return False @staticmethod def InstallX11ErrorHandlers(): pass