> Index: gtk/gtk_menu.c > this file is from the customization / theming branch; it handles menu creation as the glade menus were in need of modification to properly integrate the right-click menu as well as theming / customization; I have defined macros to simplify the way the file looks, to simplify adding menu items subsequently; > =================================================================== > --- /dev/null 2009-04-16 19:17:07.000000000 +0100 > +++ gtk/gtk_menu.c 2009-07-10 12:49:36.000000000 +0100 > @@ -0,0 +1,231 @@ > +/* > + * Copyright 2009 Mark Benjamin <[email protected]> > + * > + * This file is part of NetSurf, http://www.netsurf-browser.org/ > + * > + * NetSurf 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; version 2 of the License. > + * > + * NetSurf 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, see <http://www.gnu.org/licenses/>. > + */ > + > +#include <gdk/gdkkeysyms.h> > +#include <gtk/gtk.h> > +#include <stdlib.h> > +#include "gtk/gtk_menu.h" > +#include "utils/messages.h" > + > +static struct nsgtk_export_submenu *nsgtk_menu_export_submenu(GtkAccelGroup > *); > +static struct nsgtk_scaleview_submenu *nsgtk_menu_scaleview_submenu( > + GtkAccelGroup *); > +static struct nsgtk_images_submenu *nsgtk_menu_images_submenu(GtkAccelGroup > *); > +static struct nsgtk_toolbars_submenu *nsgtk_menu_toolbars_submenu( > + GtkAccelGroup *); > +static struct nsgtk_debugging_submenu *nsgtk_menu_debugging_submenu( > + GtkAccelGroup *); > + > +static unsigned int key; > +static GdkModifierType mod; > + > +#define IMAGE_ITEM(p, q, r)\ > + ret->q##_menuitem = GTK_IMAGE_MENU_ITEM(\ > + gtk_image_menu_item_new_with_mnemonic(\ > + messages_get(#r)));\ > + gtk_accelerator_parse(messages_get(#r "Accel"), &key, &mod);\ > + if (key > 0)\ > + gtk_widget_add_accelerator(GTK_WIDGET(ret->q##_menuitem),\ > + "activate", group, key, mod, > GTK_ACCEL_VISIBLE);\ > + gtk_menu_shell_append(GTK_MENU_SHELL(ret->p##_menu),\ > + GTK_WIDGET(ret->q##_menuitem));\ > + gtk_widget_show(GTK_WIDGET(ret->q##_menuitem)) > +#define CHECK_ITEM(p, q, r)\ > + ret->q##_menuitem = GTK_CHECK_MENU_ITEM(\ > + gtk_check_menu_item_new_with_mnemonic(\ > + messages_get(#r)));\ > + gtk_menu_shell_append(GTK_MENU_SHELL(ret->p##_menu),\ > + GTK_WIDGET(ret->q##_menuitem));\ > + gtk_widget_show(GTK_WIDGET(ret->q##_menuitem)) > + > +#define SET_SUBMENU(q)\ > + ret->q##_submenu = nsgtk_menu_##q##_submenu(group);\ > + gtk_menu_item_set_submenu(GTK_MENU_ITEM(ret->q##_menuitem),\ > + GTK_WIDGET(ret->q##_submenu->q##_menu)) > +#define ADD_SEP(q)\ > + w = gtk_separator_menu_item_new();\ > + gtk_menu_shell_append(GTK_MENU_SHELL(ret->q##_menu), w);\ > + gtk_widget_show(w) > +struct nsgtk_file_menu *nsgtk_menu_file_menu(GtkAccelGroup *group) > +{ > + GtkWidget *w; > + struct nsgtk_file_menu *ret = malloc(sizeof(struct nsgtk_file_menu)); > + ret->file_menu = GTK_MENU(gtk_menu_new()); > + IMAGE_ITEM(file, newwindow, gtkNewWindow); > + IMAGE_ITEM(file, newtab, gtkNewTab); > + IMAGE_ITEM(file, openfile, gtkOpenFile); > + IMAGE_ITEM(file, closewindow, gtkCloseWindow); > + ADD_SEP(file); > + IMAGE_ITEM(file, savepage, gtkSavePage); > + IMAGE_ITEM(file, export, gtkExport); > + ADD_SEP(file); > + IMAGE_ITEM(file, printpreview, gtkPrintPreview); > + IMAGE_ITEM(file, print, gtkPrint); > + ADD_SEP(file); > + IMAGE_ITEM(file, quit, gtkQuit); > + SET_SUBMENU(export); > + return ret; > +} > + > +struct nsgtk_edit_menu *nsgtk_menu_edit_menu(GtkAccelGroup *group) > +{ > + GtkWidget *w; > + struct nsgtk_edit_menu *ret = malloc(sizeof(struct nsgtk_edit_menu)); > + ret->edit_menu = GTK_MENU(gtk_menu_new()); > + IMAGE_ITEM(edit, cut, gtkCut); > + IMAGE_ITEM(edit, copy, gtkCopy); > + IMAGE_ITEM(edit, paste, gtkPaste); > + IMAGE_ITEM(edit, delete, gtkDelete); > + ADD_SEP(edit); > + IMAGE_ITEM(edit, selectall, gtkSelectAll); > + ADD_SEP(edit); > + IMAGE_ITEM(edit, find, gtkFind); > + ADD_SEP(edit); > + IMAGE_ITEM(edit, preferences, gtkPreferences); > + return ret; > +} > + > +struct nsgtk_view_menu *nsgtk_menu_view_menu(GtkAccelGroup *group) > +{ > + GtkWidget *w; > + struct nsgtk_view_menu *ret = malloc(sizeof(struct nsgtk_view_menu)); > + ret->view_menu = GTK_MENU(gtk_menu_new()); > + IMAGE_ITEM(view, stop, gtkStop); > + IMAGE_ITEM(view, reload, gtkReload); > + ADD_SEP(view); > + IMAGE_ITEM(view, scaleview, gtkScaleView); > + IMAGE_ITEM(view, fullscreen, gtkFullScreen); > + IMAGE_ITEM(view, viewsource, gtkViewSource); > + ADD_SEP(view); > + IMAGE_ITEM(view, images, gtkImages); > + IMAGE_ITEM(view, toolbars, gtkToolbars); > + ADD_SEP(view); > + IMAGE_ITEM(view, downloads, gtkDownloads); > + IMAGE_ITEM(view, savewindowsize, gtkSaveWindowSize); > + IMAGE_ITEM(view, debugging, gtkDebugging); > + SET_SUBMENU(scaleview); > + SET_SUBMENU(images); > + SET_SUBMENU(toolbars); > + SET_SUBMENU(debugging); > + return ret; > +} > + > +struct nsgtk_nav_menu *nsgtk_menu_nav_menu(GtkAccelGroup *group) > +{ > + GtkWidget *w; > + struct nsgtk_nav_menu *ret = malloc(sizeof(struct nsgtk_nav_menu)); > + ret->nav_menu = GTK_MENU(gtk_menu_new()); > + IMAGE_ITEM(nav, back, gtkBack); > + IMAGE_ITEM(nav, forward, gtkForward); > + IMAGE_ITEM(nav, home, gtkHome); > + ADD_SEP(nav); > + IMAGE_ITEM(nav, localhistory, gtkLocalHistory); > + IMAGE_ITEM(nav, globalhistory, gtkGlobalHistory); > + ADD_SEP(nav); > + IMAGE_ITEM(nav, addbookmarks, gtkAddBookMarks); > + IMAGE_ITEM(nav, showbookmarks, gtkShowBookMarks); > + ADD_SEP(nav); > + IMAGE_ITEM(nav, openlocation, gtkOpenLocation); > + return ret; > +} > + > +struct nsgtk_tabs_menu *nsgtk_menu_tabs_menu(GtkAccelGroup *group) > +{ > + struct nsgtk_tabs_menu *ret = malloc(sizeof(struct nsgtk_tabs_menu)); > + ret->tabs_menu = GTK_MENU(gtk_menu_new()); > + IMAGE_ITEM(tabs, nexttab, gtkNextTab); > + IMAGE_ITEM(tabs, prevtab, gtkPrevTab); > + IMAGE_ITEM(tabs, closetab, gtkCloseTab); > + return ret; > +} > + > +struct nsgtk_help_menu *nsgtk_menu_help_menu(GtkAccelGroup *group) > +{ > + GtkWidget *w; > + struct nsgtk_help_menu *ret = malloc(sizeof(struct nsgtk_help_menu)); > + ret->help_menu = GTK_MENU(gtk_menu_new()); > + IMAGE_ITEM(help, contents, gtkContents); > + IMAGE_ITEM(help, guide, gtkGuide); > + IMAGE_ITEM(help, info, gtkUserInformation); > + ADD_SEP(help); > + IMAGE_ITEM(help, about, gtkAbout); > + return ret; > +} > + > +struct nsgtk_export_submenu *nsgtk_menu_export_submenu(GtkAccelGroup *group) > +{ > + struct nsgtk_export_submenu *ret = malloc(sizeof(struct > + nsgtk_export_submenu)); > + ret->export_menu = GTK_MENU(gtk_menu_new()); > + IMAGE_ITEM(export, plaintext, gtkPlainText); > + IMAGE_ITEM(export, drawfile, gtkDrawFile); > + IMAGE_ITEM(export, postscript, gtkPostScript); > + IMAGE_ITEM(export, pdf, gtkPDF); > + return ret; > +} > + > +struct nsgtk_scaleview_submenu *nsgtk_menu_scaleview_submenu(GtkAccelGroup > + *group) > +{ > + struct nsgtk_scaleview_submenu *ret = malloc(sizeof(struct > + nsgtk_scaleview_submenu)); > + ret->scaleview_menu = GTK_MENU(gtk_menu_new()); > + IMAGE_ITEM(scaleview, zoomplus, gtkZoomPlus); > + IMAGE_ITEM(scaleview, zoomnormal, gtkZoomNormal); > + IMAGE_ITEM(scaleview, zoomminus, gtkZoomMinus); > + return ret; > +} > +struct nsgtk_images_submenu *nsgtk_menu_images_submenu(GtkAccelGroup *group) > +{ > + struct nsgtk_images_submenu *ret = malloc(sizeof(struct > + nsgtk_images_submenu)); > + ret->images_menu = GTK_MENU(gtk_menu_new()); > + CHECK_ITEM(images, foregroundimages, gtkForegroundImages); > + CHECK_ITEM(images, backgroundimages, gtkBackgroundImages); > + return ret; > +} > +struct nsgtk_toolbars_submenu *nsgtk_menu_toolbars_submenu(GtkAccelGroup > *group) > +{ > + struct nsgtk_toolbars_submenu *ret = malloc(sizeof(struct > + nsgtk_toolbars_submenu)); > + ret->toolbars_menu = GTK_MENU(gtk_menu_new()); > + CHECK_ITEM(toolbars, menubar, gtkMenuBar); > + gtk_check_menu_item_set_active(ret->menubar_menuitem, TRUE); > + CHECK_ITEM(toolbars, toolbar, gtkToolBar); > + gtk_check_menu_item_set_active(ret->toolbar_menuitem, TRUE); > + CHECK_ITEM(toolbars, statusbar, gtkStatusBar); > + gtk_check_menu_item_set_active(ret->statusbar_menuitem, TRUE); > + return ret; > +} > +struct nsgtk_debugging_submenu *nsgtk_menu_debugging_submenu(GtkAccelGroup > + *group) > +{ > + struct nsgtk_debugging_submenu *ret = malloc(sizeof(struct > + nsgtk_debugging_submenu)); > + ret->debugging_menu = GTK_MENU(gtk_menu_new()); > + IMAGE_ITEM(debugging, toggledebugging, gtkToggleDebugging); > + IMAGE_ITEM(debugging, saveboxtree, gtkSaveBoxTree); > + IMAGE_ITEM(debugging, savedomtree, gtkSaveDomTree); > + return ret; > +} > + > +#undef CHECK_ITEM > +#undef IMAGE_ITEM > +#undef SET_SUBMENU > +#undef ADD_SEP > +
> Index: gtk/gtk_menu.h > =================================================================== > --- /dev/null 2009-04-16 19:17:07.000000000 +0100 > +++ gtk/gtk_menu.h 2009-07-10 12:49:38.000000000 +0100 > @@ -0,0 +1,135 @@ > +/* > + * Copyright 2009 Mark Benjamin <[email protected]> > + * > + * This file is part of NetSurf, http://www.netsurf-browser.org/ > + * > + * NetSurf 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; version 2 of the License. > + * > + * NetSurf 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, see <http://www.gnu.org/licenses/>. > + */ > +#ifndef _NETSURF_GTK_MENU_H_ > +#define _NETSURF_GTK_MENU_H_ > + > +#include <gtk/gtk.h> > + > +struct nsgtk_file_menu { > + GtkMenu *file_menu; > + GtkImageMenuItem *newwindow_menuitem; > + GtkImageMenuItem *newtab_menuitem; > + GtkImageMenuItem *openfile_menuitem; > + GtkImageMenuItem *closewindow_menuitem; > + GtkImageMenuItem *savepage_menuitem; > + GtkImageMenuItem *export_menuitem; > + struct nsgtk_export_submenu *export_submenu; > + GtkImageMenuItem *printpreview_menuitem; > + GtkImageMenuItem *print_menuitem; > + GtkImageMenuItem *quit_menuitem; > +}; > + > +struct nsgtk_edit_menu { > + GtkMenu *edit_menu; > + GtkImageMenuItem *cut_menuitem; > + GtkImageMenuItem *copy_menuitem; > + GtkImageMenuItem *paste_menuitem; > + GtkImageMenuItem *delete_menuitem; > + GtkImageMenuItem *selectall_menuitem; > + GtkImageMenuItem *find_menuitem; > + GtkImageMenuItem *preferences_menuitem; > +}; > + > +struct nsgtk_view_menu { > + GtkMenu *view_menu; > + GtkImageMenuItem *stop_menuitem; > + GtkImageMenuItem *reload_menuitem; > + GtkImageMenuItem *scaleview_menuitem; > + struct nsgtk_scaleview_submenu *scaleview_submenu; > + GtkImageMenuItem *fullscreen_menuitem; > + GtkImageMenuItem *viewsource_menuitem; > + GtkImageMenuItem *images_menuitem; > + struct nsgtk_images_submenu *images_submenu; > + GtkImageMenuItem *toolbars_menuitem; > + struct nsgtk_toolbars_submenu *toolbars_submenu; > + GtkImageMenuItem *downloads_menuitem; > + GtkImageMenuItem *savewindowsize_menuitem; > + GtkImageMenuItem *debugging_menuitem; > + struct nsgtk_debugging_submenu *debugging_submenu; > +}; > + > +struct nsgtk_nav_menu { > + GtkMenu *nav_menu; > + GtkImageMenuItem *back_menuitem; > + GtkImageMenuItem *forward_menuitem; > + GtkImageMenuItem *home_menuitem; > + GtkImageMenuItem *localhistory_menuitem; > + GtkImageMenuItem *globalhistory_menuitem; > + GtkImageMenuItem *addbookmarks_menuitem; > + GtkImageMenuItem *showbookmarks_menuitem; > + GtkImageMenuItem *openlocation_menuitem; > +}; > + > +struct nsgtk_tabs_menu { > + GtkMenu *tabs_menu; > + GtkImageMenuItem *nexttab_menuitem; > + GtkImageMenuItem *prevtab_menuitem; > + GtkImageMenuItem *closetab_menuitem; > +}; > + > +struct nsgtk_help_menu { > + GtkMenu *help_menu; > + GtkImageMenuItem *contents_menuitem; > + GtkImageMenuItem *guide_menuitem; > + GtkImageMenuItem *info_menuitem; > + GtkImageMenuItem *about_menuitem; > +}; > + > +struct nsgtk_export_submenu { > + GtkMenu *export_menu; > + GtkImageMenuItem *plaintext_menuitem; > + GtkImageMenuItem *drawfile_menuitem; > + GtkImageMenuItem *postscript_menuitem; > + GtkImageMenuItem *pdf_menuitem; > +}; > + > +struct nsgtk_scaleview_submenu { > + GtkMenu *scaleview_menu; > + GtkImageMenuItem *zoomplus_menuitem; > + GtkImageMenuItem *zoomminus_menuitem; > + GtkImageMenuItem *zoomnormal_menuitem; > +}; > + > +struct nsgtk_images_submenu { > + GtkMenu *images_menu; > + GtkCheckMenuItem *foregroundimages_menuitem; > + GtkCheckMenuItem *backgroundimages_menuitem; > +}; > + > +struct nsgtk_toolbars_submenu { > + GtkMenu *toolbars_menu; > + GtkCheckMenuItem *menubar_menuitem; > + GtkCheckMenuItem *toolbar_menuitem; > + GtkCheckMenuItem *statusbar_menuitem; > +}; > + > +struct nsgtk_debugging_submenu { > + GtkMenu *debugging_menu; > + GtkImageMenuItem *toggledebugging_menuitem; > + GtkImageMenuItem *saveboxtree_menuitem; > + GtkImageMenuItem *savedomtree_menuitem; > +}; > + > +struct nsgtk_file_menu *nsgtk_menu_file_menu(GtkAccelGroup *group); > +struct nsgtk_edit_menu *nsgtk_menu_edit_menu(GtkAccelGroup *group); > +struct nsgtk_view_menu *nsgtk_menu_view_menu(GtkAccelGroup *group); > +struct nsgtk_nav_menu *nsgtk_menu_nav_menu(GtkAccelGroup *group); > +struct nsgtk_tabs_menu *nsgtk_menu_tabs_menu(GtkAccelGroup *group); > +struct nsgtk_help_menu *nsgtk_menu_help_menu(GtkAccelGroup *group); > + > +#endif -- Mark http://www.halloit.com Key ID 046B65CF
