summaryrefslogtreecommitdiff
path: root/gtk/gtk_menu.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/gtk_menu.c')
-rw-r--r--gtk/gtk_menu.c292
1 files changed, 161 insertions, 131 deletions
diff --git a/gtk/gtk_menu.c b/gtk/gtk_menu.c
index 9f033666d..92323b208 100644
--- a/gtk/gtk_menu.c
+++ b/gtk/gtk_menu.c
@@ -56,7 +56,7 @@ static bool nsgtk_menu_add_image_item(GtkMenu *menu,
#define IMAGE_ITEM(p, q, r, s, t)\
nsgtk_menu_add_image_item(s->p##_menu, &(s->q##_menuitem), #r,\
- #r "Accel", t);
+ #r "Accel", t)
#define CHECK_ITEM(p, q, r, s)\
s->q##_menuitem = GTK_CHECK_MENU_ITEM(\
@@ -68,20 +68,38 @@ static bool nsgtk_menu_add_image_item(GtkMenu *menu,
gtk_widget_show(GTK_WIDGET(s->q##_menuitem));\
}
-#define SET_SUBMENU(q, r)\
- r->q##_submenu = nsgtk_menu_##q##_submenu(group);\
- if ((r->q##_submenu != NULL) && (r->q##_submenu->q##_menu != NULL) && \
- (r->q##_menuitem != NULL)) {\
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(r->q##_menuitem),\
- GTK_WIDGET(r->q##_submenu->q##_menu));\
- }
-
-#define ADD_SEP(q, r)\
- w = gtk_separator_menu_item_new();\
- if ((w != NULL) && (r->q##_menu != NULL)) {\
- gtk_menu_shell_append(GTK_MENU_SHELL(r->q##_menu), w);\
- gtk_widget_show(w);\
- }
+#define SET_SUBMENU(q, r) \
+ do { \
+ r->q##_submenu = nsgtk_menu_##q##_submenu(group); \
+ if ((r->q##_submenu != NULL) && \
+ (r->q##_submenu->q##_menu != NULL) && \
+ (r->q##_menuitem != NULL)) { \
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(r->q##_menuitem), \
+ GTK_WIDGET(r->q##_submenu->q##_menu)); \
+ } \
+ } while(0)
+
+#define ADD_SEP(q, r) \
+ do { \
+ GtkWidget *w = gtk_separator_menu_item_new(); \
+ if ((w != NULL) && (r->q##_menu != NULL)) { \
+ gtk_menu_shell_append(GTK_MENU_SHELL(r->q##_menu), w); \
+ gtk_widget_show(w); \
+ } \
+ } while(0)
+
+#define ATTACH_PARENT(parent, msgname, menuv, group) \
+ do { \
+ if (parent != NULL) { \
+ /* create top level menu entry and attach to parent */ \
+ menuv = GTK_MENU_ITEM(gtk_menu_item_new_with_mnemonic(messages_get(#msgname))); \
+ gtk_menu_shell_append(parent, GTK_WIDGET(menuv)); \
+ gtk_widget_show(GTK_WIDGET(menuv)); \
+ /* attach submenu to parent */ \
+ gtk_menu_item_set_submenu(menuv, GTK_WIDGET(menuv##_menu)); \
+ gtk_menu_set_accel_group(menuv##_menu, group); \
+ } \
+ } while(0)
/**
* creates an export submenu
@@ -102,10 +120,10 @@ static struct nsgtk_export_submenu *nsgtk_menu_export_submenu(GtkAccelGroup *gro
free(ret);
return NULL;
}
- IMAGE_ITEM(export, plaintext, gtkPlainText, ret, group)
- IMAGE_ITEM(export, drawfile, gtkDrawFile, ret, group)
- IMAGE_ITEM(export, postscript, gtkPostScript, ret, group)
- IMAGE_ITEM(export, pdf, gtkPDF, ret, group)
+ IMAGE_ITEM(export, plaintext, gtkPlainText, ret, group);
+ IMAGE_ITEM(export, drawfile, gtkDrawFile, ret, group);
+ IMAGE_ITEM(export, postscript, gtkPostScript, ret, group);
+ IMAGE_ITEM(export, pdf, gtkPDF, ret, group);
return ret;
}
@@ -129,9 +147,9 @@ static struct nsgtk_scaleview_submenu *nsgtk_menu_scaleview_submenu(
free(ret);
return NULL;
}
- IMAGE_ITEM(scaleview, zoomplus, gtkZoomPlus, ret, group)
- IMAGE_ITEM(scaleview, zoomnormal, gtkZoomNormal, ret, group)
- IMAGE_ITEM(scaleview, zoomminus, gtkZoomMinus, ret, group)
+ IMAGE_ITEM(scaleview, zoomplus, gtkZoomPlus, ret, group);
+ IMAGE_ITEM(scaleview, zoomnormal, gtkZoomNormal, ret, group);
+ IMAGE_ITEM(scaleview, zoomminus, gtkZoomMinus, ret, group);
return ret;
}
@@ -208,44 +226,52 @@ static struct nsgtk_debugging_submenu *nsgtk_menu_debugging_submenu(
free(ret);
return NULL;
}
- IMAGE_ITEM(debugging, toggledebugging, gtkToggleDebugging, ret, group)
- IMAGE_ITEM(debugging, saveboxtree, gtkSaveBoxTree, ret, group)
- IMAGE_ITEM(debugging, savedomtree, gtkSaveDomTree, ret, group)
+ IMAGE_ITEM(debugging, toggledebugging, gtkToggleDebugging, ret, group);
+ IMAGE_ITEM(debugging, saveboxtree, gtkSaveBoxTree, ret, group);
+ IMAGE_ITEM(debugging, savedomtree, gtkSaveDomTree, ret, group);
return ret;
}
/**
- * creates the a file menu
- * \param group the 'global' in a gtk sense accelerator reference
+ * creates the file menu
+ * \param group The gtk 'global' accelerator reference
+ * \param parent The parent menu to attach to or NULL
*/
-static struct nsgtk_file_menu *nsgtk_menu_file_menu(GtkAccelGroup *group)
+static struct nsgtk_file_menu *nsgtk_menu_file_menu(GtkAccelGroup *group,
+ GtkMenuShell *parent)
{
- GtkWidget *w;
- struct nsgtk_file_menu *ret = malloc(sizeof(struct nsgtk_file_menu));
- if (ret == NULL) {
+ struct nsgtk_file_menu *fmenu;
+
+ fmenu = malloc(sizeof(struct nsgtk_file_menu));
+ if (fmenu == NULL) {
warn_user(messages_get("NoMemory"), 0);
return NULL;
}
- ret->file_menu = GTK_MENU(gtk_menu_new());
- if (ret->file_menu == NULL) {
+
+ fmenu->file_menu = GTK_MENU(gtk_menu_new());
+ if (fmenu->file_menu == NULL) {
warn_user(messages_get("NoMemory"), 0);
- free(ret);
+ free(fmenu);
return NULL;
}
- IMAGE_ITEM(file, newwindow, gtkNewWindow, ret, group)
- IMAGE_ITEM(file, newtab, gtkNewTab, ret, group)
- IMAGE_ITEM(file, openfile, gtkOpenFile, ret, group)
- IMAGE_ITEM(file, closewindow, gtkCloseWindow, ret, group)
- ADD_SEP(file, ret)
- IMAGE_ITEM(file, savepage, gtkSavePage, ret, group)
- IMAGE_ITEM(file, export, gtkExport, ret, group)
- ADD_SEP(file, ret)
- IMAGE_ITEM(file, printpreview, gtkPrintPreview, ret, group)
- IMAGE_ITEM(file, print, gtkPrint, ret, group)
- ADD_SEP(file, ret)
- IMAGE_ITEM(file, quit, gtkQuitMenu, ret, group)
- SET_SUBMENU(export, ret)
- return ret;
+
+ IMAGE_ITEM(file, newwindow, gtkNewWindow, fmenu, group);
+ IMAGE_ITEM(file, newtab, gtkNewTab, fmenu, group);
+ IMAGE_ITEM(file, openfile, gtkOpenFile, fmenu, group);
+ IMAGE_ITEM(file, closewindow, gtkCloseWindow, fmenu, group);
+ ADD_SEP(file, fmenu);
+ IMAGE_ITEM(file, savepage, gtkSavePage, fmenu, group);
+ IMAGE_ITEM(file, export, gtkExport, fmenu, group);
+ ADD_SEP(file, fmenu);
+ IMAGE_ITEM(file, printpreview, gtkPrintPreview, fmenu, group);
+ IMAGE_ITEM(file, print, gtkPrint, fmenu, group);
+ ADD_SEP(file, fmenu);
+ IMAGE_ITEM(file, quit, gtkQuitMenu, fmenu, group);
+ SET_SUBMENU(export, fmenu);
+
+ ATTACH_PARENT(parent, gtkFile, fmenu->file, group);
+
+ return fmenu;
}
/**
@@ -253,9 +279,9 @@ static struct nsgtk_file_menu *nsgtk_menu_file_menu(GtkAccelGroup *group)
* \param group the 'global' in a gtk sense accelerator reference
*/
-static struct nsgtk_edit_menu *nsgtk_menu_edit_menu(GtkAccelGroup *group)
+static struct nsgtk_edit_menu *nsgtk_menu_edit_menu(GtkAccelGroup *group,
+ GtkMenuShell *parent)
{
- GtkWidget *w;
struct nsgtk_edit_menu *ret = malloc(sizeof(struct nsgtk_edit_menu));
if (ret == NULL) {
warn_user(messages_get("NoMemory"), 0);
@@ -267,16 +293,19 @@ static struct nsgtk_edit_menu *nsgtk_menu_edit_menu(GtkAccelGroup *group)
free(ret);
return NULL;
}
- IMAGE_ITEM(edit, cut, gtkCut, ret, group)
- IMAGE_ITEM(edit, copy, gtkCopy, ret, group)
- IMAGE_ITEM(edit, paste, gtkPaste, ret, group)
- IMAGE_ITEM(edit, delete, gtkDelete, ret, group)
- ADD_SEP(edit, ret)
- IMAGE_ITEM(edit, selectall, gtkSelectAll, ret, group)
- ADD_SEP(edit, ret)
- IMAGE_ITEM(edit, find, gtkFind, ret, group)
- ADD_SEP(edit, ret)
- IMAGE_ITEM(edit, preferences, gtkPreferences, ret, group)
+ IMAGE_ITEM(edit, cut, gtkCut, ret, group);
+ IMAGE_ITEM(edit, copy, gtkCopy, ret, group);
+ IMAGE_ITEM(edit, paste, gtkPaste, ret, group);
+ IMAGE_ITEM(edit, delete, gtkDelete, ret, group);
+ ADD_SEP(edit, ret);
+ IMAGE_ITEM(edit, selectall, gtkSelectAll, ret, group);
+ ADD_SEP(edit, ret);
+ IMAGE_ITEM(edit, find, gtkFind, ret, group);
+ ADD_SEP(edit, ret);
+ IMAGE_ITEM(edit, preferences, gtkPreferences, ret, group);
+
+ ATTACH_PARENT(parent, gtkEdit, ret->edit, group);
+
return ret;
}
@@ -285,9 +314,9 @@ static struct nsgtk_edit_menu *nsgtk_menu_edit_menu(GtkAccelGroup *group)
* \param group the 'global' in a gtk sense accelerator reference
*/
-static struct nsgtk_view_menu *nsgtk_menu_view_menu(GtkAccelGroup *group)
+static struct nsgtk_view_menu *nsgtk_menu_view_menu(GtkAccelGroup *group,
+ GtkMenuShell *parent)
{
- GtkWidget *w;
struct nsgtk_view_menu *ret = malloc(sizeof(struct nsgtk_view_menu));
if (ret == NULL) {
warn_user(messages_get("NoMemory"), 0);
@@ -299,23 +328,26 @@ static struct nsgtk_view_menu *nsgtk_menu_view_menu(GtkAccelGroup *group)
free(ret);
return NULL;
}
- IMAGE_ITEM(view, stop, gtkStop, ret, group)
- IMAGE_ITEM(view, reload, gtkReload, ret, group)
- ADD_SEP(view, ret)
- IMAGE_ITEM(view, scaleview, gtkScaleView, ret, group)
- IMAGE_ITEM(view, fullscreen, gtkFullScreen, ret, group)
- IMAGE_ITEM(view, viewsource, gtkViewSource, ret, group)
- ADD_SEP(view, ret)
- IMAGE_ITEM(view, images, gtkImages, ret, group)
- IMAGE_ITEM(view, toolbars, gtkToolbars, ret, group)
- ADD_SEP(view, ret)
- IMAGE_ITEM(view, downloads, gtkDownloads, ret, group)
- IMAGE_ITEM(view, savewindowsize, gtkSaveWindowSize, ret, group)
- IMAGE_ITEM(view, debugging, gtkDebugging, ret, group)
- SET_SUBMENU(scaleview, ret)
- SET_SUBMENU(images, ret)
- SET_SUBMENU(toolbars, ret)
- SET_SUBMENU(debugging, ret)
+ IMAGE_ITEM(view, stop, gtkStop, ret, group);
+ IMAGE_ITEM(view, reload, gtkReload, ret, group);
+ ADD_SEP(view, ret);
+ IMAGE_ITEM(view, scaleview, gtkScaleView, ret, group);
+ IMAGE_ITEM(view, fullscreen, gtkFullScreen, ret, group);
+ IMAGE_ITEM(view, viewsource, gtkViewSource, ret, group);
+ ADD_SEP(view, ret);
+ IMAGE_ITEM(view, images, gtkImages, ret, group);
+ IMAGE_ITEM(view, toolbars, gtkToolbars, ret, group);
+ ADD_SEP(view, ret);
+ IMAGE_ITEM(view, downloads, gtkDownloads, ret, group);
+ IMAGE_ITEM(view, savewindowsize, gtkSaveWindowSize, ret, group);
+ IMAGE_ITEM(view, debugging, gtkDebugging, ret, group);
+ SET_SUBMENU(scaleview, ret);
+ SET_SUBMENU(images, ret);
+ SET_SUBMENU(toolbars, ret);
+ SET_SUBMENU(debugging, ret);
+
+ ATTACH_PARENT(parent, gtkView, ret->view, group);
+
return ret;
}
@@ -324,9 +356,9 @@ static struct nsgtk_view_menu *nsgtk_menu_view_menu(GtkAccelGroup *group)
* \param group the 'global' in a gtk sense accelerator reference
*/
-static struct nsgtk_nav_menu *nsgtk_menu_nav_menu(GtkAccelGroup *group)
+static struct nsgtk_nav_menu *nsgtk_menu_nav_menu(GtkAccelGroup *group,
+ GtkMenuShell *parent)
{
- GtkWidget *w;
struct nsgtk_nav_menu *ret = malloc(sizeof(struct nsgtk_nav_menu));
if (ret == NULL) {
warn_user(messages_get("NoMemory"), 0);
@@ -338,17 +370,20 @@ static struct nsgtk_nav_menu *nsgtk_menu_nav_menu(GtkAccelGroup *group)
free(ret);
return NULL;
}
- IMAGE_ITEM(nav, back, gtkBack, ret, group)
- IMAGE_ITEM(nav, forward, gtkForward, ret, group)
- IMAGE_ITEM(nav, home, gtkHome, ret, group)
- ADD_SEP(nav, ret)
- IMAGE_ITEM(nav, localhistory, gtkLocalHistory, ret, group)
- IMAGE_ITEM(nav, globalhistory, gtkGlobalHistory, ret, group)
- ADD_SEP(nav, ret)
- IMAGE_ITEM(nav, addbookmarks, gtkAddBookMarks, ret, group)
- IMAGE_ITEM(nav, showbookmarks, gtkShowBookMarks, ret, group)
- ADD_SEP(nav, ret)
- IMAGE_ITEM(nav, openlocation, gtkOpenLocation, ret, group)
+ IMAGE_ITEM(nav, back, gtkBack, ret, group);
+ IMAGE_ITEM(nav, forward, gtkForward, ret, group);
+ IMAGE_ITEM(nav, home, gtkHome, ret, group);
+ ADD_SEP(nav, ret);
+ IMAGE_ITEM(nav, localhistory, gtkLocalHistory, ret, group);
+ IMAGE_ITEM(nav, globalhistory, gtkGlobalHistory, ret, group);
+ ADD_SEP(nav, ret);
+ IMAGE_ITEM(nav, addbookmarks, gtkAddBookMarks, ret, group);
+ IMAGE_ITEM(nav, showbookmarks, gtkShowBookMarks, ret, group);
+ ADD_SEP(nav, ret);
+ IMAGE_ITEM(nav, openlocation, gtkOpenLocation, ret, group);
+
+ ATTACH_PARENT(parent, gtkNavigate, ret->nav, group);
+
return ret;
}
@@ -357,7 +392,8 @@ static struct nsgtk_nav_menu *nsgtk_menu_nav_menu(GtkAccelGroup *group)
* \param group the 'global' in a gtk sense accelerator reference
*/
-static struct nsgtk_tabs_menu *nsgtk_menu_tabs_menu(GtkAccelGroup *group)
+static struct nsgtk_tabs_menu *nsgtk_menu_tabs_menu(GtkAccelGroup *group,
+ GtkMenuShell *parent)
{
struct nsgtk_tabs_menu *ret = malloc(sizeof(struct nsgtk_tabs_menu));
if (ret == NULL) {
@@ -370,9 +406,12 @@ static struct nsgtk_tabs_menu *nsgtk_menu_tabs_menu(GtkAccelGroup *group)
free(ret);
return NULL;
}
- IMAGE_ITEM(tabs, nexttab, gtkNextTab, ret, group)
- IMAGE_ITEM(tabs, prevtab, gtkPrevTab, ret, group)
- IMAGE_ITEM(tabs, closetab, gtkCloseTab, ret, group)
+ IMAGE_ITEM(tabs, nexttab, gtkNextTab, ret, group);
+ IMAGE_ITEM(tabs, prevtab, gtkPrevTab, ret, group);
+ IMAGE_ITEM(tabs, closetab, gtkCloseTab, ret, group);
+
+ ATTACH_PARENT(parent, gtkTabs, ret->tabs, group);
+
return ret;
}
@@ -381,9 +420,9 @@ static struct nsgtk_tabs_menu *nsgtk_menu_tabs_menu(GtkAccelGroup *group)
* \param group the 'global' in a gtk sense accelerator reference
*/
-static struct nsgtk_help_menu *nsgtk_menu_help_menu(GtkAccelGroup *group)
+static struct nsgtk_help_menu *nsgtk_menu_help_menu(GtkAccelGroup *group,
+ GtkMenuShell *parent)
{
- GtkWidget *w;
struct nsgtk_help_menu *ret = malloc(sizeof(struct nsgtk_help_menu));
if (ret == NULL) {
warn_user(messages_get("NoMemory"), 0);
@@ -395,53 +434,44 @@ static struct nsgtk_help_menu *nsgtk_menu_help_menu(GtkAccelGroup *group)
free(ret);
return NULL;
}
- IMAGE_ITEM(help, contents, gtkContents, ret, group)
- IMAGE_ITEM(help, guide, gtkGuide, ret, group)
- IMAGE_ITEM(help, info, gtkUserInformation, ret, group)
- ADD_SEP(help, ret)
- IMAGE_ITEM(help, about, gtkAbout, ret, group)
+ IMAGE_ITEM(help, contents, gtkContents, ret, group);
+ IMAGE_ITEM(help, guide, gtkGuide, ret, group);
+ IMAGE_ITEM(help, info, gtkUserInformation, ret, group);
+ ADD_SEP(help, ret);
+ IMAGE_ITEM(help, about, gtkAbout, ret, group);
+
+ ATTACH_PARENT(parent, gtkHelp, ret->help, group);
+
return ret;
}
+#define MENUBAR_MENU(p, q, r) \
+ p->q = nsgtk_menu_##q##_menu(group, GTK_MENU_SHELL(r)); \
+ p->rclick_##q = nsgtk_menu_##q##_menu(group, NULL)
struct nsgtk_menu *nsgtk_menu_create(GladeXML *xml, GtkWindow *window)
{
GtkAccelGroup *group;
- struct nsgtk_menu *g;
+ struct nsgtk_menu *nmenu;
+ GtkMenuBar *menubar;
- g = malloc(sizeof(struct nsgtk_menu));
- if (g == NULL) {
+ nmenu = malloc(sizeof(struct nsgtk_menu));
+ if (nmenu == NULL) {
warn_user(messages_get("NoMemory"), 0);
return NULL;
}
group = gtk_accel_group_new();
gtk_window_add_accel_group(window, group);
+ menubar = GTK_MENU_BAR(glade_xml_get_widget(xml, "menubar"));
-#define MAKE_MENUS(q)\
- g->q##_menu = nsgtk_menu_##q##_menu(group);\
- g->rclick_##q##_menu = nsgtk_menu_##q##_menu(group);\
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(\
- glade_xml_get_widget(xml, "menuitem_" #q)), \
- GTK_WIDGET(g->q##_menu->q##_menu));\
- gtk_menu_set_accel_group(g->q##_menu->q##_menu, group)
- MAKE_MENUS(file);
- MAKE_MENUS(edit);
- MAKE_MENUS(view);
- MAKE_MENUS(nav);
- MAKE_MENUS(tabs);
- MAKE_MENUS(help);
-#undef MAKE_MENUS
- g->edit_menu_item = GTK_MENU_ITEM(glade_xml_get_widget(xml, "menuitem_edit"));
- g->tabs_menu_item = GTK_MENU_ITEM(glade_xml_get_widget(xml, "menuitem_tabs"));
-
- return g;
-}
-
-
-#undef CHECK_ITEM
-#undef IMAGE_ITEM
-#undef SET_SUBMENU
-#undef ADD_SEP
+ MENUBAR_MENU(nmenu, file, menubar);
+ MENUBAR_MENU(nmenu, edit, menubar);
+ MENUBAR_MENU(nmenu, view, menubar);
+ MENUBAR_MENU(nmenu, nav, menubar);
+ MENUBAR_MENU(nmenu, tabs, menubar);
+ MENUBAR_MENU(nmenu, help, menubar);
+ return nmenu;
+}