]> Dogcows Code - chaz/openbox/commitdiff
Timed menu that reads output from a process while the window is hidden
authorScott Moynes <smoynes@nexus.carleton.ca>
Sat, 10 May 2003 14:51:27 +0000 (14:51 +0000)
committerScott Moynes <smoynes@nexus.carleton.ca>
Sat, 10 May 2003 14:51:27 +0000 (14:51 +0000)
openbox/menu.c
openbox/menu.h
plugins/menu/timed_menu.c

index b271cf31e811220688f906fb4821a321de291471..74c234827ad945ffb0b28b979ac1a23a11b0e8b7 100644 (file)
@@ -90,11 +90,11 @@ void menu_startup()
 
     menu_add_entry(m, menu_entry_new_submenu("subz", s));
 
-    /*
     t = (Menu *)plugin_create("timed_menu");
     a = action_from_string("execute");
     a->data.execute.path = g_strdup("xeyes");
-    menu_add_entry(t, menu_entry_new("xeyes", a));*/
+    menu_add_entry(t, menu_entry_new("xeyes", a));
+    menu_add_entry(m, menu_entry_new_submenu("timed", t));
 
     s = menu_new("empty", "chub", m);
     menu_add_entry(m, menu_entry_new_submenu("empty", s));
@@ -293,6 +293,17 @@ void menu_hide(Menu *self) {
     }
 }
 
+void menu_clear(Menu *self) {
+    GList *it;
+  
+    for (it = self->entries; it; it = it->next) {
+       MenuEntry *entry = it->data;
+       menu_entry_free(entry);
+    }
+    self->entries = NULL;
+}
+
+
 MenuEntry *menu_find_entry(Menu *menu, Window win)
 {
     GList *it;
index 081b3528db0f65f78a30cf78d50d3a9e3e43afed..43ac054ff6d2cdc0b11ce10922c46c9b3755cfa7 100644 (file)
@@ -104,6 +104,8 @@ void menu_show_full(Menu *menu, int x, int y, Client *client);
 
 void menu_hide(Menu *self);
 
+void menu_clear(Menu *self);
+
 MenuEntry *menu_entry_new_full(char *label, Action *action,
                                MenuEntryRenderType render_type,
                                gpointer submenu);
index 2c2643474425f203abcea8aecb24a67e95f4aeb7..34d71e73c3ff19a192a4b20e53c7d6a29058f080 100644 (file)
@@ -1,8 +1,12 @@
+#include <glib.h>
+
 #include "kernel/menu.h"
 #include "kernel/timer.h"
 #include "timed_menu.h"
 #include "kernel/action.h"
 
+#define TIMED_MENU(m) ((Menu *)m)
+#define TIMED_MENU_DATA(m) ((Timed_Menu_Data *)((Menu *)m)->plugin_data)
 static char *PLUGIN_NAME = "timed_menu";
 
 typedef enum {
@@ -17,6 +21,7 @@ typedef enum {
 typedef struct {
     Timed_Menu_Type type;
     Timer *timer; /* timer code handles free */
+    char *command; /* for the PIPE */
 } Timed_Menu_Data;
 
 
@@ -28,24 +33,54 @@ void plugin_shutdown() { }
 void timed_menu_timeout_handler(void *data)
 {
     Action *a;
-    printf("woop timer %s\n", ((Menu *)data)->name);
     ((Menu *)data)->invalid = TRUE;
 
-    if (((Menu *)data)->shown) {
-       a = action_from_string("execute");
-       a->data.execute.path = g_strdup("xeyes");
-       menu_add_entry((Menu *)data, menu_entry_new("xeyes", a));
-
-       menu_show_full( (Menu *)data, ((Menu *)data)->location.x,
-                       ((Menu *)data)->location.y, NULL);
-    } else {
-       GList *it;
+    if (!TIMED_MENU(data)->shown) {
+        switch (TIMED_MENU_DATA(data)->type) {
+            case (TIMED_MENU_PIPE):
+            {
+                /* if the menu is not shown, run a process and use its output
+                   as menu */
+                char *args[] = {"/bin/sh", "-c", "ls", NULL};
+                GIOChannel *io;
+                char *line;
+                gint child, c_stdout, line_len, terminator_pos;
+                GIOStatus status;
+                /* this blocks for now, until the event stuff can handle it */
+                if (!g_spawn_async_with_pipes(NULL,
+                        args,
+                        NULL,
+                        G_SPAWN_DO_NOT_REAP_CHILD,
+                        NULL, NULL,
+                        &child, NULL, &c_stdout, NULL,
+                        NULL)) {
+                    g_warning("%s: Unable to run timed_menu program",
+                        __FUNCTION__);
+                    break;
+                }
+                
+                io = g_io_channel_unix_new(c_stdout);
+                if (io == NULL) {
+                    g_error("%s: Unable to get IO channel", __FUNCTION__);
+                    break;
+                }
 
-       for (it = ((Menu *)data)->entries; it; it = it->next) {
-           MenuEntry *entry = it->data;
-           menu_entry_free(entry);
-       }
-       ((Menu *)data)->entries = NULL;
+                menu_clear(TIMED_MENU(data));
+                
+                while ( G_IO_STATUS_NORMAL == (status =
+                            g_io_channel_read_line
+                            (io, &line, &line_len, &terminator_pos, NULL))
+                    ) {
+                    /* the \n looks ugly */
+                    line[terminator_pos] = '\0';
+                    menu_add_entry(TIMED_MENU(data),
+                        menu_entry_new_separator(line));
+                    g_message("%s", line);
+                    g_free(line);
+                }
+                break;
+            }
+        }
     }
 }
 
@@ -67,7 +102,7 @@ void *plugin_create()
 void plugin_destroy (void *m)
 {
     /* this will be freed by timer_* */
-    timer_stop( ((Timed_Menu_Data *)((Menu *)m)->plugin_data)->timer);
+    timer_stop( ((Timed_Menu_Data *)TIMED_MENU(m)->plugin_data)->timer);
     
-    g_free( ((Menu *)m)->plugin_data );
+    g_free( TIMED_MENU(m)->plugin_data );
 }
This page took 0.028718 seconds and 4 git commands to generate.