116 lines
3.5 KiB
Python
Executable File
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)
|