Mercurial > dwindows
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; |