]> Dogcows Code - chaz/openbox/blobdiff - openbox/menu.c
Use GMainLoop instead of ObtMainLoop
[chaz/openbox] / openbox / menu.c
index 6dd6d072d797ccb59548e29eb43f8fc0ec754840..374aeec1fc59a7b951acaf8e7bfa5fb3709318d8 100644 (file)
@@ -58,13 +58,6 @@ static gunichar parse_shortcut(const gchar *label, gboolean allow_shortcut,
                                gchar **strippedlabel, guint *position,
                                gboolean *always_show);
 
-static void client_dest(ObClient *client, gpointer data)
-{
-    /* menus can be associated with a client, so close any that are since
-       we are disappearing now */
-    menu_frame_hide_all_client(client);
-}
-
 void menu_startup(gboolean reconfig)
 {
     gboolean loaded = FALSE;
@@ -114,16 +107,10 @@ void menu_startup(gboolean reconfig)
     }
 
     g_assert(menu_parse_state.parent == NULL);
-
-    if (!reconfig)
-        client_add_destroy_notify(client_dest, NULL);
 }
 
 void menu_shutdown(gboolean reconfig)
 {
-    if (!reconfig)
-        client_remove_destroy_notify(client_dest);
-
     obt_xml_instance_unref(menu_parse_inst);
     menu_parse_inst = NULL;
 
@@ -218,6 +205,7 @@ static gunichar parse_shortcut(const gchar *label, gboolean allow_shortcut,
         *strippedlabel = NULL;
     } else {
         gchar *i;
+        gboolean escape;
 
         *strippedlabel = g_strdup(label);
 
@@ -225,20 +213,33 @@ static gunichar parse_shortcut(const gchar *label, gboolean allow_shortcut,
            have to just use the first valid character
         */
 
-        i = strchr(*strippedlabel, '_');
+        /* allow __ to escape an underscore */
+        i = *strippedlabel;
+        do {
+            escape = FALSE;
+            i = strchr(i, '_');
+            if (i && *(i+1) == '_') {
+                gchar *j;
+
+                /* remove the escape '_' from the string */
+                for (j = i; *j != '\0'; ++j)
+                    *j = *(j+1);
+
+                ++i;
+                escape = TRUE;
+            }
+        } while (escape);
+
         if (allow_shortcut && i != NULL) {
             /* there is an underscore in the string */
 
             /* you have to use a printable ascii character for shortcuts
                don't allow space either, so you can have like "a _ b"
             */
-            if (VALID_SHORTCUT(*(i+1)) || *(i+1) == '_') {
-                /* Allow you to escape the first _ by putting __ */
-                if (*(i+1) != '_') {
-                    shortcut = g_unichar_tolower(g_utf8_get_char(i+1));
-                    *position = i - *strippedlabel;
-                    *always_show = TRUE;
-                }
+            if (VALID_SHORTCUT(*(i+1))) {
+                shortcut = g_unichar_tolower(g_utf8_get_char(i+1));
+                *position = i - *strippedlabel;
+                *always_show = TRUE;
 
                 /* remove the '_' from the string */
                 for (; *i != '\0'; ++i)
@@ -373,7 +374,7 @@ ObMenu* menu_new(const gchar *name, const gchar *title,
 {
     ObMenu *self;
 
-    self = g_new0(ObMenu, 1);
+    self = g_slice_new0(ObMenu);
     self->name = g_strdup(name);
     self->data = data;
 
@@ -392,7 +393,7 @@ ObMenu* menu_new(const gchar *name, const gchar *title,
 
        more_menu->more_menu will always be NULL, since there is only 1 for
        each menu. */
-    self->more_menu = g_new0(ObMenu, 1);
+    self->more_menu = g_slice_new0(ObMenu);
     self->more_menu->name = _("More...");
     self->more_menu->title = _("More...");
     self->more_menu->data = data;
@@ -422,9 +423,9 @@ static void menu_destroy_hash_value(ObMenu *self)
     g_free(self->name);
     g_free(self->title);
     g_free(self->execute);
-    g_free(self->more_menu);
+    g_slice_free(ObMenu, self->more_menu);
 
-    g_free(self);
+    g_slice_free(ObMenu, self);
 }
 
 void menu_free(ObMenu *menu)
@@ -485,10 +486,10 @@ void menu_show(gchar *name, gint x, gint y, gboolean mouse, ObClient *client)
             menu_can_hide = TRUE;
         else {
             menu_can_hide = FALSE;
-            obt_main_loop_timeout_add(ob_main_loop,
-                                      config_menu_hide_delay * 1000,
-                                      menu_hide_delay_func,
-                                      NULL, g_direct_equal, NULL);
+            g_timeout_add_full(G_PRIORITY_DEFAULT,
+                               config_menu_hide_delay,
+                               menu_hide_delay_func,
+                               NULL, NULL);
         }
     }
 }
@@ -504,7 +505,7 @@ static ObMenuEntry* menu_entry_new(ObMenu *menu, ObMenuEntryType type, gint id)
 
     g_assert(menu);
 
-    self = g_new0(ObMenuEntry, 1);
+    self = g_slice_new0(ObMenuEntry);
     self->ref = 1;
     self->type = type;
     self->menu = menu;
@@ -549,7 +550,7 @@ void menu_entry_unref(ObMenuEntry *self)
             break;
         }
 
-        g_free(self);
+        g_slice_free(ObMenuEntry, self);
     }
 }
 
@@ -653,6 +654,11 @@ void menu_set_execute_func(ObMenu *self, ObMenuExecuteFunc func)
     self->more_menu->execute_func = func; /* keep it in sync */
 }
 
+void menu_set_cleanup_func(ObMenu *self, ObMenuCleanupFunc func)
+{
+    self->cleanup_func = func;
+}
+
 void menu_set_destroy_func(ObMenu *self, ObMenuDestroyFunc func)
 {
     self->destroy_func = func;
This page took 0.024264 seconds and 4 git commands to generate.