aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorStapleButter <thetotalworm@gmail.com>2018-10-26 20:56:59 +0200
committerStapleButter <thetotalworm@gmail.com>2018-10-26 20:56:59 +0200
commiteb67ac9a1be4f1cc80825b4017e59cdfd47700cc (patch)
treeed4415eb594b2e972a949f0f002859b261e92105 /src
parentcbe63f8fd5285022ad3917a675b08b49ee20853c (diff)
finally come up with a (crummy) solution for those fucking shitty submenus
Diffstat (limited to 'src')
-rw-r--r--src/libui_sdl/libui/unix/menu.c94
1 files changed, 79 insertions, 15 deletions
diff --git a/src/libui_sdl/libui/unix/menu.c b/src/libui_sdl/libui/unix/menu.c
index 07cd7b3..b7546ab 100644
--- a/src/libui_sdl/libui/unix/menu.c
+++ b/src/libui_sdl/libui/unix/menu.c
@@ -30,6 +30,8 @@ struct uiMenuItem {
struct menuItemWindow {
uiWindow *w;
gulong signal;
+
+ GtkWidget* submenu;
};
enum {
@@ -94,27 +96,54 @@ static void menuItemEnableDisable(uiMenuItem *item, gboolean enabled)
{
GHashTableIter iter;
gpointer widget;
-
- item->disabled = !enabled;
- g_hash_table_iter_init(&iter, item->windows);
- while (g_hash_table_iter_next(&iter, &widget, NULL))
- gtk_widget_set_sensitive(GTK_WIDGET(widget), enabled);
-
+
// extra crummy code for disabling submenus
// TODO: find a better way to do it!!!!!!!!!!!!!!!!!!!!!!!!!!
// noting that:
// * set_sensitive on the menu item does nothing (herpderp)
// * set_sensitive on the submenu disables all the submenu items at once (but then you can't fucking enable them back!!)
+ // * removing the submenu from the menu item causes it to be destroyed
// * googling gives no results, guess nobody has ever wanted to do this shit or...??????
// * under Windows we can just disable the menu item and call it good! works exactly as intended!
// * fucking stupid pile of shit
+ // so until we come up with a better solution, we're just going to do thie following shito
+ // * remove submenu
+ // * disable menu item
+
+ item->disabled = !enabled;
+ g_hash_table_iter_init(&iter, item->windows);
- /*if (item->popupchild != NULL)
+ if (item->popupchild != NULL)
{
- g_hash_table_iter_init(&iter, item->windows);
- while (g_hash_table_iter_next(&iter, &widget, NULL))
- gtk_widget_set_sensitive(GTK_WIDGET(gtk_menu_item_get_submenu(widget)), enabled);
- }*/
+ gpointer ww;
+ struct menuItemWindow *w;
+
+ if (enabled)
+ {
+ while (g_hash_table_iter_next(&iter, &widget, &ww))
+ {
+ w = (struct menuItemWindow*)ww;
+ gtk_widget_set_sensitive(GTK_WIDGET(widget), TRUE);
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(widget), w->submenu);
+ g_object_unref(G_OBJECT(w->submenu));
+ }
+ }
+ else
+ {
+ while (g_hash_table_iter_next(&iter, &widget, &ww))
+ {
+ w = (struct menuItemWindow*)ww;
+ g_object_ref(G_OBJECT(w->submenu));
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(widget), NULL);
+ gtk_widget_set_sensitive(GTK_WIDGET(widget), FALSE);
+ }
+ }
+
+ return;
+ }
+
+ while (g_hash_table_iter_next(&iter, &widget, NULL))
+ gtk_widget_set_sensitive(GTK_WIDGET(widget), enabled);
}
void uiMenuItemEnable(uiMenuItem *item)
@@ -321,13 +350,15 @@ static void appendMenuItem(GtkMenuShell *submenu, uiMenuItem *item, uiWindow *w)
{
int j;
uiMenu* m;
- GtkWidget *submenu;
+ GtkWidget *c_submenu;
m = item->popupchild;
- submenu = gtk_menu_new();
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu);
+ c_submenu = gtk_menu_new();
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), c_submenu);
for (j = 0; j < m->items->len; j++)
- appendMenuItem(GTK_MENU_SHELL(submenu), g_array_index(m->items, uiMenuItem *, j), w);
+ appendMenuItem(GTK_MENU_SHELL(c_submenu), g_array_index(m->items, uiMenuItem *, j), w);
+
+ ww->submenu = c_submenu;
}
}
@@ -403,10 +434,43 @@ static void freeMenu(GtkWidget *widget, gpointer data)
//(*i)++;
}
+static void cleanupMenus()
+{
+ // bit of a hack
+ // take care of disabled submenus
+
+ uiMenu *m;
+ guint i;
+ uiMenuItem *item;
+ guint j;
+
+ if (menus == NULL)
+ return;
+ for (i = 0; i < menus->len; i++)
+ {
+ m = g_array_index(menus, uiMenu *, i);
+
+ for (j = 0; j < m->items->len; j++)
+ {
+ item = g_array_index(m->items, uiMenuItem *, j);
+
+ if (item->popupchild != NULL && item->disabled)
+ {
+ // re-enable this menu item
+ // connecting its submenu back to it
+ // so that GTK cleanup doesn't shit itself
+ menuItemEnableDisable(item, TRUE);
+ }
+ }
+ }
+}
+
void freeMenubar(GtkWidget *mb)
{
guint i;
+ cleanupMenus();
+
i = 0;
gtk_container_foreach(GTK_CONTAINER(mb), freeMenu, &i);
// no need to worry about destroying any widgets; destruction of the window they're in will do it for us