> 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


Reply via email to