# 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