/** * set toolbar logical -> physical; physically visible toolbar buttons are made * to correspond to the logically stored schema in terms of location * visibility etc */ void nsgtk_toolbar_set_physical(nsgtk_scaffolding *g) { int i; struct nsgtk_theme *theme = nsgtk_theme_load(GTK_ICON_SIZE_LARGE_TOOLBAR); if (theme == NULL) { warn_user(messages_get("NoMemory"), 0); return; } /* simplest is to clear the toolbar then reload it from memory */ gtk_container_foreach(GTK_CONTAINER(nsgtk_scaffolding_toolbar(g)), nsgtk_toolbar_clear_toolbar, g); for (i = BACK_BUTTON; i < PLACEHOLDER_BUTTON; i++) nsgtk_toolbar_add_item_to_toolbar(g, i, theme); gtk_widget_show_all(GTK_WIDGET(nsgtk_scaffolding_toolbar(g))); free(theme); }
void nsgtk_theme_implement(struct gtk_scaffolding *g) { struct nsgtk_theme *theme[IMAGE_SET_COUNT]; int i; struct nsgtk_button_connect *button; struct gtk_search *search; for (i = 0; i <= IMAGE_SET_POPUP_MENU; i++) theme[i] = nsgtk_theme_load(GTK_ICON_SIZE_MENU); theme[IMAGE_SET_BUTTONS] = nsgtk_theme_load(GTK_ICON_SIZE_LARGE_TOOLBAR); for (i = BACK_BUTTON; i < PLACEHOLDER_BUTTON; i++) { if ((i == URL_BAR_ITEM) || (i == THROBBER_ITEM) || (i == WEBSEARCH_ITEM)) continue; button = nsgtk_scaffolding_button(g, i); if (button == NULL) continue; /* gtk_image_menu_item_set_image accepts NULL image */ if ((button->main != NULL) && (theme[IMAGE_SET_MAIN_MENU] != NULL)) { gtk_image_menu_item_set_image(button->main, GTK_WIDGET( theme[IMAGE_SET_MAIN_MENU]-> image[i])); gtk_widget_show_all(GTK_WIDGET(button->main)); } if ((button->rclick != NULL) && (theme[IMAGE_SET_RCLICK_MENU] != NULL)) { gtk_image_menu_item_set_image(button->rclick, GTK_WIDGET( theme[IMAGE_SET_RCLICK_MENU]-> image[i])); gtk_widget_show_all(GTK_WIDGET(button->rclick)); } if ((button->popup != NULL) && (theme[IMAGE_SET_POPUP_MENU] != NULL)) { gtk_image_menu_item_set_image(button->popup, GTK_WIDGET( theme[IMAGE_SET_POPUP_MENU]-> image[i])); gtk_widget_show_all(GTK_WIDGET(button->popup)); } if ((button->location != -1) && (button->button != NULL) && (theme[IMAGE_SET_BUTTONS] != NULL)) { gtk_tool_button_set_icon_widget( GTK_TOOL_BUTTON(button->button), GTK_WIDGET( theme[IMAGE_SET_BUTTONS]-> image[i])); gtk_widget_show_all(GTK_WIDGET(button->button)); } } /* set search bar images */ search = nsgtk_scaffolding_search(g); if ((search != NULL) && (theme[IMAGE_SET_MAIN_MENU] != NULL)) { /* gtk_tool_button_set_icon_widget accepts NULL image */ if (search->buttons[SEARCH_BACK_BUTTON] != NULL) { gtk_tool_button_set_icon_widget( search->buttons[SEARCH_BACK_BUTTON], GTK_WIDGET(theme[IMAGE_SET_MAIN_MENU]-> searchimage[SEARCH_BACK_BUTTON])); gtk_widget_show_all(GTK_WIDGET( search->buttons[SEARCH_BACK_BUTTON])); } if (search->buttons[SEARCH_FORWARD_BUTTON] != NULL) { gtk_tool_button_set_icon_widget( search->buttons[SEARCH_FORWARD_BUTTON], GTK_WIDGET(theme[IMAGE_SET_MAIN_MENU]-> searchimage[SEARCH_FORWARD_BUTTON])); gtk_widget_show_all(GTK_WIDGET( search->buttons[ SEARCH_FORWARD_BUTTON])); } if (search->buttons[SEARCH_CLOSE_BUTTON] != NULL) { gtk_tool_button_set_icon_widget( search->buttons[SEARCH_CLOSE_BUTTON], GTK_WIDGET(theme[IMAGE_SET_MAIN_MENU]-> searchimage[SEARCH_CLOSE_BUTTON])); gtk_widget_show_all(GTK_WIDGET( search->buttons[SEARCH_CLOSE_BUTTON])); } } for (i = 0; i < IMAGE_SET_COUNT; i++) { if (theme[i] != NULL) { free(theme[i]); } } }
/** * called when a widget is dropped onto the toolbar */ gboolean nsgtk_toolbar_data(GtkWidget *widget, GdkDragContext *gdc, gint x, gint y, guint time, gpointer data) { nsgtk_scaffolding *g = (nsgtk_scaffolding *)data; int ind = gtk_toolbar_get_drop_index(nsgtk_scaffolding_toolbar(g), x, y); int q, i; if (window->currentbutton == -1) return TRUE; struct nsgtk_theme *theme = nsgtk_theme_load(GTK_ICON_SIZE_LARGE_TOOLBAR); if (theme == NULL) { warn_user(messages_get("NoMemory"), 0); return TRUE; } if (nsgtk_scaffolding_button(g, window->currentbutton)->location != -1) { /* widget was already in the toolbar; so replace */ if (nsgtk_scaffolding_button(g, window->currentbutton)-> location < ind) ind--; gtk_container_remove(GTK_CONTAINER( nsgtk_scaffolding_toolbar(g)), GTK_WIDGET( nsgtk_scaffolding_button(g, window->currentbutton)->button)); /* 'move' all widgets further right than the original location, * one place to the left in logical schema */ for (i = nsgtk_scaffolding_button(g, window->currentbutton)-> location + 1; i < PLACEHOLDER_BUTTON; i++) { q = nsgtk_toolbar_get_id_at_location(g, i); if (q == -1) continue; nsgtk_scaffolding_button(g, q)->location--; } nsgtk_scaffolding_button(g, window->currentbutton)-> location = -1; } nsgtk_scaffolding_button(g, window->currentbutton)->button = GTK_TOOL_ITEM(nsgtk_toolbar_make_widget(g, window->currentbutton, theme)); free(theme); if (nsgtk_scaffolding_button(g, window->currentbutton)->button == NULL) { warn_user("NoMemory", 0); return TRUE; } /* update logical schema */ nsgtk_scaffolding_reset_offset(g); /* 'move' all widgets further right than the new location, one place to * the right in logical schema */ for (i = PLACEHOLDER_BUTTON - 1; i >= ind; i--) { q = nsgtk_toolbar_get_id_at_location(g, i); if (q == -1) continue; nsgtk_scaffolding_button(g, q)->location++; } nsgtk_scaffolding_button(g, window->currentbutton)->location = ind; /* complete action */ gtk_toolbar_insert(nsgtk_scaffolding_toolbar(g), nsgtk_scaffolding_button(g, window->currentbutton)->button, ind); gtk_tool_item_set_use_drag_window(GTK_TOOL_ITEM( nsgtk_scaffolding_button(g, window->currentbutton)->button), TRUE); gtk_drag_source_set(GTK_WIDGET( nsgtk_scaffolding_button(g, window->currentbutton)->button), GDK_BUTTON1_MASK, &entry, 1, GDK_ACTION_COPY); nsgtk_toolbar_temp_connect(g, window->currentbutton); gtk_widget_show_all(GTK_WIDGET( nsgtk_scaffolding_button(g, window->currentbutton)->button)); window->currentbutton = -1; return TRUE; }
/** * cleanup code physical update of all toolbars; resensitize * \param g the 'front' scaffolding that called customize */ void nsgtk_toolbar_close(nsgtk_scaffolding *g) { int i; nsgtk_scaffolding *list = scaf_list; while (list) { struct nsgtk_theme *theme = nsgtk_theme_load(GTK_ICON_SIZE_LARGE_TOOLBAR); if (theme == NULL) { warn_user(messages_get("NoMemory"), 0); continue; } /* clear toolbar */ gtk_container_foreach(GTK_CONTAINER(nsgtk_scaffolding_toolbar( list)), nsgtk_toolbar_clear_toolbar, list); /* then add items */ for (i = BACK_BUTTON; i < PLACEHOLDER_BUTTON; i++) { nsgtk_toolbar_add_item_to_toolbar(list, i, theme); } nsgtk_toolbar_connect_all(list); gtk_widget_show_all(GTK_WIDGET(nsgtk_scaffolding_toolbar( list))); nsgtk_scaffolding_set_sensitivity(list); nsgtk_widget_override_background_color(GTK_WIDGET(nsgtk_window_get_layout(nsgtk_scaffolding_top_level(list))), GTK_STATE_NORMAL, 0, 0xFFFF, 0xFFFF, 0xFFFF); g_signal_handler_unblock(GTK_WIDGET( nsgtk_window_get_layout( nsgtk_scaffolding_top_level(list))), nsgtk_window_get_signalhandler( nsgtk_scaffolding_top_level(list), NSGTK_WINDOW_SIGNAL_CLICK)); g_signal_handler_unblock(GTK_WIDGET( nsgtk_window_get_layout( nsgtk_scaffolding_top_level(list))), nsgtk_window_get_signalhandler( nsgtk_scaffolding_top_level(list), NSGTK_WINDOW_SIGNAL_REDRAW)); if ((nsgtk_get_browser_window(nsgtk_scaffolding_top_level( list))->current_content != NULL) && (hlcache_handle_get_url(nsgtk_get_browser_window( nsgtk_scaffolding_top_level(list))-> current_content) != NULL)) browser_window_refresh_url_bar( nsgtk_get_browser_window( nsgtk_scaffolding_top_level(list)), hlcache_handle_get_url( nsgtk_get_browser_window( nsgtk_scaffolding_top_level(list))-> current_content), nsgtk_get_browser_window( nsgtk_scaffolding_top_level(list))-> frag_id); if (list != g) gtk_widget_set_sensitive(GTK_WIDGET( nsgtk_scaffolding_window(list)), TRUE); free(theme); list = nsgtk_scaffolding_iterate(list); } gtk_widget_set_sensitive(GTK_WIDGET(nsgtk_scaffolding_notebook(g)), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(nsgtk_scaffolding_menu_bar(g)), TRUE); /* update favicon etc */ nsgtk_scaffolding_set_top_level(nsgtk_scaffolding_top_level(g)); if (search_web_ico()) gui_window_set_search_ico(search_web_ico()); }
/** * create store window */ void nsgtk_toolbar_window_open(nsgtk_scaffolding *g) { int x = 0, y = 0; GError* error = NULL; struct nsgtk_theme *theme = nsgtk_theme_load(GTK_ICON_SIZE_LARGE_TOOLBAR); if (theme == NULL) { warn_user(messages_get("NoMemory"), 0); nsgtk_toolbar_cancel_clicked(NULL, g); return; } window->glade = gtk_builder_new(); if (!gtk_builder_add_from_file(window->glade, glade_file_location->toolbar, &error)) { g_warning ("Couldn't load builder file: %s", error->message); g_error_free (error); warn_user(messages_get("NoMemory"), 0); nsgtk_toolbar_cancel_clicked(NULL, g); return; } gtk_builder_connect_signals(window->glade, NULL); window->window = GTK_WIDGET(gtk_builder_get_object(window->glade, "toolbarwindow")); if (window->window == NULL) { warn_user(messages_get("NoMemory"), 0); nsgtk_toolbar_cancel_clicked(NULL, g); free(theme); return; } window->widgetvbox = GTK_WIDGET(gtk_builder_get_object(window->glade, "widgetvbox")); if (window->widgetvbox == NULL) { warn_user(messages_get("NoMemory"), 0); nsgtk_toolbar_cancel_clicked(NULL, g); free(theme); return; } window->numberh = NSGTK_STORE_WIDTH; /* preset to width [in buttons] of */ /* store to cause creation of a new toolbar */ window->currentbutton = -1; /* load toolbuttons */ /* add toolbuttons to window */ /* set event handlers */ for (int i = BACK_BUTTON; i < PLACEHOLDER_BUTTON; i++) { if (i == URL_BAR_ITEM) continue; window->store_buttons[i] = nsgtk_toolbar_make_widget(g, i, theme); if (window->store_buttons[i] == NULL) { warn_user(messages_get("NoMemory"), 0); continue; } nsgtk_toolbar_add_store_widget(window->store_buttons[i]); g_signal_connect(window->store_buttons[i], "drag-data-get", G_CALLBACK( nsgtk_scaffolding_button(g, i)->dataplus), g); } free(theme); gtk_window_set_transient_for(GTK_WINDOW(window->window), nsgtk_scaffolding_window(g)); gtk_window_set_title(GTK_WINDOW(window->window), messages_get( "gtkToolBarTitle")); gtk_window_set_accept_focus(GTK_WINDOW(window->window), FALSE); gtk_drag_dest_set(GTK_WIDGET(window->window), GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP, &entry, 1, GDK_ACTION_COPY); gtk_widget_show_all(window->window); gtk_window_set_position(GTK_WINDOW(window->window), GTK_WIN_POS_CENTER_ON_PARENT); gtk_window_get_position(nsgtk_scaffolding_window(g), &x, &y); gtk_window_move(GTK_WINDOW(window->window), x, y + 100); g_signal_connect(GTK_WIDGET(gtk_builder_get_object(window->glade, "cancelbutton")), "clicked", G_CALLBACK(nsgtk_toolbar_cancel_clicked), g); g_signal_connect(GTK_WIDGET(gtk_builder_get_object(window->glade, "okbutton")), "clicked", G_CALLBACK(nsgtk_toolbar_persist), g); g_signal_connect(GTK_WIDGET(gtk_builder_get_object(window->glade, "resetbutton")), "clicked", G_CALLBACK(nsgtk_toolbar_reset), g); g_signal_connect(window->window, "delete-event", G_CALLBACK(nsgtk_toolbar_delete), g); g_signal_connect(window->window, "drag-drop", G_CALLBACK(nsgtk_toolbar_store_return), g); g_signal_connect(window->window, "drag-motion", G_CALLBACK(nsgtk_toolbar_store_action), g); }