From 2ff13238d9bb840eb984598d9f1863ecd77c9ed7 Mon Sep 17 00:00:00 2001 From: marschap Date: Tue, 5 Apr 2005 07:28:47 +0000 Subject: [PATCH] - implemented menuevents enter+leave - make menuscreen_goto() more permissive: any transition between one client's menu is allowed. If configure option --enable-permissive-menuscreen-goto is choosen any transition is allowed - #define for TESTMENUS now set via configure option --enable-testmenus (VB) --- server/menuscreens.c | 53 +++++++++++++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/server/menuscreens.c b/server/menuscreens.c index 96e7c41..9b4cf93 100644 --- a/server/menuscreens.c +++ b/server/menuscreens.c @@ -33,12 +33,13 @@ #include "driver.h" #include "drivers.h" +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + /* Next include files are needed for settings that we can modify */ #include "render.h" -/* uncomment this if you want a binary with test menus in it */ -#define TESTMENUS - char * menu_key; char * enter_key; char * up_key; @@ -189,8 +190,9 @@ void menuscreen_switch_item (MenuItem * new_menuitem) { MenuItem * old_menuitem = active_menuitem; - debug (RPT_DEBUG, "%s( item=[%s] )", __FUNCTION__, - ((new_menuitem != NULL) ? new_menuitem->id : "(null)")); + debug (RPT_DEBUG, "%s( item=[%s] ) from active_menuitem=[%s]", __FUNCTION__, + ((new_menuitem != NULL) ? new_menuitem->id : "(null)"), + ((old_menuitem != NULL) ? old_menuitem->id : "(null)")); /* First we do the switch */ active_menuitem = new_menuitem; @@ -214,6 +216,12 @@ void menuscreen_switch_item (MenuItem * new_menuitem) } menuitem_rebuild_screen (active_menuitem, menuscreen); } + + if (old_menuitem && old_menuitem->event_func) + old_menuitem->event_func(old_menuitem, MENUEVENT_LEAVE); + if (new_menuitem && new_menuitem->event_func) + new_menuitem->event_func(new_menuitem, MENUEVENT_ENTER); + return; } @@ -295,10 +303,10 @@ void menuscreen_create_menu () MenuItem * slider; Driver * driver; -#ifdef TESTMENUS +#ifdef LCDPROC_TESTMENUS MenuItem * test_item; Menu * test_menu; -#endif /*TESTMENUS*/ +#endif /*LCDPROC_TESTMENUS*/ debug (RPT_DEBUG, "%s()", __FUNCTION__); @@ -307,10 +315,10 @@ void menuscreen_create_menu () options_menu = menu_create ("options", NULL, "Options", NULL); menu_add_item (main_menu, options_menu); -#ifdef TESTMENUS +#ifdef LCDPROC_TESTMENUS screens_menu = menu_create ("screens", NULL, "Screens", NULL); menu_add_item (main_menu, screens_menu); -#endif /*TESTMENUS*/ +#endif /*LCDPROC_TESTMENUS*/ checkbox = menuitem_create_checkbox ("heartbeat", heartbeat_handler, "Heartbeat", true, heartbeat); menu_add_item (options_menu, checkbox); @@ -347,7 +355,7 @@ void menuscreen_create_menu () } } -#ifdef TESTMENUS +#ifdef LCDPROC_TESTMENUS test_menu = menu_create ("test", NULL, "Test menu", NULL); menu_add_item (main_menu, test_menu); @@ -385,7 +393,7 @@ void menuscreen_create_menu () menu_add_item (test_menu, test_item); test_item = menuitem_create_ip ("", NULL, "IPv6", 1, ":::ffff:ffff:ffff:ffff:ffff"); menu_add_item (test_menu, test_item); -#endif /*TESTMENUS*/ +#endif /*LCDPROC_TESTMENUS*/ } MenuEventFunc (heartbeat_handler) @@ -517,17 +525,32 @@ menuscreen_remove_screen (Screen * s) } } - +/** + * Transition is allowed if old and new menu are owned by the same + * clients. Returns -1 if transition is not allowed and 0 otherwise. + */ int menuscreen_goto (Menu * menu) { - if( !active_menuitem ) { - /* OK we can do it */ + debug (RPT_DEBUG, "%s( m=[%s] ): active_menuitem=[%s]", + __FUNCTION__, (menu != NULL) ? menu->id : "(NULL)", + (active_menuitem != NULL) ? active_menuitem->id : "(NULL)"); +# ifdef LCDPROC_PERMISSIVE_MENUSCREEN_GOTO + menuscreen_switch_item (menu); + return 0; +# else + if( !active_menuitem + || menuitem_get_client(active_menuitem) == menuitem_get_client(menu)) + { menuscreen_switch_item (menu); return 0; } else { - /* Sorry there is a menu already active. */ + report(RPT_WARNING, "menuscreen_goto([%s]) not allowed:" + " Another client's menu is active", + (menu != NULL) ? menu->id : "(NULL)"); return -1; } +# endif /* LCDPROC_PERMISSIVE_MENUSCREEN_GOTO */ + }