#include "pnd_container.h"
#include "pnd_conf.h"
#include "pnd_discovery.h"
+#include "pnd_notify.h"
+#include "pnd_dbusnotify.h"
#include "mmenu.h"
#include "mmconf.h"
confitem_t page_general[] = {
{ "Default tab to show", "On startup, Minimenu will try to switch to this tab", NULL /* default */, "categories.default_cat", ct_visible_tab_list },
+#if 0 // and also in mmenu.c -- something crashes during image caching
{ "Set CPU speed within Minimenu", "Whether the next setting is applied or not", "0", "minimenu.use_mm_speed", ct_boolean },
{ "CPU speed within Minimenu", "Set low; speed to run Minimenu at", "400", "minimenu.mm_speed", ct_cpu_speed },
+#endif
+ { "Show 'All' tab", "Whethor an All tab is shown or not", "1", "categories.do_all_cat", ct_boolean },
+ { "Show directory browser tabs", "Show a tab for each SD card?", "0", "filesystem.do_browser", ct_boolean },
+ { "Detail panel on start?", "Show or hide the detail panel when menu starts", "1", "display.show_detail_pane", ct_boolean },
+ { "Sub-categories as folders?", "If no, uses tabs instead of folders within tabs.", "1", "tabs.subcat_as_folders", ct_boolean },
+ { "Sub-category apps in their main cat?","If no, apps with subcategories are only in subcategories","1", "tabs.subcat_to_parent", ct_boolean },
+ { "Remember selected app", "On return to menu select previous app; default to selected", "1", "minimenu.start_selected", ct_boolean },
+ { "Auto discover pnd apps?", "If no, turn on diectory browser to manually find apps", "1", "filesystem.do_pnd_disco", ct_boolean },
+ // dropped option -- we now strictly enforce free desktop categories (or user defined, but no more bogus PXML categories)
+ // { "Keep bad categories in Other?", "Lazy dev! Put broken categories into Other to keep clean", "1", "categories.good_cats_only", ct_boolean },
{ "Set CPU speed when leaving", "Whether the next setting is applied or not", "0", "minimenu.use_run_speed", ct_boolean },
{ "CPU speed when leaving", "Before running app, set this speed; app may override.", "500", "minimenu.run_speed", ct_cpu_speed },
- { "Show 'All' tab", "Whethor an All tab is shown or not", "1", "categories.do_all_cat", ct_boolean },
- { "Start with app selected", "Whethor selection is placed by default or not", "0", "minimenu.start_selected", ct_boolean },
{ "Wrap tab change", "Changing tab left or right, does it wrap around?", "0", "tabs.wraparound", ct_boolean },
{ "Grid stop vertical", "Changing selection up or down, does it stop or wrap?", "0", "grid.wrap_vert_stop", ct_boolean },
+ { "Live (not exit) on app run?", "Normally menu exits (to save ram) on app run", "0", "minimenu.live_on_run", ct_boolean },
{ "Force wallpaper with..", "You can force an override over themes background", "/pandora/appdata/mmenu/wallpaper.png", "minimenu.force_wallpaper", ct_filename },
{ "", "", NULL, NULL, ct_nil },
{ "^- Back up to main", "Go back to top level of configuration", NULL, NULL, ct_switch_page, NULL },
{ "General Options", "Miscellaneous handy options", NULL /* default */, NULL, ct_switch_page, page_general },
{ "Show/Hide Applications", "Each application can be hidden/revealed", NULL /* default */, NULL, ct_switch_page, page_appshowhide },
{ "Show/Hide/Order Tabs", "Each tab can be hidden/revealed or re-ordered", NULL /* default */, NULL, ct_switch_page, page_tabshowhide },
+ { "Manage Custom Categories", "Can make your own categories/tabs", NULL /* default */, NULL, ct_go_manage_categories },
+ { "Select a Minimenu Skin", "Download alternate look and feels!", NULL /* default */, NULL, ct_go_manage_skins },
{ "", "", NULL, NULL, ct_nil },
{ "Exit configuration", "Quit and save configuration", NULL /* default */, NULL, ct_exit },
{ "", "", NULL, NULL, ct_nil },
extern pnd_conf_handle g_conf;
extern SDL_Surface *sdl_realscreen;
extern mm_imgcache_t g_imagecache [ IMG_TRUEMAX ];
-extern mm_category_t *g_categories;
-extern unsigned char g_categorycount;
-extern mm_category_t _categories_invis [ MAX_CATS ];
-extern unsigned char _categories_inviscount;
extern pnd_box_handle g_active_apps;
unsigned char conf_run_menu ( confitem_t *toplevel ) {
if ( v ) {
unsigned char n = 0;
for ( n = 0; n < g_categorycount; n++ ) {
- if ( strcmp ( v, g_categories [ n ].catname ) == 0 ) {
+ if ( strcmp ( v, g_categories [ n ] -> catname ) == 0 ) {
break;
}
}
if ( n < g_categorycount ) {
if ( left && n ) {
- pnd_conf_set_char ( g_conf, page [ sel ].key, g_categories [ n - 1 ].catname );
+ pnd_conf_set_char ( g_conf, page [ sel ].key, g_categories [ n - 1 ] -> catname );
} else if ( ! left && n + 1 < g_categorycount ) {
- pnd_conf_set_char ( g_conf, page [ sel ].key, g_categories [ n + 1 ].catname );
+ pnd_conf_set_char ( g_conf, page [ sel ].key, g_categories [ n + 1 ] -> catname );
}
} else {
- pnd_conf_set_char ( g_conf, page [ sel ].key, g_categories [ 0 ].catname );
+ pnd_conf_set_char ( g_conf, page [ sel ].key, g_categories [ 0 ] -> catname );
}
} else {
- pnd_conf_set_char ( g_conf, page [ sel ].key, g_categories [ 0 ].catname );
+ pnd_conf_set_char ( g_conf, page [ sel ].key, g_categories [ 0 ] -> catname );
}
} // if category count
}
break;
case ct_nil:
+ case ct_go_manage_categories:
+ case ct_go_manage_skins:
case ct_switch_page:
case ct_reset:
case ct_exit:
page = page [ sel ].newhead;
sel = 0; // should use a stack..
break;
+ case ct_go_manage_categories:
+ ui_manage_categories();
+ break;
+ case ct_go_manage_skins:
+ if ( ui_pick_skin() ) {
+ emit_and_quit ( MM_RESTART );
+ }
+ break;
case ct_filename:
break;
case ct_nil:
dest += conf_render_text ( g_big_font, "Minimenu Configuration", dest, 10, 10, CONF_UNSELECTED );
dest += conf_render_line ( dest, 45 );
+ // scrollable hints
+ {
+
+ // up
+ if ( first_visible > 0 ) {
+ dest -> x = 10;
+ dest -> y = 65;
+ SDL_BlitSurface ( g_imagecache [ IMG_ARROW_UP ].i, NULL /* whole image */, sdl_realscreen, dest );
+ dest++;
+ } // scroll arrow up
+
+ // down
+ if ( first_visible + max_visible < conf_determine_pagelength ( page ) ) {
+ dest -> x = 10;
+ dest -> y = 345;
+ SDL_BlitSurface ( g_imagecache [ IMG_ARROW_DOWN ].i, NULL /* whole image */, sdl_realscreen, dest );
+ dest++;
+ } // scroll arrow up
+
+ } // scrollbar
+
// items
tx = 50; ty = 70;
unsigned char counter = first_visible;
break;
case ct_exit:
break;
+ case ct_go_manage_categories:
+ case ct_go_manage_skins:
case ct_nil:
break;
} // switch
case ct_reset:
case ct_exit:
case ct_visible_tab_list:
+ case ct_go_manage_categories:
+ case ct_go_manage_skins:
break;
} // switch
dest += conf_render_text ( g_tab_font, "No default value", dest, 380, 420, CONF_UNSELECTED );
}
+ // cursor's conf item count number - not for top level, just the sublevels
+ if ( page != pages ) {
+ char buffer [ 40 ];
+ sprintf ( buffer, "Config item %d of %d", selitem + 1, conf_determine_pagelength ( page ) );
+ /*dest += */conf_render_text ( g_tab_font, buffer, dest, 380, 440, CONF_UNSELECTED );
+ }
+
// help
dest += conf_render_line ( dest, 380 );
- dest += conf_render_text ( g_tab_font, "Up and down to switch selection", dest, 10, 400, CONF_UNSELECTED );
+ dest += conf_render_text ( g_tab_font, "D-pad Up/down; Y return to index", dest, 10, 400, CONF_UNSELECTED );
dest += conf_render_text ( g_tab_font, "Left and right to alter selected item", dest, 10, 420, CONF_UNSELECTED );
dest += conf_render_text ( g_tab_font, "B or Enter to activate an option", dest, 10, 440, CONF_UNSELECTED );
case ct_switch_page:
case ct_visible_tab_list:
case ct_nil:
+ case ct_go_manage_categories:
+ case ct_go_manage_skins:
break;
} // switch
template -> text = ""; // so it won't get repopulated again later
- typedef struct {
- mm_category_t *cat;
- unsigned char n;
- } _foo;
- _foo cats [ 2 ];
- cats [ 0 ].cat = g_categories;
- cats [ 0 ].n = g_categorycount;
- cats [ 1 ].cat = _categories_invis;
- cats [ 1 ].n = _categories_inviscount;
+ // switch categories being published
+ category_publish ( CFALL, NULL );
// for each tab
- unsigned int i, j;
- for ( j = 0; j < 2; j++ ) {
- mm_category_t *cc = cats [ j ].cat;
- unsigned char cn = cats [ j ].n;
- char catname [ 512 ];
- char *actual_catname;
-
- for ( i = 0; i < cn; i++ ) {
-
- // if this is an invisi-guy, it has parent-cat prepended; we want the real cat name.
- strncpy ( catname, cc [ i ].catname, 500 );
- if ( ( actual_catname = strchr ( catname, '.' ) ) ) {
- actual_catname++; // skip the period
- } else {
- actual_catname = catname;
- }
- //fprintf ( stderr, "conf ui; got '%s' but showing '%s'\n", cc [ i ].catname, actual_catname );
+ unsigned int i;
+ char catname [ 512 ];
+ char *actual_catname;
+ char finalbuf [ 101 ];
- if ( strncmp ( cc [ i ].catname, "All ", 4 ) == 0 ) {
- // skip All tab, since it is generated, and managed by another config item
- continue;
- }
+ for ( i = 0; i < g_categorycount; i++ ) {
+
+ // if this is an invisi-guy, it has parent-cat prepended; we want the real cat name.
+ strncpy ( catname, g_categories [ i ] -> catname, 500 );
- p -> text = strndup ( actual_catname, 40 );
- p -> desc = NULL;
- p -> def = NULL;
+ if ( ( actual_catname = strchr ( catname, '.' ) ) ) {
+ actual_catname++; // skip the period
+ } else {
+ actual_catname = catname;
+ }
+ //fprintf ( stderr, "conf ui; got '%s' but showing '%s'\n", cc [ i ].catname, actual_catname );
- sprintf ( buffer, "%s.%s", template -> key, actual_catname );
- p -> key = strdup ( buffer );
- p -> type = ct_boolean;
- p -> newhead = NULL;
+ if ( strncmp ( g_categories [ i ] -> catname, "All ", 4 ) == 0 ) {
+ // skip All tab, since it is generated, and managed by another config item
+ continue;
+ }
- // create to positive if not existant
- if ( ! pnd_conf_get_as_char ( g_conf, buffer ) ) {
- pnd_conf_set_char ( g_conf, buffer, "1" );
- }
+ if ( g_categories [ i ] -> parent_catname ) {
+ snprintf ( finalbuf, 100, "%s [%s]", actual_catname, g_categories [ i ] -> parent_catname );
+ } else {
+ strncpy ( finalbuf, actual_catname, 100 );
+ }
+
+ p -> text = strndup ( finalbuf, 40 );
+ p -> desc = NULL;
+ p -> def = NULL;
- //fprintf ( stderr, "Created tabshow entry '%s'\n", cc [ i ].catname );
+ sprintf ( buffer, "%s.%s", template -> key, actual_catname );
+ p -> key = strdup ( buffer );
+ p -> type = ct_boolean;
+ p -> newhead = NULL;
- p++;
+ // create to positive if not existant
+ if ( ! pnd_conf_get_as_char ( g_conf, buffer ) ) {
+ pnd_conf_set_char ( g_conf, buffer, "1" );
}
- }
+ //fprintf ( stderr, "Created tabshow entry '%s'\n", cc [ i ].catname );
+
+ p++;
+ } // for
+
+ // switch categories being published
+ category_publish ( CFNORMAL, NULL );
break;
}
// does item begin with app or tab tag?
char *k = pnd_box_get_key ( v );
- if ( k &&
+ if ( k &&
( strncasecmp ( k, "appshow.", 8 ) == 0 ||
strncasecmp ( k, "tabshow.", 8 ) == 0 )
)
v = pnd_box_get_next ( v );
} // while
+ // really, should write out keys that are not found in the conf items..
+ // but since g_conf is merged with other conf files, that may just
+ // make for big dumps erroneously.. hmm :/
+ char *previous_unique_id = pnd_conf_get_as_char ( g_conf, "minimenu.last_known_app_uid" );
+ char *lastcat = pnd_conf_get_as_char ( g_conf, "minimenu.last_known_catname" );
+ if ( previous_unique_id ) {
+ fprintf ( f, "%s\t%s\n", "minimenu.last_known_app_uid", previous_unique_id );
+ }
+ if ( lastcat ) {
+ fprintf ( f, "%s\t%s\n", "minimenu.last_known_catname", lastcat );
+ }
+
fclose ( f );
return ( 1 );
// does item begin with app or tab tag?
char *k = pnd_box_get_key ( v );
- if ( k &&
+ if ( k &&
( strncasecmp ( k, "appshow.", 8 ) == 0 ||
strncasecmp ( k, "tabshow.", 8 ) == 0 )
)
return;
}
+unsigned int conf_determine_pagelength ( confitem_t *page ) {
+ confitem_t *p = page;
+ while ( p -> text ) {
+ p++;
+ }
+ return ( p - page );
+}