Lightningbeam/GUI/Win32/Application.py

116 lines
3.5 KiB
Python
Executable File

#--------------------------------------------------------------------
#
# PyGUI - Application - Win32
#
#--------------------------------------------------------------------
import win32con as wc, win32ui as ui, win32clipboard as wcb, win32api as api, \
win32gui as gui, win32process as wp
from GUI import export
from GUI import Component, Window, WinUtils
from GUI.GApplications import Application as GApplication
class Application(GApplication):
def __init__(self, *args, **kwds):
self._win_recycle_list = []
self._win_app = ui.GetApp()
self._win_app.AttachObject(self)
self._win_app.SetMainFrame(WinUtils.win_none)
GApplication.__init__(self, *args, **kwds)
def set_menus(self, x):
#print "Application.set_menus" ###
GApplication.set_menus(self, x)
for window in self.windows:
window._win_menus_changed()
def _event_loop(self, window):
if window:
window._begin_modal()
try:
self._win_app.Run()
finally:
if window:
window._end_modal()
def _exit_event_loop(self):
api.PostQuitMessage(0)
def zero_windows_allowed(self):
return False
def get_target(self):
try:
win = ui.GetFocus()
except ui.error:
win = None
if isinstance(win, Component):
return win
else:
return self
def get_target_window(self):
win = ui.GetActiveWindow()
if isinstance(win, Window):
return win
def OnIdle(self, n):
#print "Application.OnIdle" ###
trash = self._win_recycle_list
while trash:
trash.pop().DestroyWindow()
self._win_idle()
return 0
def _win_idle(self):
self._check_for_no_windows()
def _check_for_no_windows(self):
#print "Application._check_for_no_windows" ###
apid = wp.GetCurrentProcessId()
#print "... apid =", apid ###
htop = gui.GetDesktopWindow()
hwin = gui.GetWindow(htop, wc.GW_CHILD)
while hwin:
wpid = wp.GetWindowThreadProcessId(hwin)[1]
if wpid == apid:
#print "... hwin", hwin ###
if gui.GetWindowLong(hwin, wc.GWL_STYLE) & wc.WS_VISIBLE:
#print "...... is visible" ###
return
hwin = gui.GetWindow(hwin, wc.GW_HWNDNEXT)
#print "... none visible" ###
self.no_visible_windows()
# def PreTranslateMessage(self, msg):
# print "Application.PreTranslateMessage:", msg ###
def _win_recycle(self, win):
# It's not safe to destroy a window inside code called from its
# own OnCommand handler, so we use this method to delay it until
# a better time.
self._win_recycle_list.append(win)
def query_clipboard(self):
wcb.OpenClipboard()
result = wcb.IsClipboardFormatAvailable(wc.CF_TEXT)
wcb.CloseClipboard()
return result
def get_clipboard(self):
wcb.OpenClipboard()
try:
result = wcb.GetClipboardData()
except TypeError:
result = None
wcb.CloseClipboard()
return result
def set_clipboard(self, x):
wcb.OpenClipboard()
wcb.SetClipboardData(wc.CF_TEXT, x)
wcb.CloseClipboard()
export(Application)