[Lcdproc] How can a client force the menu system to exit?

Joćo Ramos joao.ramos@inov.pt
Fri Mar 23 16:02:02 2007


The patch definitely works, but if you plan to make a safe return to the 
lcdproc screen rotation scheme, forget it. The use of 
'menuscreen_goto(NULL)' returns LCD back to the normal state, but 
doesn't perform no longer the screen rotation.

Use 'menuscreen_switch_item(NULL)' instead to quit the menu, which is 
actually the method used by lcdproc to handle when a user quits the menu 
normally.

Marcus Priesch escreveu:
> On Wed, 2007-03-21 at 18:07 +0100, Robert Buchholz wrote:
>   
>>> i have a patch here for lcdproc 0.5.0 ;)
>>>       
>> Patches go to the list always. That's what it is for :-)
>>     
>
> ok, so heeere you are ;)
>
> i just found out that it actually adds "menusystem_quit" and
> "menusystem_enter" commands to exit the menu system and enter it at any
> point. we need the possibility to tell the user of some important events
> when he/she is navigating the menu ... after acting on the event, the
> menu should be resumed at the point where the event "left" it ...
>
> i must admit that i am not the author of the patch, but he is not
> subscribed to the list ... if there are any questions, please ask me, i
> will forward them for you ! - also the patch is a bit more than it
> actually needs ... so please dont blame me on that ;) - this is another
> reason why we haven't submitted it yet!
>
> have fun & a big thank for LCDproc,
> mexx.
>
>   
> ------------------------------------------------------------------------
>
> diff -ur LCDproc_orig/server/commands/command_list.c LCDproc_work/server/commands/command_list.c
> --- LCDproc_orig/server/commands/command_list.c	2005-06-28 18:00:07.000000000 +0200
> +++ LCDproc_work/server/commands/command_list.c	2007-02-19 12:31:33.000000000 +0100
> @@ -28,31 +28,33 @@
>  #include <string.h>
>  
>  static client_function commands[] = {
> -	{ "test_func",      test_func_func      },
> -	{ "hello",          hello_func          },
> -	{ "client_set",     client_set_func     },
> -	{ "client_add_key", client_add_key_func },
> -	{ "client_del_key", client_del_key_func },
> -/*	{ "screen_add_key", screen_add_key_func }, */
> -/*	{ "screen_del_key", screen_del_key_func }, */
> -	{ "screen_add",     screen_add_func     },
> -	{ "screen_del",     screen_del_func     },
> -	{ "screen_set",     screen_set_func     },
> -	{ "widget_add",     widget_add_func     },
> -	{ "widget_del",     widget_del_func     },
> -	{ "widget_set",     widget_set_func     },
> -	{ "menu_add_item",  menu_add_item_func  },
> -	{ "menu_del_item",  menu_del_item_func  },
> -	{ "menu_set_item",  menu_set_item_func  },
> -	{ "menu_goto",      menu_goto_func      },
> -	{ "menu_set_main",  menu_set_main_func  },
> +	{ "test_func",        test_func_func      },
> +	{ "hello",            hello_func          },
> +	{ "client_set",       client_set_func     },
> +	{ "client_add_key",   client_add_key_func },
> +	{ "client_del_key",   client_del_key_func },
> +/*	{ "screen_add_key",   screen_add_key_func }, */
> +/*	{ "screen_del_key",   screen_del_key_func }, */
> +	{ "screen_add",       screen_add_func     },
> +	{ "screen_del",       screen_del_func     },
> +	{ "screen_set",       screen_set_func     },
> +	{ "widget_add",       widget_add_func     },
> +	{ "widget_del",       widget_del_func     },
> +	{ "widget_set",       widget_set_func     },
> +	{ "menu_add_item",    menu_add_item_func  },
> +	{ "menu_del_item",    menu_del_item_func  },
> +	{ "menu_set_item",    menu_set_item_func  },
> +	{ "menu_goto",        menu_goto_func      },
> +	{ "menu_set_main",    menu_set_main_func  },
> +	{ "menusystem_quit",  menusystem_quit     },
> +	{ "menusystem_enter", menusystem_enter    },
>  	/* Misc stuff...*/
> -	{ "backlight",      backlight_func      },
> -	{ "output",         output_func         },
> -	{ "noop",           noop_func           },
> -	{ "info",           info_func           },
> -	{ "sleep",          sleep_func          },
> -	{ NULL,             NULL},
> +	{ "backlight",        backlight_func      },
> +	{ "output",           output_func         },
> +	{ "noop",             noop_func           },
> +	{ "info",             info_func           },
> +	{ "sleep",            sleep_func          },
> +	{ NULL,               NULL},
>  };
>  
>  
> diff -ur LCDproc_orig/server/commands/menu_commands.c LCDproc_work/server/commands/menu_commands.c
> --- LCDproc_orig/server/commands/menu_commands.c	2005-07-22 19:47:29.000000000 +0200
> +++ LCDproc_work/server/commands/menu_commands.c	2007-02-19 12:33:22.000000000 +0100
> @@ -754,7 +754,48 @@
>  	sock_send_string(c->sock, "success\n");
>  	return 0;
>  }
> +int 
> +menusystem_quit(Client * c, int argc, char **argv)
> +{
> +	menuscreen_goto(NULL);
> +	sock_send_string(c->sock, "success\n");
> +	return 0;
> +}
> +int 
> +menusystem_enter(Client * c, int argc, char **argv)
> +{
> +	char * menu_id;
> +	Menu * menu;
> +
> +	debug (RPT_DEBUG, "%s( Client [%d], %s, %s )",
> +	       __FUNCTION__, c->sock, (argc > 1 ? argv[1] : "<null>"));
> +	if (!c->ack)
> +		return 1;
> +
> +	if ((argc < 1 )) {
> +		sock_send_error(c->sock, "Usage: menusystem_enter <menuid> [<predecessor_id>]\n");
> +		return 0;
> +	}
>  
> +	menu_id = argv[1];
> +
> +	if ( menu_id[0] == 0 ) {
> +		/* No menu specified = client's main menu */
> +		menu = c->menu;
> +	} else {
> +		/* A specified menu */
> +		menu = menuitem_search(menu_id, c);
> +	}
> +
> +	if (!menu) {
> +		sock_send_error(c->sock, "Cannot find menu id\n");
> +		return 0;
> +	}
> +	menuscreen_goto (menu);
> +	/* Failure is not returned (Robijn) */
> +	sock_send_string(c->sock, "success\n");
> +	return 0;
> +}
>  /** Sets the predecessor of a Menuitem item to itemid (for wizzards)
>   * i.e. the menuitem to go to after hitting "Enter" on item.
>   *
> Nur in LCDproc_work/server/commands: menu_commands.c~.
> diff -ur LCDproc_orig/server/commands/menu_commands.h LCDproc_work/server/commands/menu_commands.h
> --- LCDproc_orig/server/commands/menu_commands.h	2005-05-20 11:43:22.000000000 +0200
> +++ LCDproc_work/server/commands/menu_commands.h	2007-02-19 12:31:33.000000000 +0100
> @@ -18,6 +18,8 @@
>  int menu_set_item_func (Client * c, int argc, char **argv);
>  int menu_goto_func (Client * c, int argc, char **argv);
>  int menu_set_main_func (Client * c, int argc, char **argv);
> +int menusystem_quit(Client * c, int argc, char **argv);
> +int menusystem_enter(Client * c, int argc, char **argv);
>  
>  #endif
>  
>