Index: configure.ac =================================================================== RCS file: /cvs/gnome/epiphany/configure.ac,v retrieving revision 1.75 diff -p -u -u -p -r1.75 configure.ac --- configure.ac 21 Mar 2005 22:01:06 -0000 1.75 +++ configure.ac 26 Mar 2005 15:03:37 -0000 @@ -460,6 +460,10 @@ fi AC_MSG_RESULT([$broken_reload]) +dnl Broken everywhere + +AC_DEFINE([GTKMOZEMBED_BROKEN_FOCUS],[1],[Define if GtkMozEmbed has broken focus handling]) + dnl check for broken contextmenu event dnl This is fixed since 1.8a4 dnl https://bugzilla.mozilla.org/show_bug.cgi?id=258193 Index: embed/mozilla/EphyBrowser.cpp =================================================================== RCS file: /cvs/gnome/epiphany/embed/mozilla/EphyBrowser.cpp,v retrieving revision 1.76 diff -p -u -u -p -r1.76 EphyBrowser.cpp --- embed/mozilla/EphyBrowser.cpp 28 Jan 2005 22:23:38 -0000 1.76 +++ embed/mozilla/EphyBrowser.cpp 26 Mar 2005 15:03:38 -0000 @@ -1311,3 +1311,23 @@ EphyBrowser::GetDocumentType () return type; } + +#ifdef GTKMOZEMBED_BROKEN_FOCUS +void +EphyBrowser::FocusActivate () +{ + nsCOMPtr focus (do_GetInterface (mWebBrowser)); + if (!focus) return; + + focus->Activate(); +} + +void +EphyBrowser::FocusDeactivate () +{ + nsCOMPtr focus (do_GetInterface (mWebBrowser)); + if (!focus) return; + + focus->Deactivate(); +} +#endif /* GTKMOZEMBED_BROKEN_FOCUS */ Index: embed/mozilla/EphyBrowser.h =================================================================== RCS file: /cvs/gnome/epiphany/embed/mozilla/EphyBrowser.h,v retrieving revision 1.37 diff -p -u -u -p -r1.37 EphyBrowser.h --- embed/mozilla/EphyBrowser.h 23 Jan 2005 15:38:02 -0000 1.37 +++ embed/mozilla/EphyBrowser.h 26 Mar 2005 15:03:38 -0000 @@ -170,6 +170,11 @@ public: EphyEmbedDocumentType GetDocumentType (); +#ifdef GTKMOZEMBED_BROKEN_FOCUS + void FocusActivate (); + void FocusDeactivate (); +#endif + nsCOMPtr mWebBrowser; private: GtkWidget *mEmbed; Index: embed/mozilla/mozilla-embed.cpp =================================================================== RCS file: /cvs/gnome/epiphany/embed/mozilla/mozilla-embed.cpp,v retrieving revision 1.101 diff -p -u -u -p -r1.101 mozilla-embed.cpp --- embed/mozilla/mozilla-embed.cpp 31 Jan 2005 13:53:05 -0000 1.101 +++ embed/mozilla/mozilla-embed.cpp 26 Mar 2005 15:03:39 -0000 @@ -88,12 +88,20 @@ struct MozillaEmbedPrivate { EphyBrowser *browser; MozillaEmbedLoadState load_state; +#ifdef GTKMOZEMBED_BROKEN_FOCUS + gboolean blocked; +#endif /* GTKMOZEMBED_BROKEN_FOCUS */ }; #define WINDOWWATCHER_CONTRACTID "@mozilla.org/embedcomp/window-watcher;1" static GObjectClass *parent_class = NULL; +#ifdef GTKMOZEMBED_BROKEN_FOCUS +static guint fiesid = 0; +static guint foesid = 0; +#endif /* GTKMOZEMBED_BROKEN_FOCUS */ + static void impl_manager_do_command (EphyCommandManager *manager, const char *command) @@ -207,12 +215,36 @@ impl_find_set_properties (EphyEmbed *emb wrap_around); } +#ifdef GTKMOZEMBED_BROKEN_FOCUS +static gboolean +child_focus_out_event_cb (GtkWidget *child, + GdkEventFocus *event, + MozillaEmbed *embed) +{ + embed->priv->browser->FocusDeactivate (); + + return FALSE; +} +#endif /* GTKMOZEMBED_BROKEN_FOCUS */ + static void mozilla_embed_realize (GtkWidget *widget) { MozillaEmbedPrivate *mpriv = MOZILLA_EMBED (widget)->priv; - - (* GTK_WIDGET_CLASS(parent_class)->realize) (widget); + GtkBin *bin = GTK_BIN (widget); +#ifdef GTKMOZEMBED_BROKEN_FOCUS + GtkWidget *toplevel; + + toplevel = gtk_widget_get_toplevel (widget); +#endif /* GTKMOZEMBED_BROKEN_FOCUS */ + + GTK_WIDGET_CLASS (parent_class)->realize (widget); + +#ifdef GTKMOZEMBED_BROKEN_FOCUS + g_signal_connect_object (bin->child, "focus-out-event", + G_CALLBACK (child_focus_out_event_cb), widget, + G_CONNECT_AFTER); +#endif /* GTKMOZEMBED_BROKEN_FOCUS */ nsresult rv; rv = mpriv->browser->Init (GTK_MOZ_EMBED (widget)); @@ -223,6 +255,80 @@ mozilla_embed_realize (GtkWidget *widget } } +#ifdef GTKMOZEMBED_BROKEN_FOCUS +static void +mozilla_embed_unrealize (GtkWidget *widget) +{ + MozillaEmbedPrivate *mpriv = MOZILLA_EMBED (widget)->priv; + GtkBin *bin = GTK_BIN (widget); + + g_signal_handlers_disconnect_by_func + (bin->child, (void *) child_focus_out_event_cb, widget); + + GTK_WIDGET_CLASS (parent_class)->unrealize (widget); + + mpriv->blocked = FALSE; +} + +static void +mozilla_embed_map (GtkWidget *widget) +{ + MozillaEmbedPrivate *mpriv = MOZILLA_EMBED (widget)->priv; + gpointer data = ((GtkMozEmbed *) widget)->data; + GtkWidget *toplevel; + + toplevel = gtk_widget_get_toplevel (widget); + + GTK_WIDGET_CLASS (parent_class)->map (widget); + + if (mpriv->blocked) + { + g_signal_handlers_unblock_matched (toplevel, + (GSignalMatchType) (G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_DATA), + fiesid, 0, NULL, NULL, data); + g_signal_handlers_unblock_matched (toplevel, + (GSignalMatchType) (G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_DATA), + foesid, 0, NULL, NULL, data); + + mpriv->blocked = FALSE; + } + + if (gtk_window_has_toplevel_focus (GTK_WINDOW (toplevel))) + { + mpriv->browser->FocusActivate (); + } +} + +static void +mozilla_embed_unmap (GtkWidget *widget) +{ + MozillaEmbedPrivate *mpriv = MOZILLA_EMBED (widget)->priv; + gpointer data = ((GtkMozEmbed *) widget)->data; + GtkWidget *toplevel; + + toplevel = gtk_widget_get_toplevel (widget); + + if (!mpriv->blocked) + { + g_signal_handlers_block_matched (toplevel, + (GSignalMatchType) (G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_DATA), + fiesid, 0, NULL, NULL, data); + g_signal_handlers_block_matched (toplevel, + (GSignalMatchType) (G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_DATA), + foesid, 0, NULL, NULL, data); + + mpriv->blocked = TRUE; + } + + if (gtk_window_has_toplevel_focus (GTK_WINDOW (toplevel))) + { + mpriv->browser->FocusDeactivate (); + } + + GTK_WIDGET_CLASS (parent_class)->unmap (widget); +} +#endif /* GTKMOZEMBED_BROKEN_FOCUS */ + static GObject * mozilla_embed_constructor (GType type, guint n_construct_properties, GObjectConstructParam *construct_params) @@ -249,6 +355,15 @@ mozilla_embed_class_init (MozillaEmbedCl gtk_object_class->destroy = mozilla_embed_destroy; widget_class->realize = mozilla_embed_realize; + +#ifdef GTKMOZEMBED_BROKEN_FOCUS + widget_class->unrealize = mozilla_embed_unrealize; + widget_class->map = mozilla_embed_map; + widget_class->unmap = mozilla_embed_unmap; + + fiesid = g_signal_lookup ("focus-in-event", GTK_TYPE_WIDGET); + foesid = g_signal_lookup ("focus-out-event", GTK_TYPE_WIDGET); +#endif /* GTKMOZEMBED_BROKEN_FOCUS */ g_type_class_add_private (object_class, sizeof(MozillaEmbedPrivate)); } Index: src/ephy-shell.c =================================================================== RCS file: /cvs/gnome/epiphany/src/ephy-shell.c,v retrieving revision 1.120 diff -p -u -u -p -r1.120 ephy-shell.c --- src/ephy-shell.c 21 Feb 2005 11:23:21 -0000 1.120 +++ src/ephy-shell.c 26 Mar 2005 15:03:39 -0000 @@ -624,10 +624,25 @@ ephy_shell_new (void) return EPHY_SHELL (g_object_new (EPHY_TYPE_SHELL, NULL)); } -static void +static gboolean +url_is_empty (const char *location) +{ + gboolean is_empty = FALSE; + + if (location == NULL || location[0] == '\0' || + strcmp (location, "about:blank") == 0) + { + is_empty = TRUE; + } + + return is_empty; +} + +static gboolean load_homepage (EphyEmbed *embed) { char *home; + gboolean is_empty; home = eel_gconf_get_string(CONF_GENERAL_HOMEPAGE); @@ -638,9 +653,13 @@ load_homepage (EphyEmbed *embed) home = g_strdup ("about:blank"); } + is_empty = url_is_empty (home); + ephy_embed_load_url (embed, home); g_free (home); + + return is_empty; } /** @@ -674,6 +693,7 @@ ephy_shell_new_tab_full (EphyShell *shel EphyEmbed *previous_embed = NULL; GtkWidget *nb; int position = -1; + gboolean is_empty = FALSE; EphyToolbar *toolbar; if (flags & EPHY_NEW_TAB_IN_NEW_WINDOW) in_new_window = TRUE; @@ -695,8 +715,6 @@ ephy_shell_new_tab_full (EphyShell *shel window = ephy_window_new_with_chrome (chrome); } - toolbar = EPHY_TOOLBAR (ephy_window_get_toolbar (window)); - if (previous_tab != NULL) { previous_embed = ephy_tab_get_embed (previous_tab); @@ -731,14 +749,34 @@ ephy_shell_new_tab_full (EphyShell *shel flags & EPHY_NEW_TAB_NEW_PAGE) { ephy_tab_set_location (tab, "", EPHY_TAB_ADDRESS_EXPIRE_NEXT); - ephy_toolbar_activate_location (toolbar); - load_homepage (embed); + is_empty = load_homepage (embed); } else if (flags & EPHY_NEW_TAB_OPEN_PAGE) { g_assert (url != NULL); ephy_embed_load_url (embed, url); + is_empty = url_is_empty (url); } + + /* Make sure the initial focus is somewhere sensible and not, for + * example, on the reload button. + */ + if (in_new_window || jump_to) + { + /* If the location entry is blank, focus that, except if the + * page was a copy */ + if (is_empty) + { + /* empty page, focus location entry */ + toolbar = EPHY_TOOLBAR (ephy_window_get_toolbar (window)); + ephy_toolbar_activate_location (toolbar); + } + else if (embed != NULL) + { + /* non-empty page, focus the page */ + ephy_embed_activate (embed); + } + } return tab; }