From 60c5410598038adb938a6a912e998f287c939e9f Mon Sep 17 00:00:00 2001 From: Tomeu Vizoso Date: Mon, 28 May 2007 14:55:23 +0000 Subject: First try at popup support. --- (limited to 'browser.py') 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) -""" -- cgit v0.9.1