From: Paul F. <pg...@us...> - 2006-11-14 22:10:12
|
Update of /cvsroot/roadmap/roadmap/src In directory sc8-pr-cvs9.sourceforge.net:/tmp/cvs-serv25658/src Modified Files: roadmap_factory.c Log Message: popup menus can now be bound to toolbar buttons, and it's now possible to suppress the builtin menubar by supplying an empty roadmap.menus file. Index: roadmap_factory.c =================================================================== RCS file: /cvsroot/roadmap/roadmap/src/roadmap_factory.c,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** roadmap_factory.c 13 Nov 2006 22:22:45 -0000 1.25 --- roadmap_factory.c 14 Nov 2006 22:10:07 -0000 1.26 *************** *** 59,70 **** RoadMapCallback action; ! const char *title; } RoadMapFactoryMenuPopup; - /* note relationship to number of action functions declared below */ - #define MAX_MENUPOPUPS 20 - int RoadMapFactoryMenuPopupCount; - void roadmap_factory_menu_popup_n(int n); --- 59,66 ---- RoadMapCallback action; ! char *title; } RoadMapFactoryMenuPopup; void roadmap_factory_menu_popup_n(int n); *************** *** 89,94 **** void roadmap_factory_menu_popup_18(void) { roadmap_factory_menu_popup_n(18); }; void roadmap_factory_menu_popup_19(void) { roadmap_factory_menu_popup_n(19); }; ! RoadMapFactoryMenuPopup RoadMapFactoryMenuPopups[MAX_MENUPOPUPS] = { { roadmap_factory_menu_popup_00, NULL }, { roadmap_factory_menu_popup_01, NULL }, --- 85,100 ---- void roadmap_factory_menu_popup_18(void) { roadmap_factory_menu_popup_n(18); }; void roadmap_factory_menu_popup_19(void) { roadmap_factory_menu_popup_n(19); }; + void roadmap_factory_menu_popup_20(void) { roadmap_factory_menu_popup_n(20); }; + void roadmap_factory_menu_popup_21(void) { roadmap_factory_menu_popup_n(21); }; + void roadmap_factory_menu_popup_22(void) { roadmap_factory_menu_popup_n(22); }; + void roadmap_factory_menu_popup_23(void) { roadmap_factory_menu_popup_n(23); }; + void roadmap_factory_menu_popup_24(void) { roadmap_factory_menu_popup_n(24); }; + void roadmap_factory_menu_popup_25(void) { roadmap_factory_menu_popup_n(25); }; + void roadmap_factory_menu_popup_26(void) { roadmap_factory_menu_popup_n(26); }; + void roadmap_factory_menu_popup_27(void) { roadmap_factory_menu_popup_n(27); }; + void roadmap_factory_menu_popup_28(void) { roadmap_factory_menu_popup_n(28); }; + void roadmap_factory_menu_popup_29(void) { roadmap_factory_menu_popup_n(29); }; ! RoadMapFactoryMenuPopup RoadMapFactoryMenuPopups[] = { { roadmap_factory_menu_popup_00, NULL }, { roadmap_factory_menu_popup_01, NULL }, *************** *** 111,116 **** --- 117,138 ---- { roadmap_factory_menu_popup_18, NULL }, { roadmap_factory_menu_popup_19, NULL }, + { roadmap_factory_menu_popup_20, NULL }, + { roadmap_factory_menu_popup_21, NULL }, + { roadmap_factory_menu_popup_22, NULL }, + { roadmap_factory_menu_popup_23, NULL }, + { roadmap_factory_menu_popup_24, NULL }, + { roadmap_factory_menu_popup_25, NULL }, + { roadmap_factory_menu_popup_26, NULL }, + { roadmap_factory_menu_popup_27, NULL }, + { roadmap_factory_menu_popup_28, NULL }, + { roadmap_factory_menu_popup_29, NULL }, }; + #define MAX_MENUPOPUPS \ + ( sizeof(RoadMapFactoryMenuPopups) / sizeof(*RoadMapFactoryMenuPopups) ) + + int RoadMapFactoryMenuPopupCount; + + void roadmap_factory_menu_popup_n(int n) { *************** *** 233,239 **** buffer[sizeof(buffer)-1] = 0; ! /* remove the end-of-line character. */ ! p = strchr (buffer, '\n'); ! if (p != NULL) *p = 0; /* Remove any leading space. */ --- 255,262 ---- buffer[sizeof(buffer)-1] = 0; ! /* remove the end-of-line character, and trailing whitespace */ ! p = buffer + strlen(buffer); ! while (p-- > buffer && isspace(*p)) ! *p = '\0'; /* Remove any leading space. */ *************** *** 269,273 **** fclose(file); ! if (count <= 0) return NULL; loaded[count] = NULL; --- 292,298 ---- fclose(file); ! /* okay to return with count == 0 -- this allows user to override ! * builtin configs with empty files ! */ loaded[count] = NULL; *************** *** 340,346 **** buffer[sizeof(buffer)-1] = 0; ! /* remove the end-of-line character. */ ! p = strchr (buffer, '\n'); ! if (p != NULL) *p = 0; /* Remove any leading space. */ --- 365,372 ---- buffer[sizeof(buffer)-1] = 0; ! /* remove the end-of-line character, and trailing whitespace */ ! p = buffer + strlen(buffer); ! while (p-- > buffer && isspace(*p)) ! *p = '\0'; /* Remove any leading space. */ *************** *** 448,458 **** } void roadmap_factory_config_menu ! (const char **item, RoadMapAction *actions, int doing_popups) { RoadMapMenu gui_menu = NULL; ! int menuprefix = strlen(ROADMAP_MENU); ! int submenuprefix = strlen(ROADMAP_SUBMENU); ! int invokemenuprefix = strlen(ROADMAP_INVOKE_SUBMENU); const char *title; --- 474,533 ---- } + static RoadMapAction * roadmap_factory_menu_dummy_action + (const char *title) { + int i; + static char tip[128]; + static RoadMapAction this_action; + + /* See if we've already allocated an action routine for + * this popup. + */ + for (i = 0; i < RoadMapFactoryMenuPopupCount; i++) { + if ( strcmp (RoadMapFactoryMenuPopups[i].title, title) == 0 ) + break; + } + + if (i == MAX_MENUPOPUPS) { /* Not found, and no room for more */ + + roadmap_log (ROADMAP_ERROR, + "No more room for menu '%s' (%d submenus max)", + title, MAX_MENUPOPUPS ); + return NULL; + + } + + if (i == RoadMapFactoryMenuPopupCount) { + RoadMapFactoryMenuPopups + [RoadMapFactoryMenuPopupCount++].title = strdup(title); + } + + snprintf(tip, sizeof(tip), + "Submenu for %s", RoadMapFactoryMenuPopups[i].title); + + this_action.label_long = RoadMapFactoryMenuPopups[i].title; + this_action.tip = (const char *)tip; + this_action.callback = RoadMapFactoryMenuPopups[i].action; + + return &this_action; + } + + static RoadMapAction *roadmap_factory_find_action_or_menu + (RoadMapAction *actions, const char *item) { + + if (strncmp (item, ROADMAP_INVOKE_SUBMENU, + sizeof(ROADMAP_INVOKE_SUBMENU)-1) == 0) { + return roadmap_factory_menu_dummy_action + (item + sizeof(ROADMAP_INVOKE_SUBMENU)-1); + } + + return roadmap_factory_find_action (actions, item); + } + void roadmap_factory_config_menu ! (const char **item, RoadMapAction *actions, int doing_menus) { RoadMapMenu gui_menu = NULL; ! int menuprefix = sizeof(ROADMAP_MENU)-1; ! int submenuprefix = sizeof(ROADMAP_SUBMENU)-1; const char *title; *************** *** 461,484 **** if (strncmp (*item, ROADMAP_MENU, menuprefix) == 0) { ! int is_popup = 0; - /* If processing a popups file, either menu prefix token - * gives a popup. In a menu file, the difference in - * tokens is significant - */ if (strncmp (*item, ROADMAP_SUBMENU, submenuprefix) == 0) { title = *item + submenuprefix; - is_popup = 1; } else { title = *item + menuprefix; } gui_menu = roadmap_main_new_menu (title); ! if (is_popup || doing_popups) { ! roadmap_factory_add_popup (gui_menu, title); ! } else { ! roadmap_main_add_menu (gui_menu, title); ! } --- 536,556 ---- if (strncmp (*item, ROADMAP_MENU, menuprefix) == 0) { ! int is_menu = 0; if (strncmp (*item, ROADMAP_SUBMENU, submenuprefix) == 0) { title = *item + submenuprefix; } else { title = *item + menuprefix; + is_menu = 1; } gui_menu = roadmap_main_new_menu (title); ! /* all menus are available as popups */ ! roadmap_factory_add_popup (gui_menu, title); ! ! /* but only non-popups go into the menubar */ ! if (doing_menus && is_menu) ! roadmap_main_add_menu (gui_menu, title); *************** *** 487,528 **** continue; - } else if (strncmp (*item, ROADMAP_INVOKE_SUBMENU, invokemenuprefix) == 0) { - - int i; - char tip[128]; - - title = *item + invokemenuprefix; - - /* See if we've already allocated an action routine for - * this popup. - */ - for (i = 0; i < RoadMapFactoryMenuPopupCount; i++) { - if ( strcmp (RoadMapFactoryMenuPopups[i].title, title) == 0 ) - break; - } - - if (i == MAX_MENUPOPUPS) { /* Not found, and no room for more */ - - roadmap_log (ROADMAP_ERROR, - "No more room for menu '%s' (%d submenus max)", - title, MAX_MENUPOPUPS ); - continue; - - } - - if (i == RoadMapFactoryMenuPopupCount) { - RoadMapFactoryMenuPopups - [RoadMapFactoryMenuPopupCount++].title = strdup(title); - } - - snprintf(tip, sizeof(tip), - "Submenu for %s", RoadMapFactoryMenuPopups[i].title); - - roadmap_main_add_menu_item - (gui_menu, - RoadMapFactoryMenuPopups[i].title, - strdup(tip), RoadMapFactoryMenuPopups[i].action); - - } else if (*item == RoadMapFactorySeparator) { --- 559,562 ---- *************** *** 537,541 **** const RoadMapAction *this_action; ! this_action = roadmap_factory_find_action (actions, *item); if (this_action != NULL) { roadmap_main_add_menu_item (gui_menu, --- 571,576 ---- const RoadMapAction *this_action; ! this_action = roadmap_factory_find_action_or_menu (actions, *item); ! if (this_action != NULL) { roadmap_main_add_menu_item (gui_menu, *************** *** 554,559 **** (const char **item, RoadMapAction *actions, int use_icons) { - int prefix = strlen(ROADMAP_MENU); - roadmap_main_add_toolbar (roadmap_config_get (&RoadMapConfigGeneralToolbarOrientation)); --- 589,592 ---- *************** *** 565,573 **** roadmap_main_add_tool_space (); ! } else if (strncmp (*item, ROADMAP_MENU, prefix) != 0) { const RoadMapAction *this_action; ! this_action = roadmap_factory_find_action (actions, *item); if (this_action != NULL) { --- 598,610 ---- roadmap_main_add_tool_space (); ! } else if (strncmp (*item, ROADMAP_MENU, sizeof(ROADMAP_MENU)-1) == 0) { ! ! continue; ! ! } else { const RoadMapAction *this_action; ! this_action = roadmap_factory_find_action_or_menu (actions, *item); if (this_action != NULL) { *************** *** 607,618 **** userconfig = roadmap_factory_user_config (name, "menus", actions); if (userconfig != NULL) { ! roadmap_factory_config_menu(userconfig, actions, 0); } else { ! roadmap_factory_config_menu(menu, actions, 0); } userconfig = roadmap_factory_user_config (name, "popup", actions); if (userconfig != NULL) { ! roadmap_factory_config_menu(userconfig, actions, 1); } --- 644,655 ---- userconfig = roadmap_factory_user_config (name, "menus", actions); if (userconfig != NULL) { ! roadmap_factory_config_menu(userconfig, actions, 1); } else { ! roadmap_factory_config_menu(menu, actions, 1); } userconfig = roadmap_factory_user_config (name, "popup", actions); if (userconfig != NULL) { ! roadmap_factory_config_menu(userconfig, actions, 0); } *************** *** 681,684 **** --- 718,722 ---- p = separator + strlen(ROADMAP_MAPPED_TO); while (*p <= ' ') ++p; + this_action = roadmap_factory_find_action (actions, p); |