From 6bb1131e9db0cf924de221558abc6b4840ac83e1 Mon Sep 17 00:00:00 2001 From: Reinier Heeres Date: Mon, 26 Nov 2007 13:14:53 +0100 Subject: [PATCH] Add unfullscreen button to Window, #4890 --- lib/sugar/activity/activity.py | 4 ++ lib/sugar/graphics/window.py | 105 ++++++++++++++++++++++++++++++++- 2 files changed, 106 insertions(+), 3 deletions(-) diff --git a/lib/sugar/activity/activity.py b/lib/sugar/activity/activity.py index 19d67fea..2b227af0 100644 --- a/lib/sugar/activity/activity.py +++ b/lib/sugar/activity/activity.py @@ -504,12 +504,16 @@ class Activity(Window, gtk.Container): self.save() elif pspec.name == 'max-participants': self._max_participants = value + else: + Window.do_set_property(self, pspec, value) def do_get_property(self, pspec): if pspec.name == 'active': return self._active elif pspec.name == 'max-participants': return self._max_participants + else: + return Window.do_get_property(self, pspec) def get_id(self): """Returns the activity id of the current instance of your activity. diff --git a/lib/sugar/graphics/window.py b/lib/sugar/graphics/window.py index 3b3394a9..31894006 100644 --- a/lib/sugar/graphics/window.py +++ b/lib/sugar/graphics/window.py @@ -15,12 +15,73 @@ # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. +import gobject import gtk +import logging + +from sugar.graphics.icon import Icon + +class UnfullscreenButton(gtk.Window): -class Window(gtk.Window): def __init__(self): gtk.Window.__init__(self) + 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) + self.connect('realize', self.__window_realize_cb) self.connect('window-state-event', self.__window_state_event_cb) self.connect('key-press-event', self.__key_press_cb) @@ -42,6 +103,24 @@ class Window(gtk.Window): self.add(self._vbox) self._vbox.show() + 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) + def set_canvas(self, canvas): if self.canvas: self._event_box.remove(self.canvas) @@ -102,20 +181,40 @@ class Window(gtk.Window): window.window.set_group(group.window) def __window_state_event_cb(self, window, event): + if not (event.changed_mask & gtk.gdk.WINDOW_STATE_FULLSCREEN): + return False + 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() - elif event.new_window_state == 0: + + self._is_fullscreen = True + if self.props.enable_fullscreen_mode: + self._unfullscreen_button.show() + + else: if self.toolbox is not None: self.toolbox.show() if self.tray is not None: self.tray.show() + self._is_fullscreen = False + if self.props.enable_fullscreen_mode: + self._unfullscreen_button.hide() + def __key_press_cb(self, widget, event): + key = gtk.gdk.keyval_name(event.keyval) if event.state & gtk.gdk.MOD1_MASK: - if gtk.gdk.keyval_name(event.keyval) == 'space': + if key == 'space': self.tray.props.visible = not self.tray.props.visible return True + elif key == 'Escape' and self._is_fullscreen and \ + self.props.enable_fullscreen_mode: + self.unfullscreen() + return True return False + + def __unfullscreen_button_pressed(self, widget, event): + self.unfullscreen()