aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog25
-rw-r--r--embed/ephy-embed-types.h3
-rw-r--r--lib/ephy-state.c20
-rw-r--r--src/ephy-shell.c19
-rw-r--r--src/ephy-window.c373
-rw-r--r--src/window-commands.c18
6 files changed, 249 insertions, 209 deletions
diff --git a/ChangeLog b/ChangeLog
index 2f9ca329c..2db79075d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,28 @@
+2003-06-19 Marco Pesenti Gritti <marco@it.gnome.org>
+
+ * embed/ephy-embed-types.h:
+ * lib/ephy-state.c: (window_configure_event_cb),
+ (window_state_event_cb):
+ * src/ephy-window.c: (ephy_window_destroy),
+ (ephy_window_class_init), (update_exit_fullscreen_popup_position),
+ (size_changed_cb), (exit_fullscreen_button_clicked_cb),
+ (update_chromes_visibility), (ephy_window_fullscreen),
+ (ephy_window_unfullscreen), (ephy_window_state_event_cb),
+ (setup_window), (sync_tab_icon), (sync_tab_load_progress),
+ (sync_tab_load_status), (ephy_window_init), (save_window_chrome),
+ (translate_default_chrome), (update_layout_toggles),
+ (ephy_window_set_chrome), (ephy_window_show):
+ * src/window-commands.c: (window_cmd_view_fullscreen):
+
+ With the gtk fullscreen api things can be cleaner:
+ use the api instead of chromes to handle fullscreen,
+ dont persist window state when it's fullscreen.
+ Destroy exit fullscreen button on window destroy.
+
+ * src/ephy-shell.c: (ephy_shell_new_tab):
+
+ Give up on cloning until we find a good way to do it :/
+
2003-06-18 Xan Lopez <xan@masilla.org>
* embed/downloader-view.c: (downloader_view_update_details):
diff --git a/embed/ephy-embed-types.h b/embed/ephy-embed-types.h
index 0e89b0c91..baae4e6f9 100644
--- a/embed/ephy-embed-types.h
+++ b/embed/ephy-embed-types.h
@@ -38,8 +38,7 @@ typedef enum
EMBED_CHROME_OPENASDIALOG = 1 << 9,
EMBED_CHROME_OPENASCHROME = 1 << 10,
EMBED_CHROME_OPENASPOPUP = 1 << 11,
- EMBED_CHROME_OPENASFULLSCREEN = 1 << 12,
- EMBED_CHROME_PPVIEWTOOLBARON = 1 << 13
+ EMBED_CHROME_PPVIEWTOOLBARON = 1 << 12
} EmbedChromeMask;
G_END_DECLS
diff --git a/lib/ephy-state.c b/lib/ephy-state.c
index a23533ae4..52d8ef931 100644
--- a/lib/ephy-state.c
+++ b/lib/ephy-state.c
@@ -286,8 +286,16 @@ window_configure_event_cb (GtkWidget *widget,
GdkEventConfigure *event,
EphyNode *node)
{
- ephy_state_window_save_size (widget, node);
- ephy_state_window_save_position (widget, node);
+ GdkWindowState state;
+
+ state = gdk_window_get_state (widget->window);
+
+ if (!(state & GDK_WINDOW_STATE_FULLSCREEN))
+ {
+ ephy_state_window_save_size (widget, node);
+ ephy_state_window_save_position (widget, node);
+ }
+
return FALSE;
}
@@ -296,8 +304,12 @@ window_state_event_cb (GtkWidget *widget,
GdkEventWindowState *event,
EphyNode *node)
{
- ephy_state_window_save_size (widget, node);
- ephy_state_window_save_position (widget, node);
+ if (!(event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN))
+ {
+ ephy_state_window_save_size (widget, node);
+ ephy_state_window_save_position (widget, node);
+ }
+
return FALSE;
}
diff --git a/src/ephy-shell.c b/src/ephy-shell.c
index 8e3201fda..5489222d6 100644
--- a/src/ephy-shell.c
+++ b/src/ephy-shell.c
@@ -399,25 +399,13 @@ ephy_shell_new_tab (EphyShell *shell,
jump_to);
gtk_widget_show (GTK_WIDGET(window));
- if (flags & EPHY_NEW_TAB_HOME_PAGE)
+ if (flags & EPHY_NEW_TAB_HOME_PAGE ||
+ flags & EPHY_NEW_TAB_NEW_PAGE)
{
toolbar_edit_location (toolbar);
load_homepage (embed);
}
- else if (flags & EPHY_NEW_TAB_NEW_PAGE)
- {
- char *previous_address = NULL;
-
- g_return_val_if_fail (previous_embed != NULL, NULL);
- ephy_embed_get_location (previous_embed, TRUE,
- &previous_address);
- toolbar_set_location (toolbar, previous_address);
- toolbar_edit_location (toolbar);
- g_free (previous_address);
-
- load_homepage (embed);
- }
else if (flags & EPHY_NEW_TAB_OPEN_PAGE)
{
g_assert (url != NULL);
@@ -436,8 +424,7 @@ ephy_shell_new_tab (EphyShell *shell,
if (flags & EPHY_NEW_TAB_FULLSCREEN_MODE)
{
- ephy_window_set_chrome (window, EMBED_CHROME_OPENASFULLSCREEN |
- EMBED_CHROME_DEFAULT);
+ gtk_window_fullscreen (GTK_WINDOW (window));
}
return tab;
diff --git a/src/ephy-window.c b/src/ephy-window.c
index 32b0a89c8..d7bbd9e24 100644
--- a/src/ephy-window.c
+++ b/src/ephy-window.c
@@ -279,6 +279,7 @@ struct EphyWindowPrivate
EphyDialog *find_dialog;
EmbedChromeMask chrome_mask;
gboolean closing;
+ gboolean is_fullscreen;
guint num_tabs;
};
@@ -326,16 +327,37 @@ ephy_window_get_type (void)
}
static void
+ephy_window_destroy (GtkObject *gtkobject)
+{
+ EphyWindow *window = EPHY_WINDOW (gtkobject);
+
+ LOG ("EphyWindow destroy %p", window)
+
+ window->priv->closing = TRUE;
+
+ if (window->priv->exit_fullscreen_popup)
+ {
+ gtk_widget_destroy (window->priv->exit_fullscreen_popup);
+ window->priv->exit_fullscreen_popup = NULL;
+ }
+
+ GTK_OBJECT_CLASS (parent_class)->destroy (gtkobject);
+}
+
+static void
ephy_window_class_init (EphyWindowClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+ GtkObjectClass *gtkobject_class = GTK_OBJECT_CLASS (klass);
parent_class = g_type_class_peek_parent (klass);
object_class->finalize = ephy_window_finalize;
widget_class->show = ephy_window_show;
+
+ gtkobject_class->destroy = ephy_window_destroy;
}
static void
@@ -425,11 +447,172 @@ menu_activate_cb (GtkWidget *widget,
}
static void
-ephy_window_destroy_cb (GtkWidget *widget, EphyWindow *window)
+update_exit_fullscreen_popup_position (EphyWindow *window)
{
- LOG ("EphyWindow destroy %p", window)
+ GdkRectangle screen_rect;
+ int popup_height;
- window->priv->closing = TRUE;
+ gtk_window_get_size (GTK_WINDOW (window->priv->exit_fullscreen_popup),
+ NULL, &popup_height);
+
+ gdk_screen_get_monitor_geometry (gdk_screen_get_default (),
+ gdk_screen_get_monitor_at_window
+ (gdk_screen_get_default (),
+ GTK_WIDGET (window)->window),
+ &screen_rect);
+
+ gtk_window_move (GTK_WINDOW (window->priv->exit_fullscreen_popup),
+ screen_rect.x, screen_rect.height - popup_height);
+}
+
+static void
+size_changed_cb (GdkScreen *screen, EphyWindow *window)
+{
+ update_exit_fullscreen_popup_position (window);
+}
+
+static void
+exit_fullscreen_button_clicked_cb (GtkWidget *button, EphyWindow *window)
+{
+ gtk_window_unfullscreen (GTK_WINDOW (window));
+}
+
+static void
+update_chromes_visibility (EphyWindow *window)
+{
+ EmbedChromeMask flags = window->priv->chrome_mask;
+ gboolean fullscreen;
+
+ fullscreen = window->priv->is_fullscreen;
+
+ if (!fullscreen && flags & EMBED_CHROME_MENUBARON)
+ {
+ gtk_widget_show (window->priv->menubar);
+ }
+ else
+ {
+ gtk_widget_hide (window->priv->menubar);
+ }
+
+ toolbar_set_visibility (window->priv->toolbar,
+ flags & EMBED_CHROME_TOOLBARON,
+ flags & EMBED_CHROME_BOOKMARKSBARON);
+
+ if (!fullscreen && flags & EMBED_CHROME_STATUSBARON)
+ {
+ gtk_widget_show (window->priv->statusbar);
+ }
+ else
+ {
+ gtk_widget_hide (window->priv->statusbar);
+ }
+
+ if ((flags & EMBED_CHROME_PPVIEWTOOLBARON) != FALSE)
+ {
+ if (!window->priv->ppview_toolbar)
+ {
+ window->priv->ppview_toolbar = ppview_toolbar_new (window);
+ }
+ }
+ else
+ {
+ if (window->priv->ppview_toolbar)
+ {
+ g_object_unref (window->priv->ppview_toolbar);
+ window->priv->ppview_toolbar = NULL;
+ }
+ }
+}
+
+static void
+ephy_window_fullscreen (EphyWindow *window)
+{
+ GtkWidget *popup, *button, *icon, *label, *hbox;
+ EphyToolbarsModel *tmodel;
+
+ window->priv->is_fullscreen = TRUE;
+
+ tmodel = ephy_shell_get_toolbars_model (ephy_shell);
+ ephy_toolbars_model_set_flag (tmodel, EGG_TB_MODEL_ICONS_ONLY);
+
+ popup = gtk_window_new (GTK_WINDOW_POPUP);
+ window->priv->exit_fullscreen_popup = popup;
+
+ button = gtk_button_new ();
+ g_signal_connect (button, "clicked",
+ G_CALLBACK (exit_fullscreen_button_clicked_cb),
+ window);
+ gtk_widget_show (button);
+ gtk_container_add (GTK_CONTAINER (popup), button);
+
+ hbox = gtk_hbox_new (FALSE, 2);
+ gtk_widget_show (hbox);
+ gtk_container_add (GTK_CONTAINER (button), hbox);
+
+ icon = gtk_image_new_from_stock (GTK_STOCK_QUIT, GTK_ICON_SIZE_BUTTON);
+ gtk_widget_show (icon);
+ gtk_box_pack_start (GTK_BOX (hbox), icon, FALSE, FALSE, 0);
+
+ label = gtk_label_new (_("Exit Fullscreen"));
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+ update_exit_fullscreen_popup_position (window);
+
+ gtk_widget_show (popup);
+
+ g_signal_connect (G_OBJECT (gdk_screen_get_default ()),
+ "size-changed", G_CALLBACK (size_changed_cb),
+ popup);
+
+ update_chromes_visibility (window);
+}
+
+static void
+ephy_window_unfullscreen (EphyWindow *window)
+{
+ EphyToolbarsModel *tmodel;
+
+ window->priv->is_fullscreen = FALSE;
+
+ tmodel = ephy_shell_get_toolbars_model (ephy_shell);
+ ephy_toolbars_model_unset_flag (tmodel, EGG_TB_MODEL_ICONS_ONLY);
+
+ g_signal_handlers_disconnect_by_func (G_OBJECT (gdk_screen_get_default ()),
+ G_CALLBACK (size_changed_cb),
+ window);
+
+ gtk_widget_destroy (window->priv->exit_fullscreen_popup);
+ window->priv->exit_fullscreen_popup = NULL;
+
+ update_chromes_visibility (window);
+}
+
+static gboolean
+ephy_window_state_event_cb (GtkWidget *widget, GdkEventWindowState *event, EphyWindow *window)
+{
+ if (event->changed_mask & GDK_WINDOW_STATE_FULLSCREEN)
+ {
+ EggAction *action;
+ gboolean fullscreen;
+
+ fullscreen = event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN;
+
+ if (fullscreen)
+ {
+ ephy_window_fullscreen (window);
+ }
+ else
+ {
+ ephy_window_unfullscreen (window);
+ }
+
+ action = egg_action_group_get_action (window->priv->action_group,
+ "ViewFullscreen");
+ egg_toggle_action_set_active (EGG_TOGGLE_ACTION (action), fullscreen);
+ }
+
+ return FALSE;
}
static void
@@ -506,8 +689,8 @@ setup_window (EphyWindow *window)
"selection-received",
G_CALLBACK (ephy_window_selection_received_cb),
window);
- g_signal_connect (window, "destroy",
- G_CALLBACK (ephy_window_destroy_cb),
+ g_signal_connect (window, "window-state-event",
+ G_CALLBACK (ephy_window_state_event_cb),
window);
}
@@ -567,7 +750,7 @@ sync_tab_icon (EphyTab *tab, GParamSpec *pspec, EphyWindow *window)
(EPHY_EMBED_SHELL (ephy_shell));
address = ephy_tab_get_icon_address (tab);
-
+
if (address)
{
pixbuf = ephy_favicon_cache_get (cache, address);
@@ -589,7 +772,7 @@ sync_tab_load_progress (EphyTab *tab, GParamSpec *pspec, EphyWindow *window)
if (window->priv->closing) return;
statusbar_set_progress (STATUSBAR (window->priv->statusbar),
- ephy_tab_get_load_percent (tab));
+ ephy_tab_get_load_percent (tab));
}
static void
@@ -599,7 +782,7 @@ sync_tab_load_status (EphyTab *tab, GParamSpec *pspec, EphyWindow *window)
GList *tabs, *l;
if (window->priv->closing) return;
-
+
tabs = ephy_window_get_tabs (window);
for (l = tabs; l != NULL; l = l->next)
{
@@ -1089,6 +1272,7 @@ ephy_window_init (EphyWindow *window)
window->priv->ppview_toolbar = NULL;
window->priv->exit_fullscreen_popup = NULL;
window->priv->num_tabs = 0;
+ window->priv->is_fullscreen = FALSE;
/* Setup the window and connect verbs */
setup_window (window);
@@ -1123,8 +1307,7 @@ save_window_chrome (EphyWindow *window)
EmbedChromeMask flags = window->priv->chrome_mask;
if (!(flags & EMBED_CHROME_OPENASPOPUP) &&
- !(flags & EMBED_CHROME_PPVIEWTOOLBARON) &&
- !(flags & EMBED_CHROME_OPENASFULLSCREEN))
+ !(flags & EMBED_CHROME_PPVIEWTOOLBARON))
{
eel_gconf_set_boolean (CONF_WINDOWS_SHOW_BOOKMARKS_BAR,
flags & EMBED_CHROME_BOOKMARKSBARON);
@@ -1217,12 +1400,10 @@ translate_default_chrome (EmbedChromeMask *chrome_mask)
EMBED_CHROME_CENTERSCREEN |
EMBED_CHROME_OPENASDIALOG |
EMBED_CHROME_OPENASCHROME |
- EMBED_CHROME_OPENASPOPUP |
- EMBED_CHROME_OPENASFULLSCREEN);
+ EMBED_CHROME_OPENASPOPUP);
/* Load defaults */
- if (eel_gconf_get_boolean (CONF_WINDOWS_SHOW_STATUSBAR) &&
- !(*chrome_mask & EMBED_CHROME_OPENASFULLSCREEN))
+ if (eel_gconf_get_boolean (CONF_WINDOWS_SHOW_STATUSBAR))
{
*chrome_mask |= EMBED_CHROME_STATUSBARON;
}
@@ -1235,11 +1416,7 @@ translate_default_chrome (EmbedChromeMask *chrome_mask)
*chrome_mask |= EMBED_CHROME_BOOKMARKSBARON;
}
- // Show the menu bar if we're not in fullscreen
- if (!(*chrome_mask & EMBED_CHROME_OPENASFULLSCREEN))
- {
- *chrome_mask |= EMBED_CHROME_MENUBARON;
- }
+ *chrome_mask |= EMBED_CHROME_MENUBARON;
}
static void
@@ -1260,108 +1437,6 @@ update_layout_toggles (EphyWindow *window)
action = egg_action_group_get_action (action_group, "ViewStatusbar");
egg_toggle_action_set_active (EGG_TOGGLE_ACTION (action),
mask & EMBED_CHROME_STATUSBARON);
-
- action = egg_action_group_get_action (action_group, "ViewFullscreen");
- egg_toggle_action_set_active (EGG_TOGGLE_ACTION (action),
- mask & EMBED_CHROME_OPENASFULLSCREEN);
-}
-
-static void
-update_exit_fullscreen_popup_position (EphyWindow *window)
-{
- GdkRectangle screen_rect;
- int popup_height;
-
- gtk_window_get_size (GTK_WINDOW (window->priv->exit_fullscreen_popup),
- NULL, &popup_height);
-
- gdk_screen_get_monitor_geometry (gdk_screen_get_default (),
- gdk_screen_get_monitor_at_window
- (gdk_screen_get_default (),
- GTK_WIDGET (window)->window),
- &screen_rect);
-
- gtk_window_move (GTK_WINDOW (window->priv->exit_fullscreen_popup),
- screen_rect.x, screen_rect.height - popup_height);
-}
-
-static void
-size_changed_cb (GdkScreen *screen, EphyWindow *window)
-{
- update_exit_fullscreen_popup_position (window);
-}
-
-static void
-exit_fullscreen_button_clicked_cb (GtkWidget *button, EphyWindow *window)
-{
- EmbedChromeMask mask;
-
- mask = ephy_window_get_chrome (window);
-
- mask ^= EMBED_CHROME_OPENASFULLSCREEN;
- mask |= EMBED_CHROME_DEFAULT;
-
- ephy_window_set_chrome (window, mask);
-}
-
-static void
-ephy_window_fullscreen (EphyWindow *window)
-{
- GtkWidget *popup, *button, *icon, *label, *hbox;
- EphyToolbarsModel *tmodel;
-
- gtk_window_fullscreen (GTK_WINDOW (window));
-
- tmodel = ephy_shell_get_toolbars_model (ephy_shell);
- ephy_toolbars_model_set_flag (tmodel, EGG_TB_MODEL_ICONS_ONLY);
-
- popup = gtk_window_new (GTK_WINDOW_POPUP);
- window->priv->exit_fullscreen_popup = popup;
-
- button = gtk_button_new ();
- g_signal_connect (button, "clicked",
- G_CALLBACK (exit_fullscreen_button_clicked_cb),
- window);
- gtk_widget_show (button);
- gtk_container_add (GTK_CONTAINER (popup), button);
-
- hbox = gtk_hbox_new (FALSE, 2);
- gtk_widget_show (hbox);
- gtk_container_add (GTK_CONTAINER (button), hbox);
-
- icon = gtk_image_new_from_stock (GTK_STOCK_QUIT, GTK_ICON_SIZE_BUTTON);
- gtk_widget_show (icon);
- gtk_box_pack_start (GTK_BOX (hbox), icon, FALSE, FALSE, 0);
-
- label = gtk_label_new (_("Exit Fullscreen"));
- gtk_widget_show (label);
- gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
-
- update_exit_fullscreen_popup_position (window);
-
- gtk_widget_show (popup);
-
- g_signal_connect (G_OBJECT (gdk_screen_get_default ()),
- "size-changed", G_CALLBACK (size_changed_cb),
- popup);
-}
-
-static void
-ephy_window_unfullscreen (EphyWindow *window)
-{
- EphyToolbarsModel *tmodel;
-
- tmodel = ephy_shell_get_toolbars_model (ephy_shell);
- ephy_toolbars_model_unset_flag (tmodel, EGG_TB_MODEL_ICONS_ONLY);
-
- g_signal_handlers_disconnect_by_func (G_OBJECT (gdk_screen_get_default ()),
- G_CALLBACK (size_changed_cb),
- window);
-
- gtk_widget_destroy (window->priv->exit_fullscreen_popup);
- window->priv->exit_fullscreen_popup = NULL;
-
- gtk_window_unfullscreen (GTK_WINDOW (window));
}
void
@@ -1374,61 +1449,10 @@ ephy_window_set_chrome (EphyWindow *window,
translate_default_chrome (&flags);
}
- if (flags & EMBED_CHROME_MENUBARON)
- {
- gtk_widget_show (window->priv->menubar);
- }
- else
- {
- gtk_widget_hide (window->priv->menubar);
- }
-
- toolbar_set_visibility (window->priv->toolbar,
- flags & EMBED_CHROME_TOOLBARON,
- flags & EMBED_CHROME_BOOKMARKSBARON);
-
- if (flags & EMBED_CHROME_STATUSBARON)
- {
- gtk_widget_show (window->priv->statusbar);
- }
- else
- {
- gtk_widget_hide (window->priv->statusbar);
- }
-
- if ((flags & EMBED_CHROME_PPVIEWTOOLBARON) != FALSE)
- {
- if (!window->priv->ppview_toolbar)
- {
- window->priv->ppview_toolbar = ppview_toolbar_new (window);
- }
- }
- else
- {
- if (window->priv->ppview_toolbar)
- {
- g_object_unref (window->priv->ppview_toolbar);
- window->priv->ppview_toolbar = NULL;
- }
- }
-
- /* set fullscreen only when it's really changed */
- if ((window->priv->chrome_mask & EMBED_CHROME_OPENASFULLSCREEN) !=
- (flags & EMBED_CHROME_OPENASFULLSCREEN))
- {
- save_window_chrome (window);
- if (flags & EMBED_CHROME_OPENASFULLSCREEN)
- {
- ephy_window_fullscreen (window);
- }
- else
- {
- ephy_window_unfullscreen (window);
- }
- }
-
window->priv->chrome_mask = flags;
+ update_chromes_visibility (window);
+
update_layout_toggles (window);
save_window_chrome (window);
@@ -1537,7 +1561,6 @@ ephy_window_show (GtkWidget *widget)
}
if (!(window->priv->chrome_mask & EMBED_CHROME_OPENASPOPUP) &&
- !(window->priv->chrome_mask & EMBED_CHROME_OPENASFULLSCREEN) &&
!GTK_WIDGET_VISIBLE (widget))
{
ephy_state_add_window (widget,
diff --git a/src/window-commands.c b/src/window-commands.c
index 22da177b3..a42849b51 100644
--- a/src/window-commands.c
+++ b/src/window-commands.c
@@ -570,19 +570,13 @@ void
window_cmd_view_fullscreen (EggAction *action,
EphyWindow *window)
{
- EmbedChromeMask mask;
- gboolean active;
- gboolean current_state;
-
- mask = ephy_window_get_chrome (window);
- active = EGG_TOGGLE_ACTION (action)->active;
- current_state = (mask & EMBED_CHROME_OPENASFULLSCREEN) > 0;
-
- if (active != current_state)
+ if (EGG_TOGGLE_ACTION (action)->active)
{
- mask ^= EMBED_CHROME_OPENASFULLSCREEN;
- mask |= EMBED_CHROME_DEFAULT;
- ephy_window_set_chrome (window, mask);
+ gtk_window_fullscreen (GTK_WINDOW (window));
+ }
+ else
+ {
+ gtk_window_unfullscreen (GTK_WINDOW (window));
}
}