[openbox] pipe-menu helper library?

John Russell drjimmy42 at yahoo.com
Mon Nov 10 18:19:49 EST 2003


*sniff* *sniff*  smells like perl to me ;-)

--- Mike <logan at dct.com> wrote:
> Heyas,
> 
> Today I decided to convert my pipe-menu apps to use
> xmlSaveFormatFileEnc(). Made sense to use this since
> all of them link against -lobparser (and libxml)
> anyway. This allows me to get rid of the
> ob3_string_to_xml_safe() function I had been using
> for so long, and have unsafe strings automatically
> converted by libxml.
> 
> My apps use the same functions to build up, then
> print out the xml menu... I'm not sure how many
> others are making openbox3 pipe-menu apps at the
> moment, but how about a simple helper library for
> this?
> 
> Here's what I've got right now...
> 
> /* -- openbox pipe-menu helper functions
> ------------------------------------ */
> 
> gboolean ob3_pipe_menu_start = FALSE;
> 
> xmlDocPtr ob3_pipe_menu_doc;
> xmlNodePtr ob3_pipe_menu_node;
> 
> /* initialize pipe-menu helpers, setup pipe-menu
> xmlDocPtr, xmlNodePtr */
> void ob3_pipe_menu_startup(void)
> {
>     g_return_if_fail(ob3_pipe_menu_start != TRUE);
> 
>     ob3_pipe_menu_start = TRUE;
>     ob3_pipe_menu_doc = xmlNewDoc("1.0");
>     ob3_pipe_menu_node =
> xmlNewDocNode(ob3_pipe_menu_doc, NULL,
>                                      
> "openbox_pipe_menu", NULL);
>     xmlDocSetRootElement(ob3_pipe_menu_doc,
> ob3_pipe_menu_node);
> }
> 
> /* print xml pipe-menu contents, free pipe-menu
> xmlDocPtr */
> void ob3_pipe_menu_shutdown(void)
> {
>     g_return_if_fail(ob3_pipe_menu_start != FALSE);
> 
>     if(ob3_pipe_menu_node->children != NULL)
>         xmlSaveFormatFileEnc("-", ob3_pipe_menu_doc,
> "UTF-8", 1);
> 
>     xmlFreeDoc(ob3_pipe_menu_doc);
> }
> 
> /* add pipe-menu separator item */
> void ob3_pipe_menu_separator_add(void)
> {
>     g_return_if_fail(ob3_pipe_menu_start != FALSE);
> 
>     xmlNewTextChild(ob3_pipe_menu_node, NULL,
> "separator", NULL);
> }
> 
> /* add pipe-menu item */
> void ob3_pipe_menu_item_add(const gchar *label,
> const gchar *action)
> {
>     xmlNodePtr n;
> 
>     g_return_if_fail(ob3_pipe_menu_start != FALSE);
> 
>     g_return_if_fail(label != NULL && label[0] !=
> '\0');
> 
>     n = xmlNewTextChild(ob3_pipe_menu_node, NULL,
> "item", NULL);
>     xmlSetProp(n, "label", label);
> 
>     if(action != NULL && action[0] != '\0') {
>         xmlNodePtr p = xmlNewTextChild(n, NULL,
> "action", NULL);
>         xmlSetProp(p, "name", "Execute");
> 
>         xmlNewTextChild(p, NULL, "execute", action);
>     }
> }
> 
> /* -- openbox pipe-menu helper functions
> ------------------------------------ */
> 
> I don't care much for the global variables, but I
> also wouldn't care to pass xmlDoc/NodePtr's to/fro
> throughout my apps. Anyway, it fits in alright with
> the other openbox libraries.
> 
> Some of this could be pretty logan-centric, but I
> don't think there's too many other things that could
> be added to a menu item. ob3_pipe_menu_item_add()
> and ob3_pipe_menu_separator_add() in their current
> form wouldn't be any good for menus inside menus.
> 
> /* -- small example
>
---------------------------------------------------------
> */
> 
> int main(void)
> {
>     ob3_pipe_menu_startup();
> 
>     ob3_pipe_menu_item_add("Label Here", "Execute
> Action Here");
>     ob3_pipe_menu_separator_add();
>     ob3_pipe_menu_item_add("Label With No Execute
> Action", NULL);
> 
>     ob3_pipe_menu_shutdown();
> 
>     exit(0);
> }
> 
> Would print:
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <openbox_pipe_menu>
>   <item label="Label Here">
>     <action name="Execute">
>       <execute>Execute Action Here</execute>
>     </action>
>   </item>
>   <separator/>
>   <item label="Label With No Execute Action"/>
> </openbox_pipe_menu>
> 
> /* -- small example
>
---------------------------------------------------------
> */
> 
> Thoughts or suggestions? Having a library such as
> this included in openbox would be very handy for me.
> Plus everyone who does pipe-menus in c would be able
> to use the same stuff. :)
> 
> Mike


=====
Always play as if no one is listening.



More information about the openbox mailing list