| 
									
										
										
										
											2007-04-26 11:31:41 +02:00
										 |  |  | # Copyright (C) 2007, Red Hat, Inc. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # This library is free software; you can redistribute it and/or | 
					
						
							|  |  |  | # modify it under the terms of the GNU Lesser General Public | 
					
						
							|  |  |  | # License as published by the Free Software Foundation; either | 
					
						
							|  |  |  | # version 2 of the License, or (at your option) any later version. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # This library is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | # but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
					
						
							|  |  |  | # Lesser General Public License for more details. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # You should have received a copy of the GNU Lesser General Public | 
					
						
							|  |  |  | # License along with this library; if not, write to the | 
					
						
							|  |  |  | # Free Software Foundation, Inc., 59 Temple Place - Suite 330, | 
					
						
							|  |  |  | # Boston, MA 02111-1307, USA. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-26 13:14:53 +01:00
										 |  |  | import gobject | 
					
						
							| 
									
										
										
										
											2007-02-27 13:41:51 +01:00
										 |  |  | import gtk | 
					
						
							| 
									
										
										
										
											2007-11-26 13:14:53 +01:00
										 |  |  | import logging | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from sugar.graphics.icon import Icon | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class UnfullscreenButton(gtk.Window): | 
					
						
							| 
									
										
										
										
											2007-02-27 13:41:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-02-27 20:08:33 +01:00
										 |  |  |     def __init__(self): | 
					
						
							| 
									
										
										
										
											2007-04-26 11:31:41 +02:00
										 |  |  |         gtk.Window.__init__(self) | 
					
						
							| 
									
										
										
										
											2007-02-27 20:08:33 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-26 13:14:53 +01:00
										 |  |  |         self.set_decorated(False) | 
					
						
							|  |  |  |         self.set_resizable(False) | 
					
						
							|  |  |  |         self.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.set_border_width(0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.props.accept_focus = False | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         #Setup estimate of width, height | 
					
						
							|  |  |  |         w, h = gtk.icon_size_lookup(gtk.ICON_SIZE_LARGE_TOOLBAR) | 
					
						
							|  |  |  |         self._width = w | 
					
						
							|  |  |  |         self._height = h | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.connect('size-request', self._size_request_cb) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         screen = self.get_screen() | 
					
						
							|  |  |  |         screen.connect('size-changed', self._screen_size_changed_cb) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self._button = gtk.Button() | 
					
						
							|  |  |  |         self._button.set_relief(gtk.RELIEF_NONE) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self._icon = Icon(icon_name='view-return', | 
					
						
							|  |  |  |                             icon_size=gtk.ICON_SIZE_LARGE_TOOLBAR) | 
					
						
							|  |  |  |         self._icon.show() | 
					
						
							|  |  |  |         self._button.add(self._icon) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self._button.show() | 
					
						
							|  |  |  |         self.add(self._button) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def connect_button_press(self, cb): | 
					
						
							|  |  |  |         self._button.connect('button-press-event', cb) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _reposition(self): | 
					
						
							|  |  |  |         x = gtk.gdk.screen_width() - self._width | 
					
						
							|  |  |  |         self.move(x, 0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _size_request_cb(self, widget, req): | 
					
						
							|  |  |  |         self._width = req.width | 
					
						
							|  |  |  |         self._height = req.height | 
					
						
							|  |  |  |         self._reposition() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _screen_size_changed_cb(self, screen): | 
					
						
							|  |  |  |         self._reposition() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Window(gtk.Window): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     __gproperties__ = { | 
					
						
							|  |  |  |         'enable-fullscreen-mode': (bool, None, None, True, | 
					
						
							|  |  |  |                                     gobject.PARAM_READWRITE), | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, **args): | 
					
						
							|  |  |  |         self._enable_fullscreen_mode = True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         gtk.Window.__init__(self, **args) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-18 23:56:58 +02:00
										 |  |  |         self.connect('realize', self.__window_realize_cb) | 
					
						
							|  |  |  |         self.connect('window-state-event', self.__window_state_event_cb) | 
					
						
							| 
									
										
										
										
											2007-10-19 22:48:21 +02:00
										 |  |  |         self.connect('key-press-event', self.__key_press_cb) | 
					
						
							| 
									
										
										
										
											2007-10-18 23:56:58 +02:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2007-04-27 10:51:19 +02:00
										 |  |  |         self.toolbox = None | 
					
						
							| 
									
										
										
										
											2007-10-11 20:04:04 +02:00
										 |  |  |         self._alerts = [] | 
					
						
							| 
									
										
										
										
											2007-04-27 10:51:19 +02:00
										 |  |  |         self.canvas = None | 
					
						
							| 
									
										
										
										
											2007-10-18 23:56:58 +02:00
										 |  |  |         self.tray = None | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2007-04-27 10:51:19 +02:00
										 |  |  |         self._vbox = gtk.VBox() | 
					
						
							| 
									
										
										
										
											2007-10-18 23:56:58 +02:00
										 |  |  |         self._hbox = gtk.HBox() | 
					
						
							|  |  |  |         self._vbox.pack_start(self._hbox) | 
					
						
							|  |  |  |         self._hbox.show() | 
					
						
							| 
									
										
										
										
											2007-11-04 17:16:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         self._event_box = gtk.EventBox() | 
					
						
							|  |  |  |         self._hbox.pack_start(self._event_box) | 
					
						
							|  |  |  |         self._event_box.show() | 
					
						
							| 
									
										
										
										
											2007-10-18 23:56:58 +02:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2007-10-11 20:04:04 +02:00
										 |  |  |         self.add(self._vbox) | 
					
						
							| 
									
										
										
										
											2007-04-27 10:51:19 +02:00
										 |  |  |         self._vbox.show() | 
					
						
							| 
									
										
										
										
											2007-02-27 13:41:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-26 13:14:53 +01:00
										 |  |  |         self._is_fullscreen = False | 
					
						
							|  |  |  |         self._unfullscreen_button = UnfullscreenButton() | 
					
						
							|  |  |  |         self._unfullscreen_button.set_transient_for(self) | 
					
						
							|  |  |  |         self._unfullscreen_button.connect_button_press( | 
					
						
							|  |  |  |             self.__unfullscreen_button_pressed) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def do_get_property(self, prop): | 
					
						
							|  |  |  |         if prop.name == 'enable-fullscreen-mode': | 
					
						
							|  |  |  |             return self._enable_fullscreen_mode | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             return gtk.Window.do_get_property(self, prop) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def do_set_property(self, prop, val): | 
					
						
							|  |  |  |         if prop.name == 'enable-fullscreen-mode': | 
					
						
							|  |  |  |             self._enable_fullscreen_mode = val | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             gtk.Window.do_set_property(self, prop, val) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-04-26 11:31:41 +02:00
										 |  |  |     def set_canvas(self, canvas): | 
					
						
							|  |  |  |         if self.canvas: | 
					
						
							| 
									
										
										
										
											2007-11-04 17:16:16 +01:00
										 |  |  |             self._event_box.remove(self.canvas) | 
					
						
							| 
									
										
										
										
											2007-02-27 13:41:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-04 17:16:16 +01:00
										 |  |  |         if canvas: | 
					
						
							|  |  |  |             self._event_box.add(canvas) | 
					
						
							| 
									
										
										
										
											2007-04-27 10:51:19 +02:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2007-04-26 11:31:41 +02:00
										 |  |  |         self.canvas = canvas | 
					
						
							| 
									
										
										
										
											2007-04-27 10:51:19 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def set_toolbox(self, toolbox): | 
					
						
							|  |  |  |         if self.toolbox: | 
					
						
							|  |  |  |             self._vbox.remove(self.toolbox) | 
					
						
							| 
									
										
										
										
											2007-10-18 23:56:58 +02:00
										 |  |  |              | 
					
						
							| 
									
										
										
										
											2007-04-27 10:51:19 +02:00
										 |  |  |         self._vbox.pack_start(toolbox, False) | 
					
						
							|  |  |  |         self._vbox.reorder_child(toolbox, 0) | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         self.toolbox = toolbox | 
					
						
							| 
									
										
										
										
											2007-10-11 20:04:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-18 23:56:58 +02:00
										 |  |  |     def set_tray(self, tray, position): | 
					
						
							|  |  |  |         if self.tray: | 
					
						
							|  |  |  |             box = self.tray.get_parent()  | 
					
						
							|  |  |  |             box.remove(self.tray) | 
					
						
							|  |  |  |                  | 
					
						
							|  |  |  |         if position == gtk.POS_LEFT: | 
					
						
							|  |  |  |             self._hbox.pack_start(tray, False) | 
					
						
							|  |  |  |         elif position == gtk.POS_RIGHT: | 
					
						
							|  |  |  |             self._hbox.pack_end(tray, False) | 
					
						
							|  |  |  |         elif position == gtk.POS_BOTTOM: | 
					
						
							|  |  |  |             self._vbox.pack_end(tray, False) | 
					
						
							|  |  |  |                      | 
					
						
							|  |  |  |         self.tray = tray | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-11 20:04:04 +02:00
										 |  |  |     def add_alert(self, alert): | 
					
						
							|  |  |  |         self._alerts.append(alert) | 
					
						
							|  |  |  |         if len(self._alerts) == 1: | 
					
						
							|  |  |  |             self._vbox.pack_start(alert, False) | 
					
						
							| 
									
										
										
										
											2007-10-18 23:56:58 +02:00
										 |  |  |             if self.toolbox is not None: | 
					
						
							|  |  |  |                 self._vbox.reorder_child(alert, 1) | 
					
						
							|  |  |  |             else:    | 
					
						
							|  |  |  |                 self._vbox.reorder_child(alert, 0) | 
					
						
							|  |  |  |                  | 
					
						
							| 
									
										
										
										
											2007-10-11 20:04:04 +02:00
										 |  |  |     def remove_alert(self, alert): | 
					
						
							|  |  |  |         if alert in self._alerts: | 
					
						
							|  |  |  |             self._alerts.remove(alert) | 
					
						
							| 
									
										
										
										
											2007-10-19 16:15:43 +02:00
										 |  |  |             # if the alert is the visible one on top of the queue | 
					
						
							|  |  |  |             if alert.get_parent() is not None:                             | 
					
						
							|  |  |  |                 self._vbox.remove(alert) | 
					
						
							|  |  |  |                 if len(self._alerts) >= 1: | 
					
						
							|  |  |  |                     self._vbox.pack_start(self._alerts[0], False) | 
					
						
							|  |  |  |                     if self.toolbox is not None: | 
					
						
							|  |  |  |                         self._vbox.reorder_child(self._alerts[0], 1) | 
					
						
							|  |  |  |                     else: | 
					
						
							|  |  |  |                         self._vbox.reorder_child(self._alert[0], 0) | 
					
						
							| 
									
										
										
										
											2007-10-18 23:56:58 +02:00
										 |  |  |                      | 
					
						
							|  |  |  |     def __window_realize_cb(self, window): | 
					
						
							| 
									
										
										
										
											2007-04-26 11:31:41 +02:00
										 |  |  |         group = gtk.Window() | 
					
						
							|  |  |  |         group.realize() | 
					
						
							|  |  |  |         window.window.set_group(group.window) | 
					
						
							| 
									
										
										
										
											2007-06-15 18:03:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-18 23:56:58 +02:00
										 |  |  |     def __window_state_event_cb(self, window, event): | 
					
						
							| 
									
										
										
										
											2007-11-26 13:14:53 +01:00
										 |  |  |         if not (event.changed_mask & gtk.gdk.WINDOW_STATE_FULLSCREEN): | 
					
						
							|  |  |  |             return False | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-18 23:56:58 +02:00
										 |  |  |         if event.new_window_state & gtk.gdk.WINDOW_STATE_FULLSCREEN: | 
					
						
							|  |  |  |             if self.toolbox is not None: | 
					
						
							|  |  |  |                 self.toolbox.hide() | 
					
						
							|  |  |  |             if self.tray is not None: | 
					
						
							|  |  |  |                 self.tray.hide() | 
					
						
							| 
									
										
										
										
											2007-11-26 13:14:53 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             self._is_fullscreen = True | 
					
						
							|  |  |  |             if self.props.enable_fullscreen_mode: | 
					
						
							|  |  |  |                 self._unfullscreen_button.show() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         else: | 
					
						
							| 
									
										
										
										
											2007-10-18 23:56:58 +02:00
										 |  |  |             if self.toolbox is not None: | 
					
						
							|  |  |  |                 self.toolbox.show() | 
					
						
							|  |  |  |             if self.tray is not None: | 
					
						
							|  |  |  |                 self.tray.show() | 
					
						
							| 
									
										
										
										
											2007-10-19 22:48:21 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-26 13:14:53 +01:00
										 |  |  |             self._is_fullscreen = False | 
					
						
							|  |  |  |             if self.props.enable_fullscreen_mode: | 
					
						
							|  |  |  |                 self._unfullscreen_button.hide() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-19 22:48:21 +02:00
										 |  |  |     def __key_press_cb(self, widget, event): | 
					
						
							| 
									
										
										
										
											2007-11-26 13:14:53 +01:00
										 |  |  |         key = gtk.gdk.keyval_name(event.keyval) | 
					
						
							| 
									
										
										
										
											2007-10-19 22:48:21 +02:00
										 |  |  |         if event.state & gtk.gdk.MOD1_MASK: | 
					
						
							| 
									
										
										
										
											2007-11-26 13:14:53 +01:00
										 |  |  |             if key == 'space': | 
					
						
							| 
									
										
										
										
											2007-10-19 22:48:21 +02:00
										 |  |  |                 self.tray.props.visible = not self.tray.props.visible | 
					
						
							|  |  |  |                 return True | 
					
						
							| 
									
										
										
										
											2007-11-26 13:14:53 +01:00
										 |  |  |         elif key == 'Escape' and self._is_fullscreen and \ | 
					
						
							|  |  |  |             self.props.enable_fullscreen_mode: | 
					
						
							|  |  |  |             self.unfullscreen() | 
					
						
							|  |  |  |             return True | 
					
						
							| 
									
										
										
										
											2007-10-19 22:48:21 +02:00
										 |  |  |         return False | 
					
						
							| 
									
										
										
										
											2007-11-26 13:14:53 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def __unfullscreen_button_pressed(self, widget, event): | 
					
						
							|  |  |  |         self.unfullscreen() |