- 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:
+38
-15
@@ -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 */
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user