📄 interface.c
字号:
* Handler for key presses that don't belong to the viewport. * (Used to customize the interface a bit) */static void Interface_key_press_handler(GtkWidget *widget, GdkEventKey *event, gpointer client_data){ BrowserWindow *bw = client_data; switch (event->keyval) { case GDK_BackSpace: /* This key is handled here because GTK accel group ignores it */ if (event->state & GDK_SHIFT_MASK) a_Commands_forw_callback(NULL, bw); else a_Commands_back_callback(NULL, bw); break; case GDK_slash: /* This key is handled here because GTK accel group ignores it */ a_Commands_findtext_callback(NULL, bw); break; default: _MSG(">> Key pressed!\n"); break; }}/* * Add the button for switching into fullscreen mode */static void Interface_add_full_screen_button (BrowserWindow *bw, GtkBox *box){ /* The button is put into a vbox, so that it is not enlarged vertically. */ GtkWidget *vbox, *dummy, *button, *pixmap; vbox = gtk_vbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (box), vbox, FALSE, FALSE, 0); gtk_widget_show (vbox); /* The dummy will make the button align at the bottom. * (Important only when using large text fonts.) */ dummy = gtk_vbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), dummy, TRUE, TRUE, 0); gtk_widget_show (dummy); button = gtk_button_new (); gtk_tooltips_set_tip (tooltips, button, "Hide Controls", "Show Controls"); GTK_WIDGET_UNSET_FLAGS (button, GTK_CAN_FOCUS); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); gtk_widget_show (button); pixmap = Interface_pixmap_new(bw->main_window, full_screen_on_xpm); gtk_container_add (GTK_CONTAINER (button), pixmap); gtk_widget_show (pixmap); gtk_signal_connect_object (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (Interface_full_screen_callback), (gpointer)bw);}/* * Create a new browser window and return it. * (the new window is stored in browser_window[]) */BrowserWindow *a_Interface_browser_window_new(gint width, gint height, guint32 xid){ GtkWidget *box1, *hbox, *button, *label, *progbox, *toolbar, *handlebox, *menubar, *locbox, *pixmap; BrowserWindow *bw; char buf[64]; /* We use g_new0() to zero the memory */ bw = g_new0(BrowserWindow, 1); a_List_add(browser_window, num_bw, num_bw_max); browser_window[num_bw++] = bw; /* initialize nav_stack struct in browser_window struct */ a_Nav_init(bw); if (!xid) bw->main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); else bw->main_window = gtk_plug_new(xid); gtk_window_set_policy(GTK_WINDOW(bw->main_window), TRUE, TRUE, FALSE); gtk_signal_connect(GTK_OBJECT(bw->main_window), "delete_event", GTK_SIGNAL_FUNC(gtk_object_destroy), bw); gtk_signal_connect(GTK_OBJECT(bw->main_window), "destroy", GTK_SIGNAL_FUNC(Interface_quit), bw); gtk_container_border_width(GTK_CONTAINER(bw->main_window), 0); gtk_window_set_wmclass(GTK_WINDOW(bw->main_window), "dillo", "Dillo"); /* -RL :: I must realize the window to see it correctly */ gtk_widget_realize(bw->main_window); /* Create and attach an accel group to the main window */ bw->accel_group = gtk_accel_group_new(); gtk_window_add_accel_group(GTK_WINDOW(bw->main_window), bw->accel_group); /* set window title */ g_snprintf(buf, 64, "Version %s", VERSION); a_Interface_set_page_title(bw, buf); box1 = gtk_vbox_new(FALSE, 0); /* setup the control panel */ if (prefs.panel_size == 1) { handlebox = gtk_handle_box_new(); bw->PanelHandles = g_slist_append(bw->PanelHandles, handlebox); hbox = gtk_hbox_new(FALSE, 0); /* Control Buttons */ toolbar = Interface_toolbar_new(bw, 0); /* Menus */ menubar = a_Menu_mainbar_new(bw, 1); /* Location entry */ locbox = Interface_locbar_new(bw); /* progress bars */ progbox = Interface_progressbox_new(bw, 0); gtk_box_pack_start(GTK_BOX(hbox), toolbar, FALSE, FALSE, 0); gtk_widget_show(toolbar); gtk_box_pack_start(GTK_BOX(hbox), menubar, FALSE, FALSE, 0); gtk_widget_show(menubar); gtk_box_pack_start(GTK_BOX(hbox), locbox, TRUE, TRUE, 0); gtk_widget_show(locbox); gtk_box_pack_start(GTK_BOX(hbox), progbox, FALSE, FALSE, 0); gtk_widget_show(progbox); gtk_container_add(GTK_CONTAINER(handlebox), hbox); gtk_widget_show(hbox); gtk_box_pack_start(GTK_BOX(box1), handlebox, FALSE, FALSE, 0); gtk_widget_show(handlebox); } else if (prefs.panel_size == 2) { handlebox = gtk_handle_box_new(); bw->PanelHandles = g_slist_append(bw->PanelHandles, handlebox); hbox = gtk_hbox_new(FALSE, 0); menubar = a_Menu_mainbar_new(bw, 0); locbox = Interface_locbar_new(bw); gtk_box_pack_start(GTK_BOX(hbox), menubar, FALSE, FALSE, 0); gtk_widget_show(menubar); gtk_box_pack_start(GTK_BOX(hbox), locbox, TRUE, TRUE, 0); gtk_widget_show(locbox); gtk_container_add(GTK_CONTAINER(handlebox), hbox); gtk_widget_show(hbox); gtk_box_pack_start(GTK_BOX(box1), handlebox, FALSE, FALSE, 0); gtk_widget_show(handlebox); handlebox = gtk_handle_box_new(); bw->PanelHandles = g_slist_append(bw->PanelHandles, handlebox); gtk_container_border_width(GTK_CONTAINER(handlebox), 4); hbox = gtk_hbox_new(FALSE, 0); toolbar = Interface_toolbar_new(bw, 1); progbox = Interface_progressbox_new(bw, 1); gtk_box_pack_start(GTK_BOX(hbox), toolbar, TRUE, TRUE, 0); gtk_widget_show(toolbar); gtk_box_pack_start(GTK_BOX(hbox), progbox, FALSE, FALSE, 0); gtk_widget_show(progbox); gtk_container_add(GTK_CONTAINER(handlebox), hbox); gtk_widget_show(hbox); gtk_box_pack_start(GTK_BOX(box1), handlebox, FALSE, FALSE, 0); gtk_widget_show(handlebox); } else { handlebox = gtk_handle_box_new(); bw->PanelHandles = g_slist_append(bw->PanelHandles, handlebox); menubar = a_Menu_mainbar_new(bw, 0); gtk_container_add(GTK_CONTAINER(handlebox), menubar); gtk_widget_show(menubar); gtk_box_pack_start(GTK_BOX(box1), handlebox, FALSE, FALSE, 0); gtk_widget_show(handlebox); handlebox = gtk_handle_box_new(); bw->PanelHandles = g_slist_append(bw->PanelHandles, handlebox); gtk_container_border_width(GTK_CONTAINER(handlebox), 4); hbox = gtk_hbox_new(FALSE, 0); toolbar = Interface_toolbar_new(bw, 1); progbox = Interface_progressbox_new(bw, 1); gtk_box_pack_start(GTK_BOX(hbox), toolbar, TRUE, TRUE, 0); gtk_widget_show(toolbar); gtk_box_pack_start(GTK_BOX(hbox), progbox, FALSE, FALSE, 0); gtk_widget_show(progbox); gtk_container_add(GTK_CONTAINER(handlebox), hbox); gtk_widget_show(hbox); gtk_box_pack_start(GTK_BOX(box1), handlebox, FALSE, FALSE, 0); gtk_widget_show(handlebox); handlebox = gtk_handle_box_new(); bw->PanelHandles = g_slist_append(bw->PanelHandles, handlebox); locbox = Interface_locbar_new(bw); gtk_container_add(GTK_CONTAINER(handlebox), locbox); gtk_widget_show(locbox); gtk_box_pack_start(GTK_BOX(box1), handlebox, FALSE, FALSE, 0); gtk_widget_show(handlebox); } /* Add box1 */ gtk_container_add(GTK_CONTAINER(bw->main_window), box1); /* Now the main document window */ bw->docwin = a_Dw_gtk_scrolled_window_new(); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(bw->docwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_box_pack_start(GTK_BOX(box1), bw->docwin, TRUE, TRUE, 0); gtk_widget_show(bw->docwin); /* todo (GTK2): this call is a bit of a workaround to missing focus * between the location box and the docwin. It's fixed in GTK2: * http://mail.gnome.org/archives/gtk-list/2003-June/msg00307.html */ gtk_widget_grab_focus(GTK_BIN(bw->docwin)->child); /* Full screen mode via double click is done in two ways: First, * a feature of the selection is used, since in complex pages, * getting events back to the viewport is quite difficult. Second, * a simple callback, called e.g. when viewing image resources. */ a_Selection_set_dclick_callback( GTK_DW_VIEWPORT(GTK_BIN(GTK_BIN(bw->docwin)->child)->child)->selection, (void(*)(gpointer))Interface_full_screen_callback, bw); /* Selection requires an owner widget */ a_Selection_set_owner( GTK_DW_VIEWPORT(GTK_BIN(GTK_BIN(bw->docwin)->child)->child)->selection, GTK_BIN(bw->docwin)->child); gtk_signal_connect_object_after(GTK_OBJECT(GTK_BIN(bw->docwin)->child), "button_press_event", GTK_SIGNAL_FUNC(Interface_click_callback), (gpointer)bw); /* full screen button: actually there're two buttons, one in the scrolled * window (fs off) and one in the status bar (fs on). They look as one. */ bw->full_screen_off_button = gtk_button_new (); gtk_tooltips_set_tip (tooltips, bw->full_screen_off_button, "Show Controls", "Hide Controls"); GTK_WIDGET_UNSET_FLAGS (bw->full_screen_off_button, GTK_CAN_FOCUS); a_Dw_gtk_scrolled_window_add_gadget (GTK_DW_SCROLLED_WINDOW (bw->docwin), bw->full_screen_off_button); pixmap = Interface_pixmap_new(bw->main_window, full_screen_off_xpm); gtk_container_add (GTK_CONTAINER (bw->full_screen_off_button), pixmap); gtk_widget_show (pixmap); gtk_signal_connect_object (GTK_OBJECT (bw->full_screen_off_button), "clicked", GTK_SIGNAL_FUNC (Interface_full_screen_callback), (gpointer)bw); Interface_set_button_accel(GTK_BUTTON(bw->full_screen_off_button), GDK_h, GDK_CONTROL_MASK, bw->accel_group); /* Catch key_press event */ gtk_signal_connect(GTK_OBJECT(GTK_BIN(bw->docwin)->child), "key_press_event", GTK_SIGNAL_FUNC(Interface_key_press_handler), bw); gtk_widget_set_usize(bw->main_window, width, height); /* status widget */ /* create the over-bug-meter menu */ bw->menu_popup.over_bug = a_Menu_popup_ob_new(bw); bw->status = a_Dw_gtk_statuslabel_new(""); gtk_misc_set_alignment(GTK_MISC(bw->status), 0.0, 0.5); /* status widget for HTML errors. * Note: the "clicked" signal is hooked with the linkblock later */ button = bw->status_bug_meter = a_Gtk_ext_button_new(); GTK_WIDGET_UNSET_FLAGS (button, GTK_CAN_FOCUS); a_Gtk_ext_button_set_command (GTK_EXT_BUTTON (button), 1); a_Gtk_ext_button_attach_menu (GTK_EXT_BUTTON (button), 3, GTK_MENU(bw->menu_popup.over_bug)); hbox = gtk_hbox_new(FALSE, 0); pixmap = Interface_pixmap_new(bw->main_window, mini_bug_xpm); gtk_object_set_data(GTK_OBJECT (button), "bug", pixmap); gtk_box_pack_start(GTK_BOX(hbox), pixmap, FALSE, FALSE, 0); pixmap = Interface_pixmap_new(bw->main_window, mini_ok_xpm); gtk_object_set_data(GTK_OBJECT (button), "ok", pixmap); gtk_box_pack_start(GTK_BOX(hbox), pixmap, FALSE, FALSE, 0); gtk_widget_show (pixmap); label = gtk_label_new(""); gtk_object_set_data(GTK_OBJECT (button), "label", label); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_container_add (GTK_CONTAINER (button), hbox); gtk_widget_show(hbox); gtk_tooltips_set_tip (tooltips, button, "Show HTML bugs (right-click for menu).", ""); bw->status_box = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(bw->status_box), bw->status, TRUE, TRUE, 2); gtk_widget_show(bw->status); gtk_box_pack_start(GTK_BOX(bw->status_box), button, FALSE, FALSE, 0); gtk_widget_show(button); Interface_add_full_screen_button (bw, GTK_BOX (bw->status_box)); gtk_box_pack_start(GTK_BOX(box1), bw->status_box, FALSE, FALSE, 0); gtk_widget_show(bw->status_box); gtk_widget_show(bw->main_window); gtk_widget_show(box1); /* initialize the rest of the bw's data. */ bw->pagemarks_menuitem = NULL; bw->pagemarks_menu = NULL; bw->pagemarks_last = NULL; bw->viewbugs_menuitem = NULL; /* the image menu is created first because it is used by the link menu */ bw->menu_popup.over_image = a_Menu_popup_oi_new(bw); bw->menu_popup.over_link = a_Menu_popup_ol_new(bw); bw->menu_popup.over_page = a_Menu_popup_op_new(bw); bw->menu_popup.over_back = NULL; bw->menu_popup.over_forw = NULL; bw->menu_popup.url = NULL; bw->menu_popup.url2 = NULL; bw->sens_idle_id = 0; bw->CursorType = -1; bw->RootClients = NULL; bw->NumRootClients = 0; bw->MaxRootClients = 8; bw->ImageClients = NULL; bw->NumImageClients = 0; bw->MaxImageClients = 8; bw->NumImages = 0; bw->NumImagesGot = 0; bw->PageUrls = NULL; bw->NumPageUrls = 0; bw->MaxPageUrls = 8; bw->open_dialog_window = NULL; bw->open_dialog_entry = NULL; bw->openfile_dialog_window = NULL; bw->quit_dialog_window = NULL; bw->save_dialog_window = NULL; bw->save_link_dialog_window = NULL; bw->findtext_dialog_window = NULL; bw->findtext_dialog_check = NULL; bw->findtext_dialog_entry = NULL; bw->search_dialog_window = NULL; bw->search_dialog_entry = NULL; bw->proxy_passwd_dialog_window = NULL; bw->proxy_passwd_dialog_entry = NULL; bw->question_dialog_window = NULL; bw->question_dialog_data = NULL; bw->viewsource_window = NULL; bw->pagebugs_window = NULL; /* now that the bw is made, let's customize it.. */ Interface_browser_window_customize(bw); return bw;}/* * Set the title of the browser window to start with "Dillo: " * prepended to it. */void a_Interface_set_page_title(BrowserWindow *bw, char *title){ GString *buf; g_return_if_fail (bw != NULL && title != NULL); buf = g_string_new(""); g_string_sprintfa(buf, "Dillo: %s", title); gtk_window_set_title(GTK_WINDOW(bw->main_window), buf->str); g_string_free(buf, TRUE);}/* * Set location entry's text */void a_Interface_set_location_text(BrowserWindow *bw, char *text){ gtk_entry_set_text(GTK_ENTRY(bw->location), text);}/* * Get location entry's text */gchar *a_Interface_get_location_text(BrowserWindow *bw){ return gtk_entry_get_text(GTK_ENTRY(bw->location));}/* * Reset images and text progress bars */void a_Interface_reset_progress_bars(BrowserWindow *bw){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -