📄 interface.c
字号:
return;}/* * Create a pixmap and return it. */static GtkWidget *Interface_pixmap_new(GtkWidget *parent, gchar **data){ GtkWidget *pixmapwid; GdkPixmap *pixmap; GdkBitmap *mask; GtkStyle *style; style = gtk_widget_get_style(parent); pixmap = gdk_pixmap_create_from_xpm_d(parent->window, &mask, &style->bg[GTK_STATE_NORMAL], data); pixmapwid = gtk_pixmap_new(pixmap, mask); return (pixmapwid);}/* * Create an extended button for the toolbar. "label_text" may be NULL. * "icon_ret" and "label_ret " may be used to return the child widgets, but * may also be 0. */static GtkWidget *Interface_toolbox_ext_button_new(GtkWidget *parent, gchar *label_text, gchar **image_data, GtkWidget **icon_ret, GtkWidget **label_ret){ GtkWidget *button, *pixmap, *vbox, *label; button = a_Gtk_ext_button_new (); GTK_WIDGET_UNSET_FLAGS (button, GTK_CAN_FOCUS); gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); pixmap = Interface_pixmap_new (parent, image_data); if (label_text) { vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER (button), vbox); gtk_box_pack_start(GTK_BOX(vbox), pixmap, FALSE, FALSE, 0); label = gtk_label_new(label_text); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); } else { gtk_container_add(GTK_CONTAINER (button), pixmap); label = NULL; } gtk_widget_show_all (button); if (icon_ret) *icon_ret = pixmap; if (label_ret) *label_ret = label; return button;}/* * Set the bw's cursor type */void a_Interface_set_cursor(BrowserWindow *bw, GdkCursorType CursorType){ GdkCursor *cursor; if ( bw->CursorType != CursorType ) { cursor = gdk_cursor_new(CursorType); gdk_window_set_cursor(bw->docwin->window, cursor); gdk_cursor_destroy(cursor); bw->CursorType = CursorType; }}/* * Connect button's "clicked" event with (key, key_mod) pair. */static void Interface_set_button_accel(GtkButton *button, gint key, gint key_mod, GtkAccelGroup *accel_group){ gtk_widget_add_accelerator(GTK_WIDGET(button), "clicked", accel_group, key, key_mod, GTK_ACCEL_LOCKED);}/* * Create the "NEW" button, its location-entry and the search button. */static GtkWidget *Interface_locbar_new(BrowserWindow *bw){ GtkWidget *hbox, *toolbar_l, *toolbar_r; hbox = gtk_hbox_new(FALSE, 0); /* location entry */ bw->location = gtk_entry_new(); gtk_signal_connect(GTK_OBJECT(bw->location), "activate", (GtkSignalFunc) a_Interface_entry_open_url, bw); gtk_widget_add_accelerator(GTK_WIDGET(bw->location), "grab_focus", bw->accel_group, GDK_u, GDK_CONTROL_MASK, GTK_ACCEL_LOCKED); /* left toolbar (Clear url) */ toolbar_l = gtk_toolbar_new(GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_BOTH); gtk_toolbar_set_button_relief(GTK_TOOLBAR(toolbar_l), GTK_RELIEF_NONE); GTK_WIDGET_UNSET_FLAGS (toolbar_l, GTK_CAN_FOCUS); bw->clear_url_button = Interface_toolbox_ext_button_new(bw->main_window, NULL, s_new_xpm, NULL, NULL); a_Gtk_ext_button_set_command(GTK_EXT_BUTTON(bw->clear_url_button), 1); a_Gtk_ext_button_set_command(GTK_EXT_BUTTON(bw->clear_url_button), 2); gtk_toolbar_append_widget(GTK_TOOLBAR(toolbar_l), bw->clear_url_button, "Clear the URL box (middle-click to paste an " "URL).", "Toolbar/Clear"); gtk_signal_connect_object(GTK_OBJECT(bw->clear_url_button), "clicked", GTK_SIGNAL_FUNC (Interface_entry_clear), GTK_OBJECT(bw->location)); gtk_signal_connect_object(GTK_OBJECT(bw->clear_url_button), "clicked1", GTK_SIGNAL_FUNC (Interface_entry_clear), GTK_OBJECT(bw->location)); gtk_signal_connect(GTK_OBJECT(bw->clear_url_button), "clicked2", GTK_SIGNAL_FUNC (Interface_cub_get_selection), NULL); gtk_signal_connect(GTK_OBJECT(bw->clear_url_button), "selection_received", GTK_SIGNAL_FUNC (Interface_cub_selection_received), bw); /* right toolbar (Search) */ toolbar_r = gtk_toolbar_new(GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_BOTH); gtk_toolbar_set_button_relief(GTK_TOOLBAR(toolbar_r), GTK_RELIEF_NONE); GTK_WIDGET_UNSET_FLAGS (toolbar_r, GTK_CAN_FOCUS); bw->search_button = gtk_toolbar_append_item( GTK_TOOLBAR(toolbar_r), NULL, "Search the Web", "Toolbar/New", Interface_pixmap_new(bw->main_window, search_xpm), GTK_SIGNAL_FUNC(a_Interface_search_dialog), bw); gtk_widget_add_accelerator(GTK_WIDGET(bw->search_button), "clicked", bw->accel_group, GDK_s, GDK_CONTROL_MASK, GTK_ACCEL_LOCKED); gtk_box_pack_start(GTK_BOX(hbox), toolbar_l, FALSE, FALSE, 0); gtk_widget_show(toolbar_l); gtk_box_pack_start(GTK_BOX(hbox), bw->location, TRUE, TRUE, 0); gtk_widget_show(bw->location); gtk_box_pack_start(GTK_BOX(hbox), toolbar_r, FALSE, FALSE, 0); gtk_widget_show(toolbar_r); gtk_widget_show(hbox); return (hbox);}/* * Create a new toolbar (Back, Forward, Home, Reload, Save and Stop buttons) */static GtkWidget *Interface_toolbar_new(BrowserWindow *bw, gint label){ GtkWidget *toolbar, *label_widget, *icon_widget; GtkToolbarChild *toolbar_child; gboolean s = prefs.small_icons; toolbar = gtk_toolbar_new(GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_BOTH); gtk_toolbar_set_button_relief(GTK_TOOLBAR(toolbar), GTK_RELIEF_NONE); /* back button */ bw->back_button = Interface_toolbox_ext_button_new(bw->main_window, label ? "Back" : NULL, s ? s_left_xpm : left_xpm, &label_widget, &icon_widget); gtk_toolbar_append_widget(GTK_TOOLBAR(toolbar), bw->back_button, "Go to previous page (right-click for menu).", "Toolbar/Back"); gtk_widget_set_sensitive(bw->back_button, FALSE); Interface_set_button_accel(GTK_BUTTON(bw->back_button), GDK_comma, 0, bw->accel_group); a_Gtk_ext_button_set_command(GTK_EXT_BUTTON(bw->back_button), 1); a_Gtk_ext_button_attach_menu_creator( GTK_EXT_BUTTON(bw->back_button), 3, a_Commands_back_button_menu_creator_callback, (gpointer)bw); gtk_signal_connect(GTK_OBJECT(bw->back_button), "clicked", GTK_SIGNAL_FUNC(a_Commands_back_callback), (gpointer)bw); gtk_signal_connect(GTK_OBJECT(bw->back_button), "clicked1", GTK_SIGNAL_FUNC(a_Commands_back_callback), (gpointer)bw); /* * HACK: We have added GtkExtButton's as widgets * (gtk_toolbar_append_widget), but they should behave like buttons etc. * (gtk_toolbar_append_item), especially, they should have the same size. * So we change some parts of the internal representation. */ toolbar_child = ((GtkToolbarChild*)GTK_TOOLBAR(toolbar)->children->data); toolbar_child->type = GTK_TOOLBAR_CHILD_BUTTON; toolbar_child->widget = bw->back_button; toolbar_child->icon = icon_widget; toolbar_child->label = label_widget; /* forward button */ bw->forw_button = Interface_toolbox_ext_button_new(bw->main_window, label ? "Forward" : NULL, s ? s_right_xpm : right_xpm, &label_widget, &icon_widget); gtk_toolbar_append_widget(GTK_TOOLBAR(toolbar), bw->forw_button, "Go to next page (right-click for menu).", "Toolbar/Forward"); gtk_widget_set_sensitive(bw->forw_button, FALSE); Interface_set_button_accel(GTK_BUTTON(bw->forw_button), GDK_period, 0, bw->accel_group); a_Gtk_ext_button_set_command(GTK_EXT_BUTTON(bw->forw_button), 1); a_Gtk_ext_button_attach_menu_creator( GTK_EXT_BUTTON(bw->forw_button), 3, a_Commands_forw_button_menu_creator_callback, (gpointer)bw); gtk_signal_connect(GTK_OBJECT(bw->forw_button), "clicked", GTK_SIGNAL_FUNC(a_Commands_forw_callback), (gpointer)bw); gtk_signal_connect(GTK_OBJECT(bw->forw_button), "clicked1", GTK_SIGNAL_FUNC(a_Commands_forw_callback), (gpointer)bw); /* * HACK: See above. */ toolbar_child = ((GtkToolbarChild*)GTK_TOOLBAR(toolbar)->children->next->data); toolbar_child->type = GTK_TOOLBAR_CHILD_BUTTON; toolbar_child->widget = bw->forw_button; toolbar_child->icon = icon_widget; toolbar_child->label = label_widget; /* home button */ bw->home_button = gtk_toolbar_append_item( GTK_TOOLBAR(toolbar), label ? "Home" : NULL, "Go to the Home page", "Toolbar/Home", Interface_pixmap_new(bw->main_window, s ? s_home_xpm : home_xpm), (GtkSignalFunc) a_Commands_home_callback, bw); /* * SG: This had never any effect, was it there for future extensions? * gtk_signal_connect(GTK_OBJECT(bw->home_button), "button-press-event", * GTK_SIGNAL_FUNC(a_Commands_navpress_callback), bw); */ /* reload button */ bw->reload_button = gtk_toolbar_append_item( GTK_TOOLBAR(toolbar), label ? "Reload" : NULL, "Reload this page", "Toolbar/Reload", Interface_pixmap_new(bw->main_window, s ? s_reload_xpm : reload_xpm), (GtkSignalFunc) a_Commands_reload_callback, bw); Interface_set_button_accel(GTK_BUTTON(bw->reload_button), GDK_r, GDK_CONTROL_MASK, bw->accel_group); /* save button */ bw->save_button = gtk_toolbar_append_item( GTK_TOOLBAR(toolbar), label ? "Save" : NULL, "Save this page", "Toolbar/Save", Interface_pixmap_new(bw->main_window, s ? s_save_xpm : save_xpm), (GtkSignalFunc) a_Commands_save_callback, bw); /* stop button */ bw->stop_button = gtk_toolbar_append_item( GTK_TOOLBAR(toolbar), label ? "Stop" : NULL, "Stop the current transfer", "Toolbar/Stop", Interface_pixmap_new(bw->main_window, s ? s_stop_xpm : stop_xpm), (GtkSignalFunc) a_Commands_stop_callback, bw); gtk_widget_set_sensitive(bw->stop_button, FALSE); /* bookmarks button */ bw->bookmarks_button = gtk_toolbar_append_item( GTK_TOOLBAR(toolbar), label ? "Book" : NULL, "View bookmarks", "Toolbar/Bookmarks", Interface_pixmap_new(bw->main_window, s ? s_bm_xpm : bm_xpm), (GtkSignalFunc) a_Commands_viewbm_callback, bw); gtk_widget_set_sensitive(bw->bookmarks_button, TRUE); Interface_set_button_accel(GTK_BUTTON(bw->bookmarks_button), GDK_semicolon, 0, bw->accel_group); Interface_set_button_accel(GTK_BUTTON(bw->bookmarks_button), GDK_b, GDK_CONTROL_MASK, bw->accel_group); /* * SG: This had never any effect, was it there for future extensions? * gtk_signal_connect(GTK_OBJECT(bw->bookmarks_button), * "button-press-event", * GTK_SIGNAL_FUNC(a_Commands_navpress_callback), bw); */ gtk_widget_show(toolbar); return toolbar;}/* * Create the progressbar's box */static GtkWidget *Interface_progressbox_new(BrowserWindow *bw, gint vertical){ GtkWidget *progbox; progbox = vertical ? gtk_vbox_new(FALSE, 0) : gtk_hbox_new(FALSE, 0); bw->progress_box = progbox; bw->imgprogress = a_Progressbar_new(); bw->progress = a_Progressbar_new(); gtk_box_pack_start(GTK_BOX(progbox), bw->imgprogress, TRUE, TRUE, 0); gtk_widget_show(bw->imgprogress); gtk_box_pack_start(GTK_BOX(progbox), bw->progress, TRUE, TRUE, 0); gtk_widget_show(bw->progress); return (progbox);}/* * Hide/Unhide this bw's control panels. * toggle: Flag [toggle or set]. */void Interface_toggle_panel(BrowserWindow *bw, gint toggle){ if (toggle) bw->fullwindow = !bw->fullwindow; if (bw->fullwindow) { g_slist_foreach(bw->PanelHandles, (GFunc)gtk_widget_hide, NULL); gtk_widget_hide(bw->status_box); gtk_widget_show (bw->full_screen_off_button); gtk_widget_grab_focus(GTK_BIN(bw->docwin)->child); } else { g_slist_foreach(bw->PanelHandles, (GFunc)gtk_widget_show, NULL); gtk_widget_show(bw->status_box); gtk_widget_hide (bw->full_screen_off_button); }}/* * Customize the appearance of the bw. */static void Interface_browser_window_customize(BrowserWindow *bw){ if ( !prefs.show_back ) gtk_widget_hide(bw->back_button); if ( !prefs.show_forw ) gtk_widget_hide(bw->forw_button); if ( !prefs.show_home ) gtk_widget_hide(bw->home_button); if ( !prefs.show_reload ) gtk_widget_hide(bw->reload_button); if ( !prefs.show_save ) gtk_widget_hide(bw->save_button); if ( !prefs.show_stop ) gtk_widget_hide(bw->stop_button); if ( !prefs.show_bookmarks ) gtk_widget_hide(bw->bookmarks_button); if ( !prefs.show_menubar ) gtk_widget_hide(bw->menubar); if ( !prefs.show_clear_url) gtk_widget_hide(bw->clear_url_button); if ( !prefs.show_url ) gtk_widget_hide(bw->location); if ( !prefs.show_search ) gtk_widget_hide(bw->search_button); if ( !prefs.show_progress_box ) gtk_widget_hide(bw->progress_box); bw->fullwindow = prefs.fullwindow_start; Interface_toggle_panel(bw, FALSE);}static void Interface_full_screen_callback (BrowserWindow *bw){ Interface_toggle_panel(bw, TRUE);}/* * Handler for double-mouse-clicks that don't belong to the viewport. */static gint Interface_click_callback(BrowserWindow *bw, GdkEventButton *event){ if (event->type == GDK_2BUTTON_PRESS && event->button == 1) Interface_toggle_panel(bw, TRUE); return TRUE;}/*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -