]>
Dogcows Code - chaz/openbox/blob - fifo_menu.c
3443294e2ced983b66c85e424956c6a71056bfb2
10 #include "kernel/menu.h"
11 #include "kernel/event.h"
13 static char *PLUGIN_NAME
= "fifo_menu";
15 typedef struct Fifo_Menu_Data
{
17 char *buf
; /* buffer to hold partially read menu */
18 unsigned long buflen
; /* how many bytes are in the buffer */
19 int fd
; /* file descriptor to read menu from */
21 event_fd_handler
*handler
;
24 #define FIFO_MENU(m) ((ObMenu *)m)
25 #define FIFO_MENU_DATA(m) ((Fifo_Menu_Data *)((ObMenu *)m)->plugin_data)
28 void fifo_menu_clean_up(ObMenu
*m
) {
29 if (FIFO_MENU_DATA(m
)->buf
!= NULL
) {
30 g_free(FIFO_MENU_DATA(m
)->buf
);
31 FIFO_MENU_DATA(m
)->buf
= NULL
;
32 FIFO_MENU_DATA(m
)->buflen
= 0;
35 if (FIFO_MENU_DATA(m
)->fd
!= -1) {
36 close(FIFO_MENU_DATA(m
)->fd
);
37 FIFO_MENU_DATA(m
)->fd
= -1;
41 void plugin_setup_config() { }
44 void plugin_shutdown() { }
46 void fifo_menu_handler(int fd
, void *d
) {
49 unsigned long num_read
;
51 /* because gdb is dumb */
53 Fifo_Menu_Data
*d
= FIFO_MENU_DATA(menu
);
57 /* if the menu is shown this will go into busy loop :(
60 unsigned long num_realloc
;
61 /* if we have less than a quarter BUFSIZ left, allocate more */
62 num_realloc
= (BUFSIZ
- (FIFO_MENU_DATA(menu
)->buflen
% BUFSIZ
) <
66 tmpbuf
= g_try_realloc(FIFO_MENU_DATA(menu
)->buf
,
67 FIFO_MENU_DATA(menu
)->buflen
+ num_realloc
);
70 g_warning("Unable to allocate memory for read()");
74 FIFO_MENU_DATA(menu
)->buf
= tmpbuf
;
77 FIFO_MENU_DATA(menu
)->buf
+
78 FIFO_MENU_DATA(menu
)->buflen
,
81 if (num_read
== 0) { /* eof */
88 FIFO_MENU_DATA(menu
)->buf
[FIFO_MENU_DATA(menu
)->buflen
] = '\0';
90 doc
= xmlParseMemory(FIFO_MENU_DATA(menu
)->buf
,
91 FIFO_MENU_DATA(menu
)->buflen
);
93 node
= xmlDocGetRootElement(doc
);
96 !xmlStrcasecmp(node
->name
, (const xmlChar
*) "fifo_menu")) {
97 if ((node
= parse_find_node("item", node
->xmlChildrenNode
)))
98 parse_menu_full(doc
, node
, menu
, FALSE
);
101 fifo_menu_clean_up(menu
);
103 event_remove_fd(FIFO_MENU_DATA(menu
)->handler
->fd
);
105 if ((FIFO_MENU_DATA(menu
)->fd
=
106 open(FIFO_MENU_DATA(menu
)->fifo
,
107 O_NONBLOCK
| O_RDONLY
)) == -1) {
108 g_warning("Can't reopen FIFO");
109 fifo_menu_clean_up(menu
);
113 FIFO_MENU_DATA(menu
)->handler
->fd
= FIFO_MENU_DATA(menu
)->fd
;
115 event_add_fd_handler(FIFO_MENU_DATA(menu
)->handler
);
116 } else if (num_read
> 0) {
117 FIFO_MENU_DATA(menu
)->buflen
+= num_read
;
118 FIFO_MENU_DATA(menu
)->buf
[FIFO_MENU_DATA(menu
)->buflen
] = '\0';
123 void plugin_destroy (ObMenu
*m
)
125 fifo_menu_clean_up(m
);
126 if (FIFO_MENU_DATA(m
)->handler
!= NULL
) {
127 g_free(FIFO_MENU_DATA(m
)->handler
);
128 FIFO_MENU_DATA(m
)->handler
= NULL
;
131 if (FIFO_MENU_DATA(m
)->fifo
!= NULL
) {
132 g_free(FIFO_MENU_DATA(m
)->fifo
);
133 FIFO_MENU_DATA(m
)->fifo
= NULL
;
136 if (FIFO_MENU_DATA(m
)->buf
!= NULL
) {
137 g_free(FIFO_MENU_DATA(m
)->buf
);
138 FIFO_MENU_DATA(m
)->buf
= NULL
;
141 g_free(m
->plugin_data
);
146 void *plugin_create(PluginMenuCreateData
*data
)
153 char *label
= NULL
, *id
= NULL
;
154 char *attr_pid
= NULL
;
156 d
= g_new(Fifo_Menu_Data
, 1);
158 parse_attr_string("id", data
->node
, &id
);
159 parse_attr_string("label", data
->node
, &label
);
161 if (parse_attr_string("pid", data
->node
, &attr_pid
) &&
162 g_strcasecmp(attr_pid
, "true") == 0) {
167 m
= menu_new( (label
!= NULL
? label
: ""),
168 (id
!= NULL
? id
: PLUGIN_NAME
),
172 menu_add_entry(data
->parent
, menu_entry_new_submenu(
173 (label
!= NULL
? label
: ""),
183 m
->plugin
= PLUGIN_NAME
;
187 m
->plugin_data
= (void *)d
;
190 dir
= g_build_filename(g_get_home_dir(), ".openbox",
193 if (mkdir(dir
, S_IRWXU
| S_IRWXG
| S_IRWXO
) == -1 && errno
!= EEXIST
) {
194 /* technically, if ~/.openbox/fifo_menu exists and isn't a directory
195 this will fail, but we don't care because mkfifo will fail and warn
197 g_warning("Can't create %s: %s", dir
, strerror(errno
));
205 char *pid
= g_strdup_printf("%s.%d", m
->name
, getpid());
206 fifo
= g_build_filename(g_get_home_dir(), ".openbox",
211 fifo
= g_build_filename(g_get_home_dir(), ".openbox",
216 if (mkfifo(fifo
, S_IRUSR
| S_IWUSR
|
217 S_IRGRP
| S_IWGRP
| /* let umask do its thing */
218 S_IROTH
| S_IWOTH
) == -1 && errno
!= EEXIST
) {
219 g_warning("Can't create FIFO %s: %s", fifo
, strerror(errno
));
226 /* open in non-blocking mode so we don't wait for a process to open FIFO
228 if ((d
->fd
= open(fifo
, O_NONBLOCK
| O_RDONLY
)) == -1) {
229 g_warning("Can't open FIFO %s: %s", fifo
, strerror(errno
));
238 h
= g_new(event_fd_handler
, 1);
241 g_warning("Out of memory");
251 h
->handler
= fifo_menu_handler
;
254 event_add_fd_handler(h
);
This page took 0.048998 seconds and 3 git commands to generate.