📄 menu.c
字号:
/* * Dillo * * Some code copied from: * The GIMP -- an image manipulation program * Copyright (C) 1995 Spencer Kimball and Peter Mattis * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <gtk/gtk.h>#include <gdk/gdkkeysyms.h>#include "history.h"#include "nav.h"#include "commands.h"#include "dw_gtk_scrolled_window.h"#include "dw_page.h" /* for a_Dw_page_add_anchor */#include "bookmark.h"#include "interface.h"#include "menu.h"#include "selection.h"#include "gtk_ext_menu.h"#include "gtk_ext_menu_item.h"#include "gtk_menu_title.h"/* * Forward declarations */static void Menu_pagemarks_goto_pagemark(GtkWidget *widget, gpointer client_data);/* * Make a new menu, insert it into the menu bar, and return it. */static GtkWidget* Menu_new(GtkWidget *menubar, const char *name, gboolean right_justify, BrowserWindow *bw){ GtkWidget *menu; GtkWidget *menuitem; guint tmp_key; menu = gtk_menu_new(); menuitem = gtk_menu_item_new_with_label((char *) name); tmp_key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(menuitem)->child), name); gtk_widget_add_accelerator(menuitem, "activate_item", bw->accel_group, tmp_key, GDK_MOD1_MASK, 0); if ( right_justify ) gtk_menu_item_right_justify(GTK_MENU_ITEM(menuitem)); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu); gtk_menu_bar_append(GTK_MENU_BAR(menubar), menuitem); gtk_widget_show(menuitem); gtk_menu_set_accel_group(GTK_MENU(menu), bw->accel_group); return menu;}/* * Pick the right URL for this popup. */void Menu_pick_url (GtkWidget *widget, gpointer client_data){ BrowserWindow *bw = (BrowserWindow *)client_data; if (gtk_object_get_data(GTK_OBJECT (GTK_MENU (widget->parent)), "url2")) { a_Menu_popup_set_url(bw, bw->menu_popup.url2); } /* clean the url2 tag (currently "over_image" is the only one using it) */ gtk_object_remove_data(GTK_OBJECT (bw->menu_popup.over_image), "url2");}/* * Add an item to a menu, including the name, an accelerator (not yet * implemented), and a callback function for activation. */static GtkWidget * Menu_add (GtkWidget *menu, const char *name, const char *accel, BrowserWindow *bw, void (*callback) (GtkWidget *widget, void *data), void *data){ GtkWidget *menuitem; GtkAccelGroup *menu_accels; GdkModifierType accel_mods; guint accel_key; guint tmp_key; menuitem = gtk_menu_item_new_with_label((char *) name); gtk_menu_append(GTK_MENU(menu), menuitem); menu_accels = gtk_menu_ensure_uline_accel_group(GTK_MENU(menu)); tmp_key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(menuitem)->child), name); gtk_widget_add_accelerator(menuitem, "activate_item", menu_accels, tmp_key, 0, 0); gtk_widget_show(menuitem); if (accel != NULL) { gtk_accelerator_parse(accel, &accel_key, &accel_mods); gtk_widget_add_accelerator(menuitem, "activate", bw->accel_group, accel_key, (guint)accel_mods, GTK_ACCEL_VISIBLE); } if (callback != NULL) { gtk_signal_connect(GTK_OBJECT(menuitem), "activate", (GtkSignalFunc) Menu_pick_url, bw); gtk_signal_connect(GTK_OBJECT(menuitem), "activate", (GtkSignalFunc) callback, data); } return menuitem;}/* * Add a menu title. */static GtkWidget *Menu_add_title (GtkWidget *menu, const char *name){ GtkWidget *menuitem; menuitem = a_Gtk_menu_title_new(name); gtk_menu_append(GTK_MENU(menu), menuitem); gtk_widget_show(menuitem); return menuitem;}/* * Add a separator into the menu. */static void Menu_sep(GtkWidget *menu){ GtkWidget *widget; widget = gtk_menu_item_new(); gtk_menu_append(GTK_MENU(menu), widget); gtk_widget_set_sensitive(widget, FALSE); gtk_widget_show(widget);}/* * Make up a new menubar for a main browser window. The accelerator table * is stored in bw->accel_group. * Currently does not deal with dynamic menu items (bookmarks and history). * CP: It *seems* to handle dynamic menu items... */GtkWidget *a_Menu_mainbar_new(BrowserWindow *bw, gint tiny){ GtkWidget *menubar; GtkWidget *file_menu; /* GtkWidget *help_menu; */ bw->menubar = menubar = gtk_menu_bar_new(); /* FILE MENU */ file_menu = Menu_new(menubar, tiny ? "_F" : "_File", FALSE, bw); Menu_add(file_menu, "_New Browser", "<ctrl>N", bw, a_Commands_new_callback, bw); Menu_add(file_menu, "_Open File...", "<ctrl>O", bw, a_Commands_openfile_callback, bw); Menu_add(file_menu, "Open _URL...", "<ctrl>L", bw, a_Commands_openurl_callback, bw); /* Menu_add(file_menu, "_Preferences", "<ctrl>E", bw, a_Commands_prefs_callback, bw); */ Menu_add(file_menu, "Close Window", "<ctrl>Q", bw, a_Commands_close_callback, bw); Menu_sep(file_menu); Menu_add(file_menu, "Exit Dillo", "<alt>Q", bw, a_Commands_exit_callback, bw); /* HELP MENU help_menu = Menu_new(menubar, "_Help", TRUE, bw); Menu_add(help_menu, "Dillo _Home", NULL, bw, a_Commands_helphome_callback, bw); */ return menubar;}/* * Make a new popup menu and return it. */GtkWidget *a_Menu_popup_op_new(BrowserWindow *bw){ GtkWidget *menu; menu = gtk_menu_new(); Menu_sep(menu); Menu_add_title(menu, "PAGE OPTIONS"); Menu_sep(menu); Menu_add(menu, "View page Source", NULL, bw, a_Commands_viewsource_callback, bw); bw->viewbugs_menuitem = Menu_add(menu, "View page Bugs", NULL,bw, NULL,bw); Menu_add(menu, "Bookmark this page", NULL, bw, a_Commands_addbm_callback, bw); Menu_sep(menu); Menu_add(menu, "_Find Text", "<ctrl>F", bw, a_Commands_findtext_callback, bw); bw->pagemarks_menuitem = Menu_add(menu, "Jump to...", NULL, bw, NULL, bw); Menu_sep(menu); Menu_add(menu, "Save page As...", NULL, bw, a_Commands_save_callback, bw); return menu;}/* * Set the popup's primary DilloUrl */void a_Menu_popup_set_url(BrowserWindow *bw, const DilloUrl *url){ if (bw->menu_popup.url) a_Url_free(bw->menu_popup.url); bw->menu_popup.url = a_Url_dup(url);}/* * Set the popup's secondary DilloUrl * Note: this URL is used by the image submenu of the link popup. * (If the need arises, this can be extended using an URL array in the popup * structure, and by setting the to-be-picked-URL-index in the popup) */void a_Menu_popup_set_url2(BrowserWindow *bw, const DilloUrl *url){ if (bw->menu_popup.url2) a_Url_free(bw->menu_popup.url2); bw->menu_popup.url2 = a_Url_dup(url);}/* * Get the popup's DilloUrl */DilloUrl *a_Menu_popup_get_url(BrowserWindow *bw){ return bw->menu_popup.url;}/* * Put the url in the status bar when moving cursor over menuitem. */static voidMenu_popup_history_select_callback(GtkWidget *widget, gpointer data){ gint idx; BrowserWindow *bw = data; idx = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT (widget), "nav_idx"));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -