#!/usr/bin/env python from time import sleep import pygtk pygtk.require('2.0') import gtk from gtk.gdk import CONTROL_MASK #from CsoundXOAgent2 import CsoundXOAgent class gtkMain: def main(self): toplevel_window = gtk.Window(gtk.WINDOW_TOPLEVEL) self.init(toplevel_window) gtk.main() return 0 def init(self, toplevel_window): self.window = toplevel_window # self.csound = CsoundXOAgent("localhost", 7000) # remove any children of the window that Sugar may have added for widget in self.window.get_children(): self.window.remove(widget) self.window.set_title("Gtk practice") self.window.set_name ("Gtk practice") # for XO self.window.set_resizable(False) # connect windows signal to its handling function self.window.connect("expose_event", self.expose_event) self.window.connect("configure_event", self.configure_event) self.window.connect("leave_notify_event", self.leave_notify_event) self.window.connect("motion_notify_event", self.motion_notify_event) self.window.connect("destroy", self.destroy) self.window.connect("delete_event", self.delete_event) self.window.connect("button_press_event", self.mouse_press_event) self.window.connect("button_release_event", self.mouse_release_event) self.window.connect("key_press_event", self.key_press_event) self.window.connect("key_release_event", self.key_release_event) self.window.set_events(gtk.gdk.EXPOSURE_MASK | gtk.gdk.LEAVE_NOTIFY_MASK | gtk.gdk.KEY_PRESS_MASK | gtk.gdk.KEY_RELEASE_MASK | gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.BUTTON_RELEASE_MASK | gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.POINTER_MOTION_HINT_MASK) # set background color self.bg_color = gtk.gdk.Color(55040, 55040, 65535) self.window.modify_bg(gtk.STATE_NORMAL, self.bg_color) # create a graphical layout in fixed form self.layout = gtk.Fixed() # self.layout.set_size_request(400, 300) # create two text labels self.label_1 = gtk.Label("") self.label_1.set_size_request(400, 20) self.layout.put(self.label_1, 20, 20) self.label_2 = gtk.Label("") self.label_2.set_size_request(400, 20) self.layout.put(self.label_2, 20, 60) self.space_flag = 0 # windows > layout > widget (label/button) self.window.add(self.layout) self.window.show_all() def configure_event(self, widget, event): # configure the graphical area x, y, width, height = widget.get_allocation() self.pixmap = gtk.gdk.Pixmap(widget.window, width, height) gc = self.pixmap.new_gc() gc.set_rgb_fg_color(self.bg_color) self.pixmap.draw_rectangle(gc, True, 0, 0, width, height) return True def leave_notify_event(self, widget, event): # when the mouse cursor leaves the activity return def expose_event(self, widget, event): # draw x, y, width, height = widget.get_allocation() widget.window.draw_drawable(widget.get_style().fg_gc[gtk.STATE_NORMAL], self.pixmap, x, y, x, y, width, height) return False def destroy(self, widget, data=None): # destructor self.csound.close() sleep(0.1) # this is kind of tricky: csound needs a little time to shut down itself gtk.main_quit() # if the main function closes before csound, problems might occur. def delete_event(self, widget, event, data=None): # destructor, i forgot the difference between these two events return False def motion_notify_event(self, widget, event): # mouse move event if event.is_hint: x, y, state = event.window.get_pointer() else: x, y = event.x, event.y state = event.state self.label_1.set_text("mouse move: (" + str(event.x) + "," + str(event.y) + ")") return def mouse_release_event(self, widget, event): # mouse release event self.label_1.set_text("mouse release: " + str(event.button)) return def mouse_press_event(self, widget, event): # mouse press event, when you hold the mouse button # it will send multiple events, to actually capture # the moment when the button is clicked, you might # need a flag for the clicking status. self.label_1.set_text("mouse press: " + str(event.button)) return def key_release_event(self, widget, event): # handle a release event of a key keyname = gtk.gdk.keyval_name(event.keyval) self.label_1.set_text("key release: " + keyname) if keyname == 'space': self.space_flag = 0 #self.sendCsoundEvt("write your own csound line event") return def key_press_event(self, widget, event): # handle a press event of a key, when you hold a key # on the keyboard, it will send multiple events. See # the explanation in mouse_press_event keyname = gtk.gdk.keyval_name(event.keyval) self.label_1.set_text("key press: " + keyname) if keyname == 'Escape': self.destroy(widget) elif keyname == 'space' and self.space_flag == 0: self.space_flag = 1 #self.sendCsoundEvt("write your own csound line event") return def sendCsoundEvt(self, line): self.csound.sendLinevt(line) self.label_2.set_text("csound line event: " + line) if __name__ == "__main__": main = gtkMain() main.main()