Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/browser.py
diff options
context:
space:
mode:
authorTomeu Vizoso <tomeu@tomeuvizoso.net>2007-05-28 14:55:23 (GMT)
committer Tomeu Vizoso <tomeu@tomeuvizoso.net>2007-05-28 14:55:23 (GMT)
commit60c5410598038adb938a6a912e998f287c939e9f (patch)
tree8e1031c5a3f7391eaae9b06e04ba647561cab103 /browser.py
parentccd96e612b15a524c34836e239ff4e05d9cb2f32 (diff)
First try at popup support.
Diffstat (limited to 'browser.py')
-rw-r--r--browser.py122
1 files changed, 62 insertions, 60 deletions
diff --git a/browser.py b/browser.py
index 36086d4..165750a 100644
--- a/browser.py
+++ b/browser.py
@@ -1,4 +1,5 @@
# Copyright (C) 2006, Red Hat, Inc.
+# Copyright (C) 2007, One Laptop Per Child
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -14,6 +15,14 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+import logging
+
+import gobject
+import gtk
+import xpcom
+from xpcom.nsError import *
+from xpcom import components
+from xpcom.components import interfaces
from hulahop.webview import WebView
import sessionstore
@@ -22,13 +31,41 @@ class Browser(WebView):
def __init__(self):
WebView.__init__(self)
+ window_creator = WindowCreator(self)
+
+ cls = components.classes['@mozilla.org/embedcomp/window-watcher;1']
+ window_watcher = cls.getService(interfaces.nsIWindowWatcher)
+
+ window_watcher.setWindowCreator(window_creator)
+
def get_session(self):
return sessionstore.get_session(self)
def set_session(self, session_data):
return sessionstore.set_session(self, session_data)
-"""
+class WindowCreator:
+ _com_interfaces_ = interfaces.nsIWindowCreator
+
+ def __init__(self, browser):
+ self._popup_creators = []
+ self._browser = browser
+
+ def createChromeWindow(self, parent, chrome_flags):
+ logging.debug('createChromeWindow: %r %r' % (parent, chrome_flags))
+
+ popup_creator = _PopupCreator(self._browser.get_toplevel())
+ popup_creator.connect('popup-created', self._popup_created_cb)
+
+ self._popup_creators.append(popup_creator)
+
+ browser = popup_creator.get_embed()
+
+ return browser.browser.containerWindow
+
+ def _popup_created_cb(self, creator):
+ self._popup_creators.remove(creator)
+
class _PopupCreator(gobject.GObject):
__gsignals__ = {
'popup-created': (gobject.SIGNAL_RUN_FIRST,
@@ -40,7 +77,6 @@ class _PopupCreator(gobject.GObject):
logging.debug('Creating the popup widget')
- self._sized_popup = False
self._parent_window = parent_window
self._dialog = gtk.Window()
@@ -49,68 +85,34 @@ class _PopupCreator(gobject.GObject):
self._dialog.realize()
self._dialog.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
- self._embed = webviewWebView()
- self._size_to_sid = self._embed.connect('size_to', self._size_to_cb)
- self._vis_sid = self._embed.connect('visibility', self._visibility_cb)
+ self._embed = Browser()
+ self._vis_sid = self._embed.connect('map', self._map_cb)
+ self._embed.show()
self._dialog.add(self._embed)
- def _size_to_cb(self, embed, width, height):
- logging.debug('Resize the popup to %d %d' % (width, height))
- self._sized_popup = True
- self._dialog.resize(width, height)
-
- def _visibility_cb(self, embed, visible):
- if visible:
- if self._sized_popup:
- logging.debug('Show the popup')
- self._embed.show()
- self._dialog.set_transient_for(self._parent_window)
- self._dialog.show()
- else:
- logging.debug('Open a new activity for the popup')
- self._dialog.remove(self._embed)
-
- # FIXME We need a better way to handle this.
- # It seem like a pretty special case though, I doubt
- # other activities will need something similar.
- from webactivity import WebActivity
- from sugar.activity import activityfactory
- from sugar.activity.activityhandle import ActivityHandle
- handle = ActivityHandle(activityfactory.create_activity_id())
- activity = WebActivity(handle, self._embed)
- activity.show()
-
- self._embed.disconnect(self._size_to_sid)
- self._embed.disconnect(self._vis_sid)
-
- self.emit('popup-created')
+ def _map_cb(self, embed):
+ if self._embed.type == Browser.TYPE_POPUP:
+ logging.debug('Show the popup')
+ self._dialog.set_transient_for(self._parent_window)
+ self._dialog.show()
+ else:
+ logging.debug('Open a new activity for the popup')
+ self._dialog.remove(self._embed)
+
+ # FIXME We need a better way to handle this.
+ # It seem like a pretty special case though, I doubt
+ # other activities will need something similar.
+ from webactivity import WebActivity
+ from sugar.activity import activityfactory
+ from sugar.activity.activityhandle import ActivityHandle
+ handle = ActivityHandle(activityfactory.create_activity_id())
+ activity = WebActivity(handle, self._embed)
+ activity.show()
+
+ self._embed.disconnect(self._vis_sid)
+ self.emit('popup-created')
def get_embed(self):
return self._embed
-
-class WebView(webview.WebView):
- __gtype_name__ = "SugarWebBrowser"
-
- def __init__(self):
- Browser.__init__(self)
- self._popup_creators = []
-
- self.connect('mouse-click', self._dom_click_cb)
-
- def _dom_click_cb(self, browser, event):
- if event.button == 3 and event.image_uri:
- menu = _ImageMenu(browser, event)
- menu.popup(None, None, None, 1, 0)
- def do_create_window(self):
- popup_creator = _PopupCreator(self.get_toplevel())
- popup_creator.connect('popup-created', self._popup_created_cb)
-
- self._popup_creators.append(popup_creator)
-
- return popup_creator.get_embed()
-
- def _popup_created_cb(self, creator):
- self._popup_creators.remove(creator)
-"""