Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell/WindowManager.py
diff options
context:
space:
mode:
Diffstat (limited to 'shell/WindowManager.py')
-rw-r--r--shell/WindowManager.py158
1 files changed, 158 insertions, 0 deletions
diff --git a/shell/WindowManager.py b/shell/WindowManager.py
new file mode 100644
index 0000000..765b2be
--- /dev/null
+++ b/shell/WindowManager.py
@@ -0,0 +1,158 @@
+import pygtk
+pygtk.require('2.0')
+import gtk
+import gobject
+
+SM_SPACE_PROPORTIONAL = 0
+SM_STEP = 1
+
+SLIDING_TIMEOUT = 50
+SLIDING_MODE = SM_SPACE_PROPORTIONAL
+
+#SLIDING_TIMEOUT = 10
+#SLIDING_MODE = SM_STEP
+#SLIDING_STEP = 0.05
+
+class WindowManager:
+ __managers_list = []
+
+ CENTER = 0
+ LEFT = 1
+ RIGHT = 2
+ TOP = 3
+ BOTTOM = 4
+
+ ABSOLUTE = 0
+ SCREEN_RELATIVE = 1
+
+ def __init__(self, window):
+ self._window = window
+ self._sliding_pos = 0
+
+ WindowManager.__managers_list.append(self)
+
+ window.connect("key-press-event", self.__key_press_event_cb)
+
+ def __key_press_event_cb(self, window, event):
+ manager = None
+
+ if event.keyval == gtk.keysyms.Left and \
+ event.state & gtk.gdk.CONTROL_MASK:
+ for wm in WindowManager.__managers_list:
+ if wm._position == WindowManager.LEFT:
+ manager = wm
+
+ if event.keyval == gtk.keysyms.Up and \
+ event.state & gtk.gdk.CONTROL_MASK:
+ for wm in WindowManager.__managers_list:
+ if wm._position == WindowManager.TOP:
+ manager = wm
+
+ if manager and manager._window.get_property('visible'):
+ manager.slide_window_out()
+ elif manager:
+ manager.slide_window_in()
+
+ def set_width(self, width, width_type):
+ self._width = width
+ self._width_type = width_type
+
+ def set_height(self, height, height_type):
+ self._height = height
+ self._height_type = height_type
+
+ def set_position(self, position):
+ self._position = position
+
+ def _calc_size_and_position(self):
+ screen_width = self._window.get_screen().get_width()
+ screen_height = self._window.get_screen().get_height()
+
+ if self._width_type is WindowManager.ABSOLUTE:
+ width = self._width
+ elif self._width_type is WindowManager.SCREEN_RELATIVE:
+ width = int(screen_width * self._width)
+
+ if self._height_type is WindowManager.ABSOLUTE:
+ height = self._height
+ elif self._height_type is WindowManager.SCREEN_RELATIVE:
+ height = int(screen_height * self._height)
+
+ if self._position is WindowManager.CENTER:
+ self._x = int((screen_width - width) / 2)
+ self._y = int((screen_height - height) / 2)
+ elif self._position is WindowManager.LEFT:
+ self._x = - int((1.0 - self._sliding_pos) * width)
+ self._y = int((screen_height - height) / 2)
+ elif self._position is WindowManager.TOP:
+ self._x = int((screen_width - width) / 2)
+ self._y = - int((1.0 - self._sliding_pos) * height)
+
+ self._real_width = width
+ self._real_height = height
+
+ def _update_size_and_position(self):
+ self._calc_size_and_position()
+ self._window.move(self._x, self._y)
+ self._window.resize(self._real_width, self._real_height)
+
+ def _update_position(self):
+ self._calc_size_and_position()
+ self._window.move(self._x, self._y)
+
+ def __slide_in_timeout_cb(self):
+ if self._sliding_pos == 0:
+ self._window.show()
+
+ if SLIDING_MODE == SM_SPACE_PROPORTIONAL:
+ space_to_go = 1.0 - self._sliding_pos
+ self._sliding_pos += (space_to_go / 2)
+ else:
+ self._sliding_pos += SLIDING_STEP
+
+ if self._sliding_pos > .999:
+ self._sliding_pos = 1.0
+
+ self._update_position()
+
+ if self._sliding_pos == 1.0:
+ return False
+ else:
+ return True
+
+ def __slide_out_timeout_cb(self):
+ self._window.show()
+
+ if SLIDING_MODE == SM_SPACE_PROPORTIONAL:
+ space_to_go = self._sliding_pos
+ self._sliding_pos -= (space_to_go / 2)
+ else:
+ self._sliding_pos -= SLIDING_STEP
+
+ if self._sliding_pos < .001:
+ self._sliding_pos = 0
+
+ self._update_position()
+
+ if self._sliding_pos == 0:
+ self._window.hide()
+ return False
+ else:
+ return True
+
+ def slide_window_in(self):
+ self._sliding_pos = 0
+ gobject.timeout_add(SLIDING_TIMEOUT, self.__slide_in_timeout_cb)
+
+ def slide_window_out(self):
+ self._sliding_pos = 1.0
+ gobject.timeout_add(SLIDING_TIMEOUT, self.__slide_out_timeout_cb)
+
+ def show(self):
+ self._window.show()
+
+ def update(self):
+ self._update_size_and_position()
+
+ def manage(self):
+ self._update_size_and_position()