1
0
mirror of https://github.com/gryf/wmaker.git synced 2025-12-19 20:38:08 +01:00
Files
wmaker/WINGs/python/WINGs.py
dan 9aca0d5f6e - Check whether libXft is at least version 2.1.2 else refuse to compile.
- Fixed bug in icon chooser dialog that could cause a segmentation fault
  in some cases (Pascal Hofstee <caelian@gmail.com>)
- Fixed crash in asm code in wrlib, with new versions of gcc.
- Fixed bug in the x86_PseudoColor_32_to_8() function which incorrectly
  used the r, g, b fields in the conversion.
- Fixed x86 ASM code in wrlib to work on 64 bit architectures.
- Fixed the focus flicker seen with some apps (notably gtk2)
  (Alexey Spiridonov <snarkmaster@gmail.com>)
- Fixed all crashing bugs that were generated by wmaker starting with the
  WMState file missing.
- Added NetWM support (a modified version of the patch originaly written
  by Peter Zijlstra <a.p.zijlstra@chello.nl>)
- Applied patch to enhance the Virtual Desktop behaviour, and to integrate
  it with the NetWM code (Peter Zijlstra <a.p.zijlstra@chello.nl>)
- Applied a few xinerama and placement fixes (Peter Zijlstra
    <a.p.zijlstra@chello.nl>)
- Fixed memory leak in dock code.
- Fixed and enhanced the text wrapping in WINGs.
- Fixed the layout of some elements in WPrefs.app
- Added workaround for aplications that don't set the required hints on the
  client leader window, but they set them on normal windows (observer with
  KDE 3.3.0 mainly). This will allow these apps to get an appicon again.
  (they should be fixed still)
- Added workaround for applications that do not set a command with
  XSetCommand(), but instead they set the _NET_WM_PID property. This works
  with operating systems that offer a /proc interface similar to what linux
  has. (This also is to fix problems with KDE 3.3.0 apps, but not only them).
- Fixed bug with autostart and exit scripts not being executed if user
  GNUstep path was different from ~/GNUstep (when setting GNUSTEP_USER_ROOT)
- Added utf8 support in WINGs (removed old X core font code)
- Added utility to convert old font names to new font names in style files
2004-10-12 01:34:32 +00:00

644 lines
18 KiB
Python

#!/usr/bin/env python
import sys
import wings
# Some useful constants
False = 0
True = 1
# check about None as action for buttonAction/windowCloseAction ...
################################################################################
# Exceptions
################################################################################
from exceptions import Exception, StandardError
class Error(StandardError):
pass
del Exception, StandardError
class WMTimer:
def __init__(self, milliseconds, callback, cdata=None, persistent=False):
if persistent:
self._o = wings.pyWMAddPersistentTimerHandler(milliseconds, (callback, cdata))
else:
self._o = wings.pyWMAddTimerHandler(milliseconds, (callback, cdata))
self.__WMDeleteTimerHandler = wings.pyWMDeleteTimerHandler
def __del__(self):
self.__WMDeleteTimerHandler(self._o)
class WMPersistentTimer(WMTimer):
def __init__(self, milliseconds, callback, cdata=None):
WMTimer.__init__(self, milliseconds, callback, cdata, persistent=True)
class WMScreen:
__readonly = ('display', 'width', 'height', 'depth')
def __init__(self, appname, display="", simpleapp=False):
wings.WMInitializeApplication(appname, len(sys.argv), sys.argv)
self._o = wings.pyWMOpenScreen(display, simpleapp)
if not self._o:
raise Error, "Cannot open display %s" % display
self.__dict__['display'] = wings.WMScreenDisplay(self._o)
self.__dict__['width'] = wings.WMScreenWidth(self._o)
self.__dict__['height'] = wings.WMScreenHeight(self._o)
self.__dict__['depth'] = wings.WMScreenDepth(self._o)
def __setattr__(self, name ,value):
if name in self.__readonly:
#raise AttributeError, "'%s' is a read-only WMScreen attribute" % name
raise Error, "'%s' is a read-only WMScreen attribute" % name
self.__dict__[name] = value
def __delattr__(self, name):
if name in self.__readonly:
#raise AttributeError, "'%s' attribute cannot be deleted from WMScreen instance" % name
raise Error, "'%s' attribute cannot be deleted from WMScreen instance" % name
try:
del(self.__dict__[name])
except KeyError:
raise AttributeError, "%s instance has no attribute '%s'" % \
(self.__class__.__name__, name)
def mainLoop(self):
wings.pyWMScreenMainLoop(self._o)
def breakMainLoop(self):
wings.pyWMBreakScreenMainLoop(self._o)
def runModalLoop(self, view):
wings.pyWMRunModalLoop(self._o, view)
def breakModalLoop(self):
wings.WMBreakModalLoop(self._o)
def size(self):
return (self.width, self.height)
class WMView:
pass
class WMWidget(WMView):
def __init__(self):
if self.__class__ == WMWidget:
raise Error, "a WMWidget can't be instantiated directly"
self._o = None
self.__WMDestroyWidget = wings.WMDestroyWidget
def __del__(self):
if self._o is not None:
self.__WMDestroyWidget(self._o)
def resize(self, width, height):
wings.WMResizeWidget(self._o, width, height)
def move(self, x, y):
wings.WMMoveWidget(self._o, x, y)
def realize(self):
wings.WMRealizeWidget(self._o)
def show(self):
wings.WMMapWidget(self._o)
def hide(self):
wings.WMUnmapWidget(self._o)
def redisplay(self):
wings.WMRedisplayWidget(self._o)
def width(self):
return wings.WMWidgetWidth(self._o)
def height(self):
return wings.WMWidgetHeight(self._o)
def screen(self):
return wings.WMWidgetScreen(self._o)
def view(self):
return wings.WMWidgetView(self._o)
def setFocusTo(self, other):
wings.WMSetFocusToWidget(other._o)
class WMWindow(WMWidget):
def __init__(self, screen, name, style=wings.WMTitledWindowMask
|wings.WMClosableWindowMask|wings.WMMiniaturizableWindowMask
|wings.WMResizableWindowMask):
WMWidget.__init__(self)
self._o = wings.WMCreateWindowWithStyle(screen._o, name, style)
def setMinSize(self, minWidth, minHeight):
wings.WMSetWindowMinSize(self._o, minWidth, minHeight)
def setMaxSize(self, maxWidth, maxHeight):
wings.WMSetWindowMaxSize(self._o, maxWidth, maxHeight)
def setInitialPosition(self, x, y):
wings.WMSetWindowInitialPosition(self._o, x, y)
def setTitle(self, title):
wings.WMSetWindowTitle(self._o, title)
def setCloseAction(self, action, data=None):
if action!=None and (not callable(action)):
raise Error, "action needs to be a callable object or None"
wings.pyWMSetWindowCloseAction(self._o, (self, action, data))
class WMPanel(WMWindow):
def __init__(self, owner, name, style=wings.WMTitledWindowMask
|wings.WMClosableWindowMask|wings.WMResizableWindowMask):
WMWidget.__init__(self)
self._o = wings.WMCreatePanelWithStyleForWindow(owner._o, name, style)
class WMFrame(WMWidget):
def __init__(self, parent, title=None):
WMWidget.__init__(self)
self._o = wings.WMCreateFrame(parent._o)
self.setTitle(title)
def setRelief(self, relief):
wings.WMSetFrameRelief(self._o, relief)
def setTitle(self, title=""):
wings.WMSetFrameTitle(self._o, title)
def setTitlePosition(self, position):
wings.WMSetFrameTitlePosition(self._o, position)
class WMLabel(WMWidget):
def __init__(self, parent, text=None):
WMWidget.__init__(self)
self._o = wings.WMCreateLabel(parent._o)
self.setText(text)
def setWraps(self, flag):
# bool(flag) for python2.2
wings.WMSetLabelWraps(self._o, flag)
def setRelief(self, relief):
wings.WMSetLabelRelief(self._o, relief)
def setText(self, text=""):
wings.WMSetLabelText(self._o, text)
def setTextColor(self, color):
wings.WMSetLabelTextColor(self._o, color)
def setFont(self, font):
wings.WMSetLabelFont(self._o, font)
def setTextAlignment(self, alignment):
wings.WMSetLabelTextAlignment(self._o, alignment)
def setImage(self, image):
wings.WMSetLabelImage(self._o, image)
def setImagePosition(self, position):
wings.WMSetLabelImagePosition(self._o, position)
def text(self):
return wings.WMGetLabelText(self._o)
def font(self):
return wings.WMGetLabelFont(self._o)
def image(self):
return wings.WMGetLabelImage(self._o)
class WMBox(WMWidget):
def __init__(self, parent):
WMWidget.__init__(self)
self._o = wings.WMCreateBox(parent._o)
def setHorizontal(self, flag):
# bool(flag) for python2.2
wings.WMSetBoxHorizontal(self._o, flag)
def setBorderWidth(self, width):
wings.WMSetBoxBorderWidth(self._o, width)
def addSubview(self, view, expand, fill, minSize, maxSize, space):
wings.WMAddBoxSubview(self._o, view, expand, fill, minSize, maxSixe, space)
def addSubviewAtEnd(self, view, expand, fill, minSize, maxSize, space):
wings.WMAddBoxSubviewAtEnd(self._o, view, expand, fill, minSize, maxSixe, space)
def removeSubview(self, view):
wings.WMRemoveBoxSubview(self._o, view)
class WMButton(WMWidget): # not for user instantiation
def __init__(self, parent):
WMWidget.__init__(self)
if self.__class__ == WMButton:
raise Error, "a WMButton can't be instantiated directly"
def setText(self, text=""):
wings.WMSetButtonText(self._o, text)
def setAction(self, action, data=None):
if action!=None and (not callable(action)):
raise Error, "action needs to be a callable object or None"
wings.pyWMSetButtonAction(self._o, (self, action, data))
def performClick(self):
wings.WMPerformButtonClick(self._o)
def setEnabled(self, flag):
# bool(flag) for python2.2
wings.WMSetButtonEnabled(self._o, flag)
def isEnabled(self):
return wings.WMGetButtonEnabled(self._o)
def setImageDimsWhenDisabled(self, flag):
# bool(flag)
wings.WMSetButtonImageDimsWhenDisabled(self._o, flag)
def setImage(self, image):
wings.WMSetButtonImage(self_.o, image)
def setAlternateImage(self, image):
wings.WMSetButtonAltImage(self._o, image)
def setImagePosition(self, position):
wings.WMSetButtonImagePosition(self._o, position)
def setImageDefault(self):
wings.WMSetButtonImageDefault(self._o)
class WMCommandButton(WMButton):
def __init__(self, parent):
WMButton.__init__(self, parent)
self._o = wings.WMCreateCommandButton(parent._o)
class WMSwitchButton(WMButton):
def __init__(self, parent):
WMButton.__init__(self, parent)
self._o = wings.WMCreateSwitchButton(parent._o)
class WMRadioButton(WMButton):
def __init__(self, parent, group=None):
WMButton.__init__(self, parent)
self._o = wings.WMCreateRadioButton(parent._o)
if group:
wings.WMGroupButtons(group._o, self._o)
class WMListItem:
pass
class WMList(WMWidget):
def __init__(self, parent):
WMWidget.__init__(self)
self._o = wings.WMCreateList(parent._o)
def allowEmptySelection(self, flag):
# bool(flag)
wings.WMSetListAllowEmptySelection(self._o, flag)
def allowMultipleSelection(self, flag):
# bool(flag)
wings.WMSetListAllowMultipleSelection(self._o, flag)
def addItem(self, item):
wings.WMAddListItem(self._o, item)
def insertItem(self, row, item):
wings.WMInsertListItem(self._o, row, item)
def sortItems(self):
wings.WMSortListItems(self._o)
def rowWithTitle(self, title):
return wings.WMFindRowOfListItemWithTitle(self._o, title)
def selectedItemRow(self):
return wings.WMGetListSelectedItemRow(self._o)
def selectedItem(self):
return wings.WMGetListSelectedItem(self._o)
def removeItem(self, index):
wings.WMRemoveListItem(self._o, index)
def selectItem(self, index):
wings.WMSelectListItem(self._o, index)
def unselectItem(self, index):
wings.WMUnselectListItem(self._o, index)
class WMTextFieldDelegate:
__callbacks = ('didBeginEditing', 'didChange', 'didEndEditing',
'shouldBeginEditing', 'shouldEndEditing')
def __init__(self):
self.__dict__['data'] = None
self.__dict__['didBeginEditing'] = None
self.__dict__['didChange'] = None
self.__dict__['didEndEditing'] = None
self.__dict__['shouldBeginEditing'] = None
self.__dict__['shouldEndEditing'] = None
def __setattr__(self, name ,value):
if name in self.__callbacks and value!=None and (not callable(value)):
#raise AttributeError, "%s.%s needs to be a callable object or None" % (self.__class__.__name__, name)
raise Error, "%s.%s needs to be a callable object or None" % (self.__class__.__name__, name)
else:
self.__dict__[name] = value
class WMTextField(WMWidget):
def __init__(self, parent, text=""):
WMWidget.__init__(self)
self._o = wings.WMCreateTextField(parent._o)
wings.WMSetTextFieldText(self._o, text)
def setDelegate(self, delegate):
if delegate.__class__ != WMTextFieldDelegate:
raise Error, "textfield delegate must be of type 'WMTextFieldDelegate'"
wings.pyWMSetTextFieldDelegate(self._o, (self, delegate))
def delegate(self):
return wings.pyWMGetTextFieldDelegate(self._o)
def text(self):
return wings.WMGetTextFieldText(self._o)
def setEditable(self, flag):
# bool(flag)
wings.WMSetTextFieldEditable(self._o, flag)
def setBordered(self, flag):
# bool(flag)
wings.WMSetTextFieldBordered(self._o, flag)
def setBeveled(self, flag):
# bool(flag)
wings.WMSetTextFieldBeveled(self._o, flag)
def setSecure(self, flag):
# bool(flag)
wings.WMSetTextFieldSecure(self._o, flag)
def setCursorPosition(self, position):
wings.WMSetTextFieldCursorPosition(self._o, position)
def setNextText(self, next):
wings.WMSetTextFieldNextTextField(self._o, next._o)
def setPreviousText(self, previous):
wings.WMSetTextFieldPrevTextField(self._o, previous._o)
def setTextAlignment(self, alignment):
wings.WMSetTextFieldAlignment(self._o, alignment)
def isEditable(self):
return wings.WMGetTextFieldEditable(self._o)
def insertText(self, text, position):
wings.WMInsertTextFieldText(self._o, text, position)
def deleteText(self, start, count):
wings.WMDeleteTextFieldRange(self._o, wings.wmkrange(start, count))
def selectText(self, start, count):
wings.WMSelectTextFieldRange(self._o, wings.wmkrange(start, count))
def setFont(self, font):
wings.WMSetTextFieldFont(self._o, font)
def font(self):
return wings.WMGetTextFieldFont(self._o)
################################################################################
# wrap the WINGs constants so we don't need wings.constant_name
################################################################################
# WMWindow title style
WMTitledWindowMask = wings.WMTitledWindowMask
WMClosableWindowMask = wings.WMClosableWindowMask
WMMiniaturizableWindowMask = wings.WMMiniaturizableWindowMask
WMResizableWindowMask = wings.WMResizableWindowMask
# WMFrame title positions
WTPNoTitle = wings.WTPNoTitle
WTPAboveTop = wings.WTPAboveTop
WTPAtTop = wings.WTPAtTop
WTPBelowTop = wings.WTPBelowTop
WTPAboveBottom = wings.WTPAboveBottom
WTPAtBottom = wings.WTPAtBottom
WTPBelowBottom = wings.WTPBelowBottom
# Alingments
WALeft = wings.WALeft
WACenter = wings.WACenter
WARight = wings.WARight
WAJustified = wings.WAJustified # not valid for textfields
# Image positions
WIPNoImage = wings.WIPNoImage
WIPImageOnly = wings.WIPImageOnly
WIPLeft = wings.WIPLeft
WIPRight = wings.WIPRight
WIPBelow = wings.WIPBelow
WIPAbove = wings.WIPAbove
WIPOverlaps = wings.WIPOverlaps
# Relief types
WRFlat = wings.WRFlat
WRSimple = wings.WRSimple
WRRaised = wings.WRRaised
WRSunken = wings.WRSunken
WRGroove = wings.WRGroove
WRRidge = wings.WRRidge
WRPushed = wings.WRPushed
# TextField events
WMReturnTextMovement = wings.WMReturnTextMovement
WMEscapeTextMovement = wings.WMEscapeTextMovement
WMIllegalTextMovement = wings.WMIllegalTextMovement
WMTabTextMovement = wings.WMTabTextMovement
WMBacktabTextMovement = wings.WMBacktabTextMovement
WMLeftTextMovement = wings.WMLeftTextMovement
WMRightTextMovement = wings.WMRightTextMovement
WMUpTextMovement = wings.WMUpTextMovement
WMDownTextMovement = wings.WMDownTextMovement
if __name__ == "__main__":
def quit(obj, data):
#sys.exit()
scr.breakMainLoop()
def click(btn, list):
print win.width(), win.height()
print list.selectedItemRow()
win2.show()
scr.runModalLoop(win2.view())
print txt2.text()
def sayhi(btn, data):
print "hi"
def breakLoop(btn, data):
#sys.exit()
scr.breakModalLoop()
win2.hide()
def dc(object, data, action):
print "didChange:", object, data, action
def dbe(object, data, action):
print "didBeginEditing:", object, data, action
def dee(object, data, action):
if action == wings.WMReturnTextMovement:
if object == txt:
object.setFocusTo(txt2)
else:
object.setFocusTo(txt)
print "didEndEditing:", object, data, action, object.text()
def tcb(one):
old = list.selectedItemRow()
list.selectItem(list.index)
list.unselectItem(old)
list.index = (list.index+1) % 3
#print one
scr = WMScreen("foobar")
win = WMWindow(scr, "aWindow")
win.setCloseAction(quit)
win.setTitle("test window")
win.resize(400, 180)
win.setInitialPosition((scr.width-win.width())/2, (scr.height-win.height())/2)
btn = WMCommandButton(win)
btn.setText("Click Me")
btn.resize(100, 25)
btn.move(20, 20)
btn.show()
sw = WMSwitchButton(win)
sw.setText("Some option")
sw.resize(100, 25)
sw.move(20, 50)
sw.show()
radios = []
r = None
j = 0
for i in ["One", "Two", "Four"]:
r = WMRadioButton(win, r)
radios.append(r)
r.show()
r.setText(i)
r.move(20, 70+j*25)
r.resize(100, 25)
j=j+1
sw.setAction(sayhi)
list = WMList(win)
list.resize(100,100)
list.move(130, 20)
list.addItem("one")
list.addItem("two")
list.addItem("three")
list.allowMultipleSelection(1)
list.show()
list.index = 0
txtdel = WMTextFieldDelegate()
txtdel.data = 'mydata'
txtdel.didBeginEditing = dbe
txtdel.didEndEditing = dee
txtdel.didChange = dc
txt = WMTextField(win, "abc")
txt.resize(95, 20)
txt.move(295, 20)
txt.setDelegate(txtdel)
txt.show()
txt2 = WMTextField(win, "01234567890")
txt2.resize(95, 20)
txt2.move(295, 45)
txt2.setDelegate(txtdel)
txt2.show()
txt.setNextText(txt2)
txt2.setNextText(txt)
label = WMLabel(win, "Text1:")
label.setTextAlignment(WARight)
label.move(240, 20)
label.resize(55, 20)
label.show()
label2 = WMLabel(win, "mytext2:")
label2.setTextAlignment(WARight)
label2.move(240, 45)
label2.resize(55, 20)
label2.show()
btn.setAction(click, list)
frame = WMFrame(win, "My Frame")
frame.resize(150, 50)
frame.move(240, 70)
#frame.setRelief(WRPushed)
frame.show()
ebtn = WMCommandButton(win)
ebtn.setText("Exit")
ebtn.resize(100, 25)
ebtn.move(290, 147)
ebtn.setAction(quit)
ebtn.show()
win.realize()
win.show()
timer = WMPersistentTimer(1000, tcb, win)
#del(timer)
#timer.delete()
win2 = WMPanel(win, "anotherWindow", WMTitledWindowMask)
win2.setTitle("transient test window")
win2.resize(150, 50)
win2.setInitialPosition((scr.width-win2.width())/2, (scr.height-win2.height())/2)
btn7 = WMCommandButton(win2)
btn7.setText("Dismiss")
btn7.resize(100, 25)
btn7.move(27, 10)
btn7.show()
btn7.setAction(breakLoop)
win2.realize()
scr.mainLoop()