- 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)
This commit is contained in:
marschap
2005-04-05 07:28:47 +00:00
parent 28f812bef8
commit 2ff13238d9
+38 -15
View File
@@ -33,12 +33,13 @@
#include "driver.h" #include "driver.h"
#include "drivers.h" #include "drivers.h"
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
/* Next include files are needed for settings that we can modify */ /* Next include files are needed for settings that we can modify */
#include "render.h" #include "render.h"
/* uncomment this if you want a binary with test menus in it */
#define TESTMENUS
char * menu_key; char * menu_key;
char * enter_key; char * enter_key;
char * up_key; char * up_key;
@@ -189,8 +190,9 @@ void menuscreen_switch_item (MenuItem * new_menuitem)
{ {
MenuItem * old_menuitem = active_menuitem; MenuItem * old_menuitem = active_menuitem;
debug (RPT_DEBUG, "%s( item=[%s] )", __FUNCTION__, debug (RPT_DEBUG, "%s( item=[%s] ) from active_menuitem=[%s]", __FUNCTION__,
((new_menuitem != NULL) ? new_menuitem->id : "(null)")); ((new_menuitem != NULL) ? new_menuitem->id : "(null)"),
((old_menuitem != NULL) ? old_menuitem->id : "(null)"));
/* First we do the switch */ /* First we do the switch */
active_menuitem = new_menuitem; active_menuitem = new_menuitem;
@@ -214,6 +216,12 @@ void menuscreen_switch_item (MenuItem * new_menuitem)
} }
menuitem_rebuild_screen (active_menuitem, menuscreen); 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; return;
} }
@@ -295,10 +303,10 @@ void menuscreen_create_menu ()
MenuItem * slider; MenuItem * slider;
Driver * driver; Driver * driver;
#ifdef TESTMENUS #ifdef LCDPROC_TESTMENUS
MenuItem * test_item; MenuItem * test_item;
Menu * test_menu; Menu * test_menu;
#endif /*TESTMENUS*/ #endif /*LCDPROC_TESTMENUS*/
debug (RPT_DEBUG, "%s()", __FUNCTION__); debug (RPT_DEBUG, "%s()", __FUNCTION__);
@@ -307,10 +315,10 @@ void menuscreen_create_menu ()
options_menu = menu_create ("options", NULL, "Options", NULL); options_menu = menu_create ("options", NULL, "Options", NULL);
menu_add_item (main_menu, options_menu); menu_add_item (main_menu, options_menu);
#ifdef TESTMENUS #ifdef LCDPROC_TESTMENUS
screens_menu = menu_create ("screens", NULL, "Screens", NULL); screens_menu = menu_create ("screens", NULL, "Screens", NULL);
menu_add_item (main_menu, screens_menu); menu_add_item (main_menu, screens_menu);
#endif /*TESTMENUS*/ #endif /*LCDPROC_TESTMENUS*/
checkbox = menuitem_create_checkbox ("heartbeat", heartbeat_handler, "Heartbeat", true, heartbeat); checkbox = menuitem_create_checkbox ("heartbeat", heartbeat_handler, "Heartbeat", true, heartbeat);
menu_add_item (options_menu, checkbox); 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); test_menu = menu_create ("test", NULL, "Test menu", NULL);
menu_add_item (main_menu, test_menu); menu_add_item (main_menu, test_menu);
@@ -385,7 +393,7 @@ void menuscreen_create_menu ()
menu_add_item (test_menu, test_item); menu_add_item (test_menu, test_item);
test_item = menuitem_create_ip ("", NULL, "IPv6", 1, ":::ffff:ffff:ffff:ffff:ffff"); test_item = menuitem_create_ip ("", NULL, "IPv6", 1, ":::ffff:ffff:ffff:ffff:ffff");
menu_add_item (test_menu, test_item); menu_add_item (test_menu, test_item);
#endif /*TESTMENUS*/ #endif /*LCDPROC_TESTMENUS*/
} }
MenuEventFunc (heartbeat_handler) 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 int
menuscreen_goto (Menu * menu) menuscreen_goto (Menu * menu)
{ {
if( !active_menuitem ) { debug (RPT_DEBUG, "%s( m=[%s] ): active_menuitem=[%s]",
/* OK we can do it */ __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); menuscreen_switch_item (menu);
return 0; return 0;
} }
else { 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; return -1;
} }
# endif /* LCDPROC_PERMISSIVE_MENUSCREEN_GOTO */
} }