changeset 2272:2ce302c43f48

GTK4: Initial menu functionality... basic creation works... no callbacks.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Mon, 01 Feb 2021 10:05:42 +0000
parents 1c52cd5a817f
children 95796965bb01
files gtk4/dw.c
diffstat 1 files changed, 65 insertions(+), 57 deletions(-) [+]
line wrap: on
line diff
--- a/gtk4/dw.c	Mon Feb 01 04:07:22 2021 +0000
+++ b/gtk4/dw.c	Mon Feb 01 10:05:42 2021 +0000
@@ -2150,7 +2150,8 @@
  */
 HMENUI dw_menu_new(unsigned long id)
 {
-   HMENUI tmp = gtk_popover_menu_new_from_model_full(NULL, GTK_POPOVER_MENU_NESTED);
+   GMenu *menu = g_menu_new();
+   HMENUI tmp = gtk_popover_menu_new_from_model_full(G_MENU_MODEL(menu), GTK_POPOVER_MENU_NESTED);
 
    g_object_set_data(G_OBJECT(tmp), "_dw_id", GINT_TO_POINTER(id));
    return tmp;
@@ -2171,12 +2172,15 @@
    if(GTK_IS_WINDOW(location) &&
       (box = GTK_WIDGET(g_object_get_data(G_OBJECT(location), "_dw_grid"))))
    {
+      GMenu *menu = g_menu_new();
       /* If there is an existing menu bar, remove it */
       GtkWidget *oldmenu = GTK_WIDGET(g_object_get_data(G_OBJECT(location), "_dw_menubar"));
+      
       if(oldmenu && GTK_IS_WIDGET(oldmenu))
          gtk_grid_remove(GTK_GRID(box), tmp);
+         
       /* Create a new menu bar */
-      tmp = gtk_popover_menu_bar_new_from_model(NULL);
+      tmp = gtk_popover_menu_bar_new_from_model(G_MENU_MODEL(menu));
       gtk_widget_show(tmp);
       /* Save pointers to each other */
       g_object_set_data(G_OBJECT(location), "_dw_menubar", (gpointer)tmp);
@@ -2214,6 +2218,30 @@
    }
 }
 
+char _dw_removetilde(char *dest, const char *src)
+{
+   int z, cur=0;
+   char accel = '\0';
+
+   for(z=0;z<strlen(src);z++)
+   {
+      if(src[z] != '~')
+      {
+         dest[cur] = src[z];
+         cur++;
+      }
+      else
+      {
+         dest[cur] = '_';
+         accel = src[z+1];
+         cur++;
+      }
+   }
+   dest[cur] = 0;
+   return accel;
+}
+
+
 /*
  * Adds a menuitem or submenu to an existing menu.
  * Parameters:
@@ -2227,81 +2255,61 @@
  */
 HWND dw_menu_append_item(HMENUI menu, const char *title, unsigned long id, unsigned long flags, int end, int check, HMENUI submenu)
 {
-   GtkWidget *tmphandle = NULL;
-#if 0 /* TODO: Implement this with GMenuModel and GtkPopoverMenu */   
-   char accel, *tempbuf = malloc(strlen(title)+1);
+   GMenuItem *tmphandle = NULL;
+   GMenuModel *menumodel;
+   char accel, *temptitle = alloca(strlen(title)+1);
    int submenucount;
 
-   if (!menu)
-   {
-      free(tempbuf);
+   if(!menu)
       return NULL;
-   }
-
-   accel = _removetilde(tempbuf, title);
-
+
+   if(GTK_IS_POPOVER_MENU_BAR(menu))
+      menumodel = gtk_popover_menu_bar_get_menu_model(GTK_POPOVER_MENU_BAR(menu));
+   else
+      menumodel = gtk_popover_menu_get_menu_model(GTK_POPOVER_MENU(menu));
+   accel = _dw_removetilde(temptitle, title);
    submenucount = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menu), "_dw_submenucount"));
 
-   if (strlen(tempbuf) == 0)
-      tmphandle=gtk_menu_item_new();
+   if (strlen(temptitle) == 0)
+      tmphandle = g_menu_item_new_section(NULL, NULL);
    else
    {
       char numbuf[25] = {0};
 
-      if (check)
-      {
-         tmphandle = gtk_check_menu_item_new_with_label(tempbuf);
-         if (accel)
-            gtk_label_set_use_underline(GTK_LABEL(gtk_bin_get_child(GTK_BIN(tmphandle))), TRUE);
-         snprintf(numbuf, 24, "%lu", id);
-         g_object_set_data(G_OBJECT(menu), numbuf, (gpointer)tmphandle);
+      if(submenu)
+      {
+         char tempbuf[101] = {0};
+         GMenuModel *submenumodel;
+         
+         if(GTK_IS_POPOVER_MENU_BAR(submenu))
+            submenumodel = gtk_popover_menu_bar_get_menu_model(GTK_POPOVER_MENU_BAR(submenu));
+         else
+            submenumodel = gtk_popover_menu_get_menu_model(GTK_POPOVER_MENU(submenu));
+
+         snprintf(tempbuf, 100, "_dw_submenu%d", submenucount);
+         submenucount++;
+         tmphandle = g_menu_item_new_submenu(temptitle, submenumodel);
+         g_object_set_data(G_OBJECT(menu), tempbuf, (gpointer)submenu);
+         g_object_set_data(G_OBJECT(menu), "_dw_submenucount", GINT_TO_POINTER(submenucount));
       }
       else
       {
-         tmphandle=gtk_menu_item_new_with_label(tempbuf);
-         if (accel)
-         {
-            gtk_label_set_use_underline(GTK_LABEL(gtk_bin_get_child(GTK_BIN(tmphandle))), TRUE);
-         }
+         tmphandle=g_menu_item_new(temptitle, NULL);
          snprintf(numbuf, 24, "%lu", id);
          g_object_set_data(G_OBJECT(menu), numbuf, (gpointer)tmphandle);
       }
    }
 
-   gtk_widget_show(tmphandle);
-
-   if (submenu)
-   {
-      char tempbuf[101] = {0};
-
-      snprintf(tempbuf, 100, "_dw_submenu%d", submenucount);
-      submenucount++;
-      gtk_menu_item_set_submenu(GTK_MENU_ITEM(tmphandle), submenu);
-      g_object_set_data(G_OBJECT(menu), tempbuf, (gpointer)submenu);
-      g_object_set_data(G_OBJECT(menu), "_dw_submenucount", GINT_TO_POINTER(submenucount));
-   }
-
-   if (GTK_IS_MENU_BAR(menu))
-      gtk_menu_shell_append(GTK_MENU_SHELL(menu), tmphandle);
+   if(end)
+      g_menu_append_item(G_MENU(menumodel), tmphandle);
    else
-      gtk_menu_shell_append(GTK_MENU_SHELL(menu), tmphandle);
+      g_menu_prepend_item(G_MENU(menumodel), tmphandle);
 
    g_object_set_data(G_OBJECT(tmphandle), "_dw_id", GINT_TO_POINTER(id));
-   free(tempbuf);
-   /*
-    * Set flags
-    */
-   if ( check && (flags & DW_MIS_CHECKED) )
-   {
-      _dw_ignore_click = 1;
-      gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(tmphandle), 1);
-      _dw_ignore_click = 0;
-   }
-
-   if ( flags & DW_MIS_DISABLED )
-      gtk_widget_set_sensitive( tmphandle, FALSE );
-#endif
-   return tmphandle;
+   
+   /*if(flags & DW_MIS_DISABLED)
+      gtk_widget_set_sensitive(tmphandle, FALSE);*/
+   return (HWND)tmphandle;
 }
 
 GtkWidget *_find_submenu_id(GtkWidget *start, const char *name)