comparison gtk4/dw.c @ 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
comparison
equal deleted inserted replaced
2271:1c52cd5a817f 2272:2ce302c43f48
2148 * id: An ID to be used for getting the resource from the 2148 * id: An ID to be used for getting the resource from the
2149 * resource file. 2149 * resource file.
2150 */ 2150 */
2151 HMENUI dw_menu_new(unsigned long id) 2151 HMENUI dw_menu_new(unsigned long id)
2152 { 2152 {
2153 HMENUI tmp = gtk_popover_menu_new_from_model_full(NULL, GTK_POPOVER_MENU_NESTED); 2153 GMenu *menu = g_menu_new();
2154 HMENUI tmp = gtk_popover_menu_new_from_model_full(G_MENU_MODEL(menu), GTK_POPOVER_MENU_NESTED);
2154 2155
2155 g_object_set_data(G_OBJECT(tmp), "_dw_id", GINT_TO_POINTER(id)); 2156 g_object_set_data(G_OBJECT(tmp), "_dw_id", GINT_TO_POINTER(id));
2156 return tmp; 2157 return tmp;
2157 } 2158 }
2158 2159
2169 GtkWidget *box; 2170 GtkWidget *box;
2170 2171
2171 if(GTK_IS_WINDOW(location) && 2172 if(GTK_IS_WINDOW(location) &&
2172 (box = GTK_WIDGET(g_object_get_data(G_OBJECT(location), "_dw_grid")))) 2173 (box = GTK_WIDGET(g_object_get_data(G_OBJECT(location), "_dw_grid"))))
2173 { 2174 {
2175 GMenu *menu = g_menu_new();
2174 /* If there is an existing menu bar, remove it */ 2176 /* If there is an existing menu bar, remove it */
2175 GtkWidget *oldmenu = GTK_WIDGET(g_object_get_data(G_OBJECT(location), "_dw_menubar")); 2177 GtkWidget *oldmenu = GTK_WIDGET(g_object_get_data(G_OBJECT(location), "_dw_menubar"));
2178
2176 if(oldmenu && GTK_IS_WIDGET(oldmenu)) 2179 if(oldmenu && GTK_IS_WIDGET(oldmenu))
2177 gtk_grid_remove(GTK_GRID(box), tmp); 2180 gtk_grid_remove(GTK_GRID(box), tmp);
2181
2178 /* Create a new menu bar */ 2182 /* Create a new menu bar */
2179 tmp = gtk_popover_menu_bar_new_from_model(NULL); 2183 tmp = gtk_popover_menu_bar_new_from_model(G_MENU_MODEL(menu));
2180 gtk_widget_show(tmp); 2184 gtk_widget_show(tmp);
2181 /* Save pointers to each other */ 2185 /* Save pointers to each other */
2182 g_object_set_data(G_OBJECT(location), "_dw_menubar", (gpointer)tmp); 2186 g_object_set_data(G_OBJECT(location), "_dw_menubar", (gpointer)tmp);
2183 g_object_set_data(G_OBJECT(tmp), "_dw_window", (gpointer)location); 2187 g_object_set_data(G_OBJECT(tmp), "_dw_window", (gpointer)location);
2184 gtk_grid_attach(GTK_GRID(box), tmp, 0, 0, 1, 1); 2188 gtk_grid_attach(GTK_GRID(box), tmp, 0, 0, 1, 1);
2211 g_object_unref(G_OBJECT(*menu)); 2215 g_object_unref(G_OBJECT(*menu));
2212 } 2216 }
2213 *menu = NULL; 2217 *menu = NULL;
2214 } 2218 }
2215 } 2219 }
2220
2221 char _dw_removetilde(char *dest, const char *src)
2222 {
2223 int z, cur=0;
2224 char accel = '\0';
2225
2226 for(z=0;z<strlen(src);z++)
2227 {
2228 if(src[z] != '~')
2229 {
2230 dest[cur] = src[z];
2231 cur++;
2232 }
2233 else
2234 {
2235 dest[cur] = '_';
2236 accel = src[z+1];
2237 cur++;
2238 }
2239 }
2240 dest[cur] = 0;
2241 return accel;
2242 }
2243
2216 2244
2217 /* 2245 /*
2218 * Adds a menuitem or submenu to an existing menu. 2246 * Adds a menuitem or submenu to an existing menu.
2219 * Parameters: 2247 * Parameters:
2220 * menu: The handle to the existing menu. 2248 * menu: The handle to the existing menu.
2225 * check: If TRUE menu is "check"able. 2253 * check: If TRUE menu is "check"able.
2226 * submenu: Handle to an existing menu to be a submenu or NULL. 2254 * submenu: Handle to an existing menu to be a submenu or NULL.
2227 */ 2255 */
2228 HWND dw_menu_append_item(HMENUI menu, const char *title, unsigned long id, unsigned long flags, int end, int check, HMENUI submenu) 2256 HWND dw_menu_append_item(HMENUI menu, const char *title, unsigned long id, unsigned long flags, int end, int check, HMENUI submenu)
2229 { 2257 {
2230 GtkWidget *tmphandle = NULL; 2258 GMenuItem *tmphandle = NULL;
2231 #if 0 /* TODO: Implement this with GMenuModel and GtkPopoverMenu */ 2259 GMenuModel *menumodel;
2232 char accel, *tempbuf = malloc(strlen(title)+1); 2260 char accel, *temptitle = alloca(strlen(title)+1);
2233 int submenucount; 2261 int submenucount;
2234 2262
2235 if (!menu) 2263 if(!menu)
2236 {
2237 free(tempbuf);
2238 return NULL; 2264 return NULL;
2239 } 2265
2240 2266 if(GTK_IS_POPOVER_MENU_BAR(menu))
2241 accel = _removetilde(tempbuf, title); 2267 menumodel = gtk_popover_menu_bar_get_menu_model(GTK_POPOVER_MENU_BAR(menu));
2242 2268 else
2269 menumodel = gtk_popover_menu_get_menu_model(GTK_POPOVER_MENU(menu));
2270 accel = _dw_removetilde(temptitle, title);
2243 submenucount = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menu), "_dw_submenucount")); 2271 submenucount = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menu), "_dw_submenucount"));
2244 2272
2245 if (strlen(tempbuf) == 0) 2273 if (strlen(temptitle) == 0)
2246 tmphandle=gtk_menu_item_new(); 2274 tmphandle = g_menu_item_new_section(NULL, NULL);
2247 else 2275 else
2248 { 2276 {
2249 char numbuf[25] = {0}; 2277 char numbuf[25] = {0};
2250 2278
2251 if (check) 2279 if(submenu)
2252 { 2280 {
2253 tmphandle = gtk_check_menu_item_new_with_label(tempbuf); 2281 char tempbuf[101] = {0};
2254 if (accel) 2282 GMenuModel *submenumodel;
2255 gtk_label_set_use_underline(GTK_LABEL(gtk_bin_get_child(GTK_BIN(tmphandle))), TRUE); 2283
2284 if(GTK_IS_POPOVER_MENU_BAR(submenu))
2285 submenumodel = gtk_popover_menu_bar_get_menu_model(GTK_POPOVER_MENU_BAR(submenu));
2286 else
2287 submenumodel = gtk_popover_menu_get_menu_model(GTK_POPOVER_MENU(submenu));
2288
2289 snprintf(tempbuf, 100, "_dw_submenu%d", submenucount);
2290 submenucount++;
2291 tmphandle = g_menu_item_new_submenu(temptitle, submenumodel);
2292 g_object_set_data(G_OBJECT(menu), tempbuf, (gpointer)submenu);
2293 g_object_set_data(G_OBJECT(menu), "_dw_submenucount", GINT_TO_POINTER(submenucount));
2294 }
2295 else
2296 {
2297 tmphandle=g_menu_item_new(temptitle, NULL);
2256 snprintf(numbuf, 24, "%lu", id); 2298 snprintf(numbuf, 24, "%lu", id);
2257 g_object_set_data(G_OBJECT(menu), numbuf, (gpointer)tmphandle); 2299 g_object_set_data(G_OBJECT(menu), numbuf, (gpointer)tmphandle);
2258 } 2300 }
2259 else 2301 }
2260 { 2302
2261 tmphandle=gtk_menu_item_new_with_label(tempbuf); 2303 if(end)
2262 if (accel) 2304 g_menu_append_item(G_MENU(menumodel), tmphandle);
2263 {
2264 gtk_label_set_use_underline(GTK_LABEL(gtk_bin_get_child(GTK_BIN(tmphandle))), TRUE);
2265 }
2266 snprintf(numbuf, 24, "%lu", id);
2267 g_object_set_data(G_OBJECT(menu), numbuf, (gpointer)tmphandle);
2268 }
2269 }
2270
2271 gtk_widget_show(tmphandle);
2272
2273 if (submenu)
2274 {
2275 char tempbuf[101] = {0};
2276
2277 snprintf(tempbuf, 100, "_dw_submenu%d", submenucount);
2278 submenucount++;
2279 gtk_menu_item_set_submenu(GTK_MENU_ITEM(tmphandle), submenu);
2280 g_object_set_data(G_OBJECT(menu), tempbuf, (gpointer)submenu);
2281 g_object_set_data(G_OBJECT(menu), "_dw_submenucount", GINT_TO_POINTER(submenucount));
2282 }
2283
2284 if (GTK_IS_MENU_BAR(menu))
2285 gtk_menu_shell_append(GTK_MENU_SHELL(menu), tmphandle);
2286 else 2305 else
2287 gtk_menu_shell_append(GTK_MENU_SHELL(menu), tmphandle); 2306 g_menu_prepend_item(G_MENU(menumodel), tmphandle);
2288 2307
2289 g_object_set_data(G_OBJECT(tmphandle), "_dw_id", GINT_TO_POINTER(id)); 2308 g_object_set_data(G_OBJECT(tmphandle), "_dw_id", GINT_TO_POINTER(id));
2290 free(tempbuf); 2309
2291 /* 2310 /*if(flags & DW_MIS_DISABLED)
2292 * Set flags 2311 gtk_widget_set_sensitive(tmphandle, FALSE);*/
2293 */ 2312 return (HWND)tmphandle;
2294 if ( check && (flags & DW_MIS_CHECKED) )
2295 {
2296 _dw_ignore_click = 1;
2297 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(tmphandle), 1);
2298 _dw_ignore_click = 0;
2299 }
2300
2301 if ( flags & DW_MIS_DISABLED )
2302 gtk_widget_set_sensitive( tmphandle, FALSE );
2303 #endif
2304 return tmphandle;
2305 } 2313 }
2306 2314
2307 GtkWidget *_find_submenu_id(GtkWidget *start, const char *name) 2315 GtkWidget *_find_submenu_id(GtkWidget *start, const char *name)
2308 { 2316 {
2309 GtkWidget *tmp; 2317 GtkWidget *tmp;