From ea0c028cac3617d74e542577837631a2c1f6c69a Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Tue, 21 Feb 2012 20:54:31 +0000 Subject: fix favicon display svn path=/trunk/netsurf/; revision=13460 --- gtk/scaffolding.c | 91 ++++++++++++++++++++++++++++++------------------------- gtk/scaffolding.h | 1 + gtk/tabs.c | 14 ++------- gtk/window.c | 43 ++++++++++++++++++++++---- gtk/window.h | 1 + 5 files changed, 92 insertions(+), 58 deletions(-) (limited to 'gtk') diff --git a/gtk/scaffolding.c b/gtk/scaffolding.c index 5ddc1b798..27aff2f97 100644 --- a/gtk/scaffolding.c +++ b/gtk/scaffolding.c @@ -494,7 +494,7 @@ static gboolean nsgtk_window_tool_bar_clicked(GtkToolbar *toolbar, /** * Update the menus when the number of tabs changes. */ -static void nsgtk_window_tabs_num_changed(GtkNotebook *notebook, +static void nsgtk_window_tabs_add(GtkNotebook *notebook, GtkWidget *page, guint page_num, struct gtk_scaffolding *g) { gboolean visible = gtk_notebook_get_show_tabs(g->notebook); @@ -506,6 +506,26 @@ static void nsgtk_window_tabs_num_changed(GtkNotebook *notebook, nsgtk_scaffolding_set_sensitivity(g); } +/** + * Update the menus when the number of tabs changes. + */ +static void nsgtk_window_tabs_remove(GtkNotebook *notebook, + GtkWidget *page, guint page_num, struct gtk_scaffolding *g) +{ + + if (gtk_notebook_get_n_pages(notebook) == 0) { + nsgtk_scaffolding_destroy(g); + } else { + gboolean visible = gtk_notebook_get_show_tabs(g->notebook); + g_object_set(g->menu_bar->view_submenu->tabs_menuitem, "visible", visible, NULL); + g_object_set(g->menu_popup->view_submenu->tabs_menuitem, "visible", visible, NULL); + g->buttons[NEXTTAB_BUTTON]->sensitivity = visible; + g->buttons[PREVTAB_BUTTON]->sensitivity = visible; + g->buttons[CLOSETAB_BUTTON]->sensitivity = visible; + nsgtk_scaffolding_set_sensitivity(g); + } +} + /** * Handle opening a file path. */ @@ -1844,9 +1864,9 @@ nsgtk_scaffolding *nsgtk_new_scaffolding(struct gui_window *toplevel) gtk_widget_hide_on_delete, NULL); g_signal_connect_after(g->notebook, "page-added", - G_CALLBACK(nsgtk_window_tabs_num_changed), g); + G_CALLBACK(nsgtk_window_tabs_add), g); g_signal_connect_after(g->notebook, "page-removed", - G_CALLBACK(nsgtk_window_tabs_num_changed), g); + G_CALLBACK(nsgtk_window_tabs_remove), g); /* connect signals to handlers. */ CONNECT(g->window, "delete-event", nsgtk_window_delete_event, g); @@ -1935,13 +1955,9 @@ void gui_window_set_title(struct gui_window *_g, const char *title) nsgtk_tab_set_title(_g, title); if (g->top_level == _g) { - if (title == NULL || title[0] == '\0') - { + if (title == NULL || title[0] == '\0') { gtk_window_set_title(g->window, "NetSurf"); - - } - else - { + } else { strcpy(nt, title); strcat(nt, suffix); gtk_window_set_title(g->window, nt); @@ -1994,42 +2010,23 @@ void gui_window_stop_throbber(struct gui_window* _g) /** * set favicon */ -void gui_window_set_icon(struct gui_window *_g, hlcache_handle *icon) +void +nsgtk_scaffolding_set_icon(struct gui_window *gw) { - struct gtk_scaffolding *g = nsgtk_get_scaffold(_g); - struct bitmap *icon_bitmap = NULL; - GdkPixbuf *icon_pixbuf = NULL; + struct gtk_scaffolding *sc = nsgtk_get_scaffold(gw); + GdkPixbuf *icon_pixbuf = nsgtk_get_icon(gw); - if (g->top_level != _g) { + /* check icon needs to be shown */ + if ((icon_pixbuf == NULL) || + (sc->top_level != gw)) { return; } - if (icon != NULL) { - icon_bitmap = content_get_bitmap(icon); - if (icon_bitmap != NULL) { - LOG(("Using %p bitmap", icon_bitmap)); - icon_pixbuf = nsgdk_pixbuf_get_from_surface(icon_bitmap->surface, 16, 16); - } - } - - if (icon_pixbuf == NULL) { - LOG(("Using default favicon")); - g_object_ref(favicon_pixbuf); - icon_pixbuf = favicon_pixbuf; - } - - if (icon_pixbuf == NULL) { - return; - } - - nsgtk_entry_set_icon_from_pixbuf(g->url_bar, + nsgtk_entry_set_icon_from_pixbuf(sc->url_bar, GTK_ENTRY_ICON_PRIMARY, icon_pixbuf); - gtk_widget_show_all(GTK_WIDGET(g->buttons[URL_BAR_ITEM]->button)); - - g_object_unref(icon_pixbuf); - + gtk_widget_show_all(GTK_WIDGET(sc->buttons[URL_BAR_ITEM]->button)); } void gui_window_set_search_ico(hlcache_handle *ico) @@ -2224,15 +2221,25 @@ struct gui_window *nsgtk_scaffolding_top_level(nsgtk_scaffolding *g) return g->top_level; } -void nsgtk_scaffolding_set_top_level (struct gui_window *gw) +/* set the current active top level gui window */ +void nsgtk_scaffolding_set_top_level(struct gui_window *gw) { - nsgtk_get_scaffold(gw)->top_level = gw; - struct browser_window *bw = nsgtk_get_browser_window(gw); + struct browser_window *bw; + nsgtk_scaffolding *sc; + + assert(gw != NULL); + + bw = nsgtk_get_browser_window(gw); assert(bw != NULL); + sc = nsgtk_get_scaffold(gw); + assert(sc != NULL); + + sc->top_level = gw; + /* Synchronise the history (will also update the URL bar) */ - nsgtk_window_update_back_forward(nsgtk_get_scaffold(gw)); + nsgtk_window_update_back_forward(sc); /* clear effects of potential searches */ browser_window_search_destroy_context(bw); @@ -2240,6 +2247,8 @@ void nsgtk_scaffolding_set_top_level (struct gui_window *gw) nsgtk_search_set_forward_state(true, bw); nsgtk_search_set_back_state(true, bw); + nsgtk_scaffolding_set_icon(gw); + /* Ensure the window's title bar is updated */ if (bw->current_content != NULL) { gui_window_set_title(gw, content_get_title(bw->current_content)); diff --git a/gtk/scaffolding.h b/gtk/scaffolding.h index 7e6983aa9..4769ad8df 100644 --- a/gtk/scaffolding.h +++ b/gtk/scaffolding.h @@ -150,6 +150,7 @@ void nsgtk_scaffolding_popup_menu(struct gtk_scaffolding *g, gdouble x, gdouble y); void nsgtk_scaffolding_toolbar_size_allocate(GtkWidget *widget, GtkAllocation *alloc, gpointer data); +void nsgtk_scaffolding_set_icon(struct gui_window *gw); gboolean nsgtk_window_url_activate_event(GtkWidget *, gpointer); gboolean nsgtk_window_url_changed(GtkWidget *, GdkEventKey *, gpointer); diff --git a/gtk/tabs.c b/gtk/tabs.c index dff1cb829..9f7a68605 100644 --- a/gtk/tabs.c +++ b/gtk/tabs.c @@ -111,17 +111,9 @@ static void nsgtk_tab_page_changed(GtkNotebook *notebook, gpointer *page, GtkWidget *window = gtk_notebook_get_nth_page(notebook, page_num); struct gui_window *gw = g_object_get_data(G_OBJECT(window), "gui_window"); - if (gw == NULL) - return; - struct browser_window *bw = nsgtk_get_browser_window(gw); - if (bw == NULL) - return; - - browser_window_search_destroy_context(bw); - - nsgtk_search_set_forward_state(true, bw); - nsgtk_search_set_back_state(true, bw); - nsgtk_scaffolding_set_top_level(gw); + if (gw != NULL) { + nsgtk_scaffolding_set_top_level(gw); + } } static void diff --git a/gtk/window.c b/gtk/window.c index 1b4d4e0bb..068da6fa7 100644 --- a/gtk/window.c +++ b/gtk/window.c @@ -39,6 +39,8 @@ #include "gtk/plotters.h" #include "gtk/schedule.h" #include "gtk/tabs.h" +#include "gtk/bitmap.h" +#include "gtk/gdk.h" #include "utils/log.h" #include "utils/utils.h" @@ -46,7 +48,7 @@ struct gui_window { /** The gtk scaffold object containing menu, buttons, url bar, [tabs], * drawing area, etc that may contain one or more gui_windows. */ - nsgtk_scaffolding *scaffold; + nsgtk_scaffolding *scaffold; /** The 'content' window that is rendered in the gui_window */ struct browser_window *bw; @@ -86,6 +88,9 @@ struct gui_window { /** to allow disactivation / resume of normal window behaviour */ gulong signalhandler[NSGTK_WINDOW_SIGNAL_COUNT]; + /** The icon this window should have */ + GdkPixbuf *icon; + /** list for cleanup */ struct gui_window *next, *prev; }; @@ -98,6 +103,11 @@ nsgtk_scaffolding *nsgtk_get_scaffold(struct gui_window *g) return g->scaffold; } +GdkPixbuf *nsgtk_get_icon(struct gui_window *gw) +{ + return gw->icon; +} + struct browser_window *nsgtk_get_browser_window(struct gui_window *g) { return g->bw; @@ -692,17 +702,38 @@ void gui_window_destroy(struct gui_window *g) /* tab => remove tab */ gtk_widget_destroy(gtk_widget_get_parent(GTK_WIDGET(g->layout))); +} - /* if it was the last tab, destroy scaffold too */ - if (gtk_notebook_get_n_pages(nsgtk_scaffolding_notebook(g->scaffold)) == 0) { - nsgtk_scaffolding_destroy(g->scaffold); +/** + * set favicon + */ +void gui_window_set_icon(struct gui_window *gw, hlcache_handle *icon) +{ + struct bitmap *icon_bitmap = NULL; + + /* free any existing icon */ + if (gw->icon != NULL) { + g_object_unref(gw->icon); + gw->icon = NULL; } - free(g); + if (icon != NULL) { + icon_bitmap = content_get_bitmap(icon); + if (icon_bitmap != NULL) { + LOG(("Using %p bitmap", icon_bitmap)); + gw->icon = nsgdk_pixbuf_get_from_surface(icon_bitmap->surface, 16, 16); + } + } + + if (gw->icon == NULL) { + LOG(("Using default favicon")); + g_object_ref(favicon_pixbuf); + gw->icon = favicon_pixbuf; + } + nsgtk_scaffolding_set_icon(gw); } - static void nsgtk_redraw_caret(struct gui_window *g) { int sx, sy; diff --git a/gtk/window.h b/gtk/window.h index 09f4f9dc0..2def42dd5 100644 --- a/gtk/window.h +++ b/gtk/window.h @@ -36,6 +36,7 @@ extern int temp_open_background; struct browser_window *nsgtk_get_browser_window(struct gui_window *g); nsgtk_scaffolding *nsgtk_get_scaffold(struct gui_window *g); +GdkPixbuf *nsgtk_get_icon(struct gui_window *gw); void nsgtk_reflow_all_windows(void); void nsgtk_window_process_reformats(void); float nsgtk_get_scale_for_gui(struct gui_window *g); -- cgit v1.2.3