#include "SDL_gfxPrimitives.h"
#include "SDL_rotozoom.h"
#include "SDL_thread.h"
+#include <sys/types.h>
+#include <dirent.h>
#include "pnd_conf.h"
#include "pnd_logger.h"
#include "pnd_discovery.h"
#include "pnd_apps.h"
#include "pnd_device.h"
+#include "../lib/pnd_pathiter.h"
+#include "pnd_utility.h"
#include "mmenu.h"
#include "mmcat.h"
#include "mmui.h"
#include "mmwrapcmd.h"
+#define CHANGED_NOTHING (0)
+#define CHANGED_CATEGORY (1<<0) /* changed to different category */
+#define CHANGED_SELECTION (1<<1) /* changed app selection */
+#define CHANGED_DATAUPDATE (1<<2) /* deferred preview pic or icon came in */
+#define CHANGED_APPRELOAD (1<<3) /* new set of applications entirely */
+#define CHANGED_EVERYTHING (1<<4) /* redraw it all! */
+unsigned int render_mask = CHANGED_EVERYTHING;
+
/* SDL
*/
SDL_Surface *sdl_realscreen = NULL;
}
// grid font
- sprintf ( fullpath, "%s/%s", g_skinpath, pnd_conf_get_as_char ( g_conf, MMENU_GRID_FONT ) );
- g_grid_font = TTF_OpenFont ( fullpath, pnd_conf_get_as_int_d ( g_conf, MMENU_GRID_FONTSIZE, 10 ) );
+ sprintf ( fullpath, "%s/%s", g_skinpath, pnd_conf_get_as_char ( g_conf, "grid.font" ) );
+ g_grid_font = TTF_OpenFont ( fullpath, pnd_conf_get_as_int_d ( g_conf, "grid.font_ptsize", 10 ) );
if ( ! g_grid_font ) {
pnd_log ( pndn_error, "ERROR: Couldn't load font '%s' for size %u\n",
- pnd_conf_get_as_char ( g_conf, MMENU_GRID_FONT ), pnd_conf_get_as_int_d ( g_conf, MMENU_GRID_FONTSIZE, 10 ) );
+ pnd_conf_get_as_char ( g_conf, "grid.font" ), pnd_conf_get_as_int_d ( g_conf, "grid.font_ptsize", 10 ) );
return ( 0 ); // couldn't set up SDL TTF
}
//
// scale icons
- g_imagecache [ IMG_SELECTED_ALPHAMASK ].i = ui_scale_image ( g_imagecache [ IMG_SELECTED_ALPHAMASK ].i, pnd_conf_get_as_int_d ( g_conf, "grid.icon_max_width", 50 ), -1 );
g_imagecache [ IMG_ICON_MISSING ].i = ui_scale_image ( g_imagecache [ IMG_ICON_MISSING ].i, pnd_conf_get_as_int_d ( g_conf, "grid.icon_max_width", 50 ), -1 );
// scale text hilight
g_imagecache [ IMG_SELECTED_HILITE ].i = ui_scale_image ( g_imagecache [ IMG_SELECTED_HILITE ].i, pnd_conf_get_as_int_d ( g_conf, "grid.text_width", 50 ), -1 );
pnd_conf_get_as_int_d ( g_conf, "previewpic.cell_height", 50 ) );
// set alpha on detail panel
- SDL_SetAlpha ( g_imagecache [ IMG_DETAIL_BG ].i, SDL_SRCALPHA, pnd_conf_get_as_int_d ( g_conf, "display.detail_bg_alpha", 50 ) );
+ //SDL_SetAlpha ( g_imagecache [ IMG_DETAIL_BG ].i, SDL_SRCALPHA, pnd_conf_get_as_int_d ( g_conf, "display.detail_bg_alpha", 50 ) );
return ( 1 );
} // ui_imagecache
-void ui_render ( unsigned int render_mask ) {
+void ui_render ( void ) {
// 800x480:
// divide width: 550 / 250
// divide left side: 5 columns == 110px width
// 20px buffer either side == 70px wide icon + 20 + 20?
+ // what jobs to do during render?
+ //
+
+#define R_BG (1<<0)
+#define R_TABS (1<<1)
+#define R_DETAIL (1<<2)
+#define R_GRID (1<<3)
+
+#define R_ALL (R_BG|R_TABS|R_DETAIL|R_GRID)
+
+ unsigned int render_jobs_b = 0;
+
+ if ( render_mask & CHANGED_EVERYTHING ) {
+ render_jobs_b |= R_ALL;
+ }
+
+ if ( render_mask & CHANGED_SELECTION ) {
+ render_jobs_b |= R_GRID;
+ render_jobs_b |= R_DETAIL;
+ }
+
+ if ( render_mask & CHANGED_CATEGORY ) {
+ render_jobs_b |= R_ALL;
+ }
+
+ render_mask = CHANGED_NOTHING;
+
+ // render everything
+ //
unsigned int icon_rows;
#define MAXRECTS 200
unsigned int screen_width = pnd_conf_get_as_int_d ( g_conf, "display.screen_width", 800 );
- unsigned char row_max = pnd_conf_get_as_int_d ( g_conf, MMENU_DISP_ROWMAX, 4 );
- unsigned char col_max = pnd_conf_get_as_int_d ( g_conf, MMENU_DISP_COLMAX, 5 );
+ unsigned char row_max = pnd_conf_get_as_int_d ( g_conf, "grid.row_max", 4 );
+ unsigned char col_max = pnd_conf_get_as_int_d ( g_conf, "grid.col_max", 5 );
unsigned int font_rgba_r = pnd_conf_get_as_int_d ( g_conf, "display.font_rgba_r", 200 );
unsigned int font_rgba_g = pnd_conf_get_as_int_d ( g_conf, "display.font_rgba_g", 200 );
unsigned int icon_offset_y = pnd_conf_get_as_int ( g_conf, "grid.icon_offset_y" );
unsigned int icon_max_width = pnd_conf_get_as_int ( g_conf, "grid.icon_max_width" );
unsigned int icon_max_height = pnd_conf_get_as_int ( g_conf, "grid.icon_max_height" );
+ unsigned int sel_icon_offset_x = pnd_conf_get_as_int_d ( g_conf, "grid.sel_offoffset_x", 0 );
+ unsigned int sel_icon_offset_y = pnd_conf_get_as_int_d ( g_conf, "grid.sel_offoffset_y", 0 );
unsigned int text_width = pnd_conf_get_as_int ( g_conf, "grid.text_width" );
unsigned int text_clip_x = pnd_conf_get_as_int ( g_conf, "grid.text_clip_x" );
int topleft = col_max * ui_rows_scrolled_down;
int botright = ( col_max * ( ui_rows_scrolled_down + row_max ) - 1 );
- //pnd_log ( PND_LOG_DEFAULT, "index %u tl %u br %u\n", index, topleft, botright );
+ pnd_log ( PND_LOG_DEFAULT, "index %u tl %u br %u\n", index, topleft, botright );
if ( index < topleft ) {
ui_rows_scrolled_down -= pnd_conf_get_as_int_d ( g_conf, "grid.scroll_increment", 1 );
+ render_jobs_b |= R_ALL;
} else if ( index > botright ) {
ui_rows_scrolled_down += pnd_conf_get_as_int_d ( g_conf, "grid.scroll_increment", 1 );
+ render_jobs_b |= R_ALL;
}
if ( ui_rows_scrolled_down < 0 ) {
} // ensire visible
// render background
- if ( g_imagecache [ IMG_BACKGROUND_800480 ].i ) {
- dest -> x = 0;
- dest -> y = 0;
- dest -> w = sdl_realscreen -> w;
- dest -> h = sdl_realscreen -> h;
- SDL_BlitSurface ( g_imagecache [ IMG_BACKGROUND_800480 ].i, NULL /* whole image */, sdl_realscreen, dest /* 0,0 */ );
- dest++;
- }
+ if ( render_jobs_b & R_BG ) {
- // tabmask
- if ( g_imagecache [ IMG_BACKGROUND_TABMASK ].i ) {
- dest -> x = 0;
- dest -> y = 0;
- dest -> w = sdl_realscreen -> w;
- dest -> h = sdl_realscreen -> h;
- SDL_BlitSurface ( g_imagecache [ IMG_BACKGROUND_TABMASK ].i, NULL /* whole image */, sdl_realscreen, dest /* 0,0 */ );
- dest++;
- }
+ if ( g_imagecache [ IMG_BACKGROUND_800480 ].i ) {
+ dest -> x = 0;
+ dest -> y = 0;
+ dest -> w = sdl_realscreen -> w;
+ dest -> h = sdl_realscreen -> h;
+ SDL_BlitSurface ( g_imagecache [ IMG_BACKGROUND_800480 ].i, NULL /* whole image */, sdl_realscreen, dest /* 0,0 */ );
+ dest++;
+ }
+
+ // tabmask
+ if ( g_imagecache [ IMG_BACKGROUND_TABMASK ].i ) {
+ dest -> x = 0;
+ dest -> y = 0;
+ dest -> w = sdl_realscreen -> w;
+ dest -> h = sdl_realscreen -> h;
+ SDL_BlitSurface ( g_imagecache [ IMG_BACKGROUND_TABMASK ].i, NULL /* whole image */, sdl_realscreen, dest /* 0,0 */ );
+ dest++;
+ }
+
+ } // r_bg
// tabs
if ( g_imagecache [ IMG_TAB_SEL ].i && g_imagecache [ IMG_TAB_UNSEL ].i ) {
// draw tab
src.x = 0;
src.y = 0;
+#if 0
src.w = tab_width;
if ( col == ui_category ) {
src.h = tab_selheight;
} else {
src.h = tab_height;
}
+#else
+ src.w = s -> w;
+ src.h = s -> h;
+#endif
dest -> x = tab_offset_x + ( (col-ui_catshift) * tab_width );
dest -> y = tab_offset_y;
- //pnd_log ( pndn_debug, "tab %u at %ux%u\n", col, dest.x, dest.y );
- SDL_BlitSurface ( s, &src, sdl_realscreen, dest );
// store touch info
ui_register_tab ( col, dest -> x, dest -> y, tab_width, tab_height );
- dest++;
+ if ( render_jobs_b & R_TABS ) {
+ //pnd_log ( pndn_debug, "tab %u at %ux%u\n", col, dest.x, dest.y );
+ SDL_BlitSurface ( s, &src, sdl_realscreen, dest );
+ dest++;
+
+ // draw tab line
+ if ( col == ui_category ) {
+ // no line for selected tab
+ } else {
+ if ( col - ui_catshift == 0 ) {
+ s = g_imagecache [ IMG_TAB_LINEL ].i;
+ } else if ( col - ui_catshift == maxtabspot - 1 ) {
+ s = g_imagecache [ IMG_TAB_LINER ].i;
+ } else {
+ s = g_imagecache [ IMG_TAB_LINE ].i;
+ }
+ dest -> x = tab_offset_x + ( (col-ui_catshift) * tab_width );
+ dest -> y = tab_offset_y + tab_height;
+ SDL_BlitSurface ( s, NULL /* whole image */, sdl_realscreen, dest );
+ dest++;
+ }
+
+ // draw text
+ SDL_Surface *rtext;
+ SDL_Color tmpfontcolor = { font_rgba_r, font_rgba_g, font_rgba_b, font_rgba_a };
+ rtext = TTF_RenderText_Blended ( g_tab_font, g_categories [ col ].catname, tmpfontcolor );
+ src.x = 0;
+ src.y = 0;
+ src.w = rtext -> w < text_width ? rtext -> w : text_width;
+ src.h = rtext -> h;
+ dest -> x = tab_offset_x + ( (col-ui_catshift) * tab_width ) + text_offset_x;
+ dest -> y = tab_offset_y + text_offset_y;
+ SDL_BlitSurface ( rtext, &src, sdl_realscreen, dest );
+ SDL_FreeSurface ( rtext );
+ dest++;
+
+ } // r_tabs
+
+ } // for
+
+ if ( render_jobs_b & R_TABS ) {
+
+ // draw tab lines under where tabs would be if we had categories
+ for ( /* foo */; col < maxtabspot; col++ ) {
+ SDL_Surface *s;
- // draw tab line
- if ( col == ui_category ) {
- // no line for selected tab
- } else {
if ( col - ui_catshift == 0 ) {
s = g_imagecache [ IMG_TAB_LINEL ].i;
} else if ( col - ui_catshift == maxtabspot - 1 ) {
dest -> y = tab_offset_y + tab_height;
SDL_BlitSurface ( s, NULL /* whole image */, sdl_realscreen, dest );
dest++;
- }
-
- // draw text
- SDL_Surface *rtext;
- SDL_Color tmpfontcolor = { font_rgba_r, font_rgba_g, font_rgba_b, font_rgba_a };
- rtext = TTF_RenderText_Blended ( g_tab_font, g_categories [ col ].catname, tmpfontcolor );
- src.x = 0;
- src.y = 0;
- src.w = rtext -> w < text_width ? rtext -> w : text_width;
- src.h = rtext -> h;
- dest -> x = tab_offset_x + ( (col-ui_catshift) * tab_width ) + text_offset_x;
- dest -> y = tab_offset_y + text_offset_y;
- SDL_BlitSurface ( rtext, &src, sdl_realscreen, dest );
- SDL_FreeSurface ( rtext );
- dest++;
- } // for
-
- // draw tab lines under where tabs would be if we had categories
- for ( /* foo */; col < maxtabspot; col++ ) {
- SDL_Surface *s;
-
- if ( col - ui_catshift == 0 ) {
- s = g_imagecache [ IMG_TAB_LINEL ].i;
- } else if ( col - ui_catshift == maxtabspot - 1 ) {
- s = g_imagecache [ IMG_TAB_LINER ].i;
- } else {
- s = g_imagecache [ IMG_TAB_LINE ].i;
- }
- dest -> x = tab_offset_x + ( (col-ui_catshift) * tab_width );
- dest -> y = tab_offset_y + tab_height;
- SDL_BlitSurface ( s, NULL /* whole image */, sdl_realscreen, dest );
- dest++;
+ } // for
- } // for
+ } // r_tabs
} // tabs
// scroll bars and arrows
- {
+ if ( render_jobs_b & R_BG ) {
unsigned char show_bar = 0;
// up?
dest++;
} // bar
- } // scroll bars
+ } // r_bg, scroll bars
// render detail pane bg
- if ( pnd_conf_get_as_int_d ( g_conf, "detailpane.show", 1 ) ) {
+ if ( render_jobs_b & R_DETAIL ) {
+
+ if ( pnd_conf_get_as_int_d ( g_conf, "detailpane.show", 1 ) ) {
+
+ // render detail bg
+ if ( g_imagecache [ IMG_DETAIL_BG ].i ) {
+ src.x = 0; // pnd_conf_get_as_int_d ( g_conf, "detailpane.pane_offset_x", 460 );
+ src.y = 0; // pnd_conf_get_as_int_d ( g_conf, "detailpane.pane_offset_y", 60 );
+ src.w = ((SDL_Surface*)(g_imagecache [ IMG_DETAIL_PANEL ].i)) -> w;
+ src.h = ((SDL_Surface*)(g_imagecache [ IMG_DETAIL_PANEL ].i)) -> h;
+ dest -> x = pnd_conf_get_as_int_d ( g_conf, "detailpane.pane_offset_x", 460 );
+ dest -> y = pnd_conf_get_as_int_d ( g_conf, "detailpane.pane_offset_y", 60 );
+ SDL_BlitSurface ( g_imagecache [ IMG_DETAIL_BG ].i, &src, sdl_realscreen, dest );
+ dest++;
+ }
- if ( g_imagecache [ IMG_DETAIL_BG ].i ) {
- src.x = pnd_conf_get_as_int_d ( g_conf, "detailpane.pane_offset_x", 460 );
- src.y = pnd_conf_get_as_int_d ( g_conf, "detailpane.pane_offset_y", 60 );
- src.w = ((SDL_Surface*)(g_imagecache [ IMG_DETAIL_PANEL ].i)) -> w;
- src.h = ((SDL_Surface*)(g_imagecache [ IMG_DETAIL_PANEL ].i)) -> h;
- dest -> x = pnd_conf_get_as_int_d ( g_conf, "detailpane.pane_offset_x", 460 );
- dest -> y = pnd_conf_get_as_int_d ( g_conf, "detailpane.pane_offset_y", 60 );
- SDL_BlitSurface ( g_imagecache [ IMG_DETAIL_BG ].i, &src, sdl_realscreen, dest );
- dest++;
- }
+ // render detail pane
+ if ( g_imagecache [ IMG_DETAIL_PANEL ].i ) {
+ dest -> x = pnd_conf_get_as_int_d ( g_conf, "detailpane.pane_offset_x", 460 );
+ dest -> y = pnd_conf_get_as_int_d ( g_conf, "detailpane.pane_offset_y", 60 );
+ SDL_BlitSurface ( g_imagecache [ IMG_DETAIL_PANEL ].i, NULL /* whole image */, sdl_realscreen, dest );
+ dest++;
+ }
- // render detail pane
- if ( g_imagecache [ IMG_DETAIL_PANEL ].i ) {
- dest -> x = pnd_conf_get_as_int_d ( g_conf, "detailpane.pane_offset_x", 460 );
- dest -> y = pnd_conf_get_as_int_d ( g_conf, "detailpane.pane_offset_y", 60 );
- SDL_BlitSurface ( g_imagecache [ IMG_DETAIL_PANEL ].i, NULL /* whole image */, sdl_realscreen, dest );
- dest++;
- }
+ } // detailpane frame/bg
- } // detailpane frame/bg
+ } // r_details
// anything to render?
- if ( g_categories [ ui_category ].refs ) {
+ if ( render_jobs_b & R_GRID ) {
- appiter = g_categories [ ui_category ].refs;
- row = 0;
- displayrow = 0;
+ // if just rendering grid, and nothing else, better clear it first
+ if ( ! ( render_jobs_b & R_BG ) ) {
+ if ( g_imagecache [ IMG_BACKGROUND_800480 ].i ) {
+ src.x = grid_offset_x;
+ src.y = grid_offset_y + sel_icon_offset_y;
+ src.w = col_max * cell_width;
+ src.h = row_max * cell_height;
- // until we run out of apps, or run out of space
- while ( appiter != NULL ) {
+ dest -> x = grid_offset_x;
+ dest -> y = grid_offset_y + sel_icon_offset_y;
- for ( col = 0; col < col_max && appiter != NULL; col++ ) {
-
- // do we even need to render it? or are we suppressing it due to rows scrolled off the top?
- if ( row >= ui_rows_scrolled_down ) {
+ SDL_BlitSurface ( g_imagecache [ IMG_BACKGROUND_800480 ].i, &src, sdl_realscreen, dest );
+ dest++;
- // selected? show hilights
- if ( appiter == ui_selected ) {
- // icon
- dest -> x = grid_offset_x + ( col * cell_width ) + icon_offset_x;
- dest -> y = grid_offset_y + ( displayrow * cell_height ) + icon_offset_y;
- SDL_BlitSurface ( g_imagecache [ IMG_SELECTED_ALPHAMASK ].i, NULL /* all */, sdl_realscreen, dest );
- dest++;
- // text
- dest -> x = grid_offset_x + ( col * cell_width ) + text_clip_x;
- dest -> y = grid_offset_y + ( displayrow * cell_height ) + pnd_conf_get_as_int ( g_conf, "grid.text_hilite_offset_y" );
- SDL_BlitSurface ( g_imagecache [ IMG_SELECTED_HILITE ].i, NULL /* all */, sdl_realscreen, dest );
- dest++;
- } // selected?
-
- // show icon
- mm_cache_t *ic = cache_query_icon ( appiter -> ref -> unique_id );
- SDL_Surface *iconsurface;
- if ( ic ) {
- iconsurface = ic -> i;
- } else {
- //pnd_log ( pndn_warning, "WARNING: TBD: Need Missin-icon icon for '%s'\n", IFNULL(appiter -> ref -> title_en,"No Name") );
- iconsurface = g_imagecache [ IMG_ICON_MISSING ].i;
- }
- if ( iconsurface ) {
- //pnd_log ( pndn_debug, "Got an icon for '%s'\n", IFNULL(appiter -> ref -> title_en,"No Name") );
+ }
+ }
- src.x = 0;
- src.y = 0;
- src.w = 60;
- src.h = 60;
- dest -> x = grid_offset_x + ( col * cell_width ) + icon_offset_x + (( icon_max_width - iconsurface -> w ) / 2);
- dest -> y = grid_offset_y + ( displayrow * cell_height ) + icon_offset_y + (( icon_max_height - iconsurface -> h ) / 2);
+ if ( g_categories [ ui_category ].refs ) {
- SDL_BlitSurface ( iconsurface, &src, sdl_realscreen, dest );
+ appiter = g_categories [ ui_category ].refs;
+ row = 0;
+ displayrow = 0;
- // store touch info
- ui_register_app ( appiter, dest -> x, dest -> y, src.w, src.h );
+ // until we run out of apps, or run out of space
+ while ( appiter != NULL ) {
- dest++;
+ for ( col = 0; col < col_max && appiter != NULL; col++ ) {
- }
+ // do we even need to render it? or are we suppressing it due to rows scrolled off the top?
+ if ( row >= ui_rows_scrolled_down ) {
- // show text
- if ( appiter -> ref -> title_en ) {
- SDL_Surface *rtext;
- SDL_Color tmpfontcolor = { font_rgba_r, font_rgba_g, font_rgba_b, font_rgba_a };
- rtext = TTF_RenderText_Blended ( g_grid_font, appiter -> ref -> title_en, tmpfontcolor );
- src.x = 0;
- src.y = 0;
- src.w = text_width < rtext -> w ? text_width : rtext -> w;
- src.h = rtext -> h;
- if ( rtext -> w > text_width ) {
+ // selected? show hilights
+ if ( appiter == ui_selected ) {
+ SDL_Surface *s = g_imagecache [ IMG_SELECTED_ALPHAMASK ].i;
+ // icon
+ //dest -> x = grid_offset_x + ( col * cell_width ) + icon_offset_x + ( ( icon_max_width - s -> w ) / 2 );
+ dest -> x = grid_offset_x + ( col * cell_width ) + icon_offset_x + sel_icon_offset_x;
+ //dest -> y = grid_offset_y + ( displayrow * cell_height ) + icon_offset_y + ( ( icon_max_height - s -> h ) / 2 );
+ dest -> y = grid_offset_y + ( displayrow * cell_height ) + icon_offset_y + sel_icon_offset_y;
+ SDL_BlitSurface ( s, NULL /* all */, sdl_realscreen, dest );
+ dest++;
+ // text
dest -> x = grid_offset_x + ( col * cell_width ) + text_clip_x;
+ dest -> y = grid_offset_y + ( displayrow * cell_height ) + pnd_conf_get_as_int ( g_conf, "grid.text_hilite_offset_y" );
+ SDL_BlitSurface ( g_imagecache [ IMG_SELECTED_HILITE ].i, NULL /* all */, sdl_realscreen, dest );
+ dest++;
+ } // selected?
+
+ // show icon
+ mm_cache_t *ic = cache_query_icon ( appiter -> ref -> unique_id );
+ SDL_Surface *iconsurface;
+ if ( ic ) {
+ iconsurface = ic -> i;
} else {
- dest -> x = grid_offset_x + ( col * cell_width ) + text_offset_x - ( rtext -> w / 2 );
+ //pnd_log ( pndn_warning, "WARNING: TBD: Need Missin-icon icon for '%s'\n", IFNULL(appiter -> ref -> title_en,"No Name") );
+ iconsurface = g_imagecache [ IMG_ICON_MISSING ].i;
}
- dest -> y = grid_offset_y + ( displayrow * cell_height ) + text_offset_y;
- SDL_BlitSurface ( rtext, &src, sdl_realscreen, dest );
- SDL_FreeSurface ( rtext );
- dest++;
- }
+ if ( iconsurface ) {
+ //pnd_log ( pndn_debug, "Got an icon for '%s'\n", IFNULL(appiter -> ref -> title_en,"No Name") );
- } // display now? or scrolled away..
+ src.x = 0;
+ src.y = 0;
+ src.w = 60;
+ src.h = 60;
+ dest -> x = grid_offset_x + ( col * cell_width ) + icon_offset_x + (( icon_max_width - iconsurface -> w ) / 2);
+ dest -> y = grid_offset_y + ( displayrow * cell_height ) + icon_offset_y + (( icon_max_height - iconsurface -> h ) / 2);
- // next
- appiter = appiter -> next;
+ SDL_BlitSurface ( iconsurface, &src, sdl_realscreen, dest );
- } // for column 1...X
+ // store touch info
+ ui_register_app ( appiter, dest -> x, dest -> y, src.w, src.h );
- if ( row >= ui_rows_scrolled_down ) {
- displayrow++;
- }
+ dest++;
- row ++;
+ }
- // are we done displaying rows?
- if ( displayrow >= row_max ) {
- break;
- }
+ // show text
+ if ( appiter -> ref -> title_en ) {
+ SDL_Surface *rtext;
+ SDL_Color tmpfontcolor = { font_rgba_r, font_rgba_g, font_rgba_b, font_rgba_a };
+ rtext = TTF_RenderText_Blended ( g_grid_font, appiter -> ref -> title_en, tmpfontcolor );
+ src.x = 0;
+ src.y = 0;
+ src.w = text_width < rtext -> w ? text_width : rtext -> w;
+ src.h = rtext -> h;
+ if ( rtext -> w > text_width ) {
+ dest -> x = grid_offset_x + ( col * cell_width ) + text_clip_x;
+ } else {
+ dest -> x = grid_offset_x + ( col * cell_width ) + text_offset_x - ( rtext -> w / 2 );
+ }
+ dest -> y = grid_offset_y + ( displayrow * cell_height ) + text_offset_y;
+ SDL_BlitSurface ( rtext, &src, sdl_realscreen, dest );
+ SDL_FreeSurface ( rtext );
+ dest++;
+ }
- } // while
+ } // display now? or scrolled away..
- } else {
- // no apps to render?
- pnd_log ( pndn_rem, "No applications to render?\n" );
- } // apps to renser?
+ // next
+ appiter = appiter -> next;
+
+ } // for column 1...X
+
+ if ( row >= ui_rows_scrolled_down ) {
+ displayrow++;
+ }
+
+ row ++;
+
+ // are we done displaying rows?
+ if ( displayrow >= row_max ) {
+ break;
+ }
+
+ } // while
+
+ } else {
+ // no apps to render?
+ pnd_log ( pndn_rem, "No applications to render?\n" );
+ } // apps to renser?
+
+ } // r_grid
// detail panel
- if ( ui_selected ) {
+ if ( ui_selected && render_jobs_b & R_DETAIL ) {
unsigned int cell_offset_x = pnd_conf_get_as_int ( g_conf, "detailtext.cell_offset_x" );
unsigned int cell_offset_y = pnd_conf_get_as_int ( g_conf, "detailtext.cell_offset_y" );
}
// category
+#if 0
if ( ui_selected -> ref -> main_category ) {
sprintf ( buffer, "Category: %s", ui_selected -> ref -> main_category );
dest++;
desty += src.h;
}
+#endif
// clock
if ( ui_selected -> ref -> clockspeed ) {
}
// info hint
- if ( ui_selected -> ref -> clockspeed && ui_selected -> ref -> info_filename ) {
+#if 0 // merged into hint-line
+ if ( ui_selected -> ref -> info_filename ) {
sprintf ( buffer, "Documentation - hit Y" );
dest++;
desty += src.h;
}
+#endif
+
+ // notes
+ if ( ui_selected -> ovrh ) {
+ char *n;
+ unsigned char i;
+ char buffer [ 50 ];
+
+ desty += 5; // a touch of spacing can't hurt
+
+ for ( i = 1; i < 4; i++ ) {
+ sprintf ( buffer, "Application-%u.note-%u", ui_selected -> ref -> subapp_number, i );
+ n = pnd_conf_get_as_char ( ui_selected -> ovrh, buffer );
+
+ if ( n ) {
+ SDL_Surface *rtext;
+ SDL_Color tmpfontcolor = { font_rgba_r, font_rgba_g, font_rgba_b, font_rgba_a };
+ rtext = TTF_RenderText_Blended ( g_detailtext_font, n, tmpfontcolor );
+ src.x = 0;
+ src.y = 0;
+ src.w = rtext -> w < cell_width ? rtext -> w : cell_width;
+ src.h = rtext -> h;
+ dest -> x = cell_offset_x;
+ dest -> y = desty;
+ SDL_BlitSurface ( rtext, &src, sdl_realscreen, dest );
+ SDL_FreeSurface ( rtext );
+ dest++;
+ desty += rtext -> h;
+ }
+ } // for
+
+ } // r_detail -> notes
// preview pic
mm_cache_t *ic = cache_query_preview ( ui_selected -> ref -> unique_id );
dest++;
}
- } // selected?
+ } // r_detail && selected?
// extras
//
// battery
- if ( 1 ) {
+ if ( render_jobs_b & R_BG ) {
static int last_battlevel = 0;
static unsigned char batterylevel = 0;
char buffer [ 100 ];
// hints
if ( pnd_conf_get_as_char ( g_conf, "display.hintline" ) ) {
- char *buffer = pnd_conf_get_as_char ( g_conf, "display.hintline" );
+ char *buffer;
+ unsigned int hintx, hinty;
+ hintx = pnd_conf_get_as_int_d ( g_conf, "display.hint_x", 40 );
+ hinty = pnd_conf_get_as_int_d ( g_conf, "display.hint_y", 450 );
+ static unsigned int lastwidth = 3000;
+
+ if ( ui_selected && ui_selected -> ref -> info_filename ) {
+ buffer = "Documentation - hit Y";
+ } else {
+ buffer = pnd_conf_get_as_char ( g_conf, "display.hintline" );
+ }
+
SDL_Surface *rtext;
SDL_Color tmpfontcolor = { font_rgba_r, font_rgba_g, font_rgba_b, font_rgba_a };
rtext = TTF_RenderText_Blended ( g_grid_font, buffer, tmpfontcolor );
- dest -> x = pnd_conf_get_as_int_d ( g_conf, "display.hint_x", 40 );
- dest -> y = pnd_conf_get_as_int_d ( g_conf, "display.hint_y", 450 );
+
+ // clear bg
+ if ( ! ( render_jobs_b & R_BG ) ) {
+ src.x = hintx;
+ src.y = hinty;
+ src.w = lastwidth;
+ src.h = rtext -> h;
+ dest -> x = hintx;
+ dest -> y = hinty;
+ SDL_BlitSurface ( g_imagecache [ IMG_BACKGROUND_TABMASK ].i, &src, sdl_realscreen, dest );
+ dest++;
+ lastwidth = rtext -> w;
+ }
+
+ // now render text
+ dest -> x = hintx;
+ dest -> y = hinty;
SDL_BlitSurface ( rtext, NULL /* all */, sdl_realscreen, dest );
SDL_FreeSurface ( rtext );
dest++;
}
- // hints
- if ( pnd_conf_get_as_int_d ( g_conf, "display.clock_x", -1 ) != -1 ) {
+ // clock time
+ if ( render_jobs_b & R_BG &&
+ pnd_conf_get_as_int_d ( g_conf, "display.clock_x", -1 ) != -1 )
+ {
char buffer [ 50 ];
time_t t = time ( NULL );
}
// update all the rects and send it all to sdl
+ // - at this point, we could probably just do 1 rect, of the
+ // whole screen, and be faster :/
SDL_UpdateRects ( sdl_realscreen, dest - rects, rects );
} // ui_render
}
+ render_mask |= CHANGED_EVERYTHING;
+
break;
#if 0 // joystick motion
"Exit and run xfce4",
"Exit and run pmenu",
"Quit (<- beware)",
+ "Select a Minimenu skin",
"About Minimenu"
};
- int sel = ui_modal_single_menu ( opts, 9, "Minimenu", "Enter to select; other to return." );
+ int sel = ui_modal_single_menu ( opts, 11, "Minimenu", "Enter to select; other to return." );
char buffer [ 100 ];
if ( sel == 0 ) {
extern pnd_box_handle g_active_apps;
pnd_box_handle h = g_active_apps;
- unsigned char maxwidth, maxheight;
+ unsigned int maxwidth, maxheight;
maxwidth = pnd_conf_get_as_int_d ( g_conf, "previewpic.cell_width", 200 );
maxheight = pnd_conf_get_as_int_d ( g_conf, "previewpic.cell_height", 180 );
// set env to xfce
sprintf ( buffer, "echo startxfce4 > /tmp/gui.load" );
system ( buffer );
+ emit_and_quit ( buffer );
//sprintf ( buffer, "sudo poweroff" );
//system ( buffer );
exit ( 0 );
// set env to pmenu
sprintf ( buffer, "echo pmenu > /tmp/gui.load" );
system ( buffer );
+ emit_and_quit ( buffer );
//sprintf ( buffer, "sudo poweroff" );
//system ( buffer );
exit ( 0 );
} else if ( sel == 8 ) {
emit_and_quit ( MM_QUIT );
} else if ( sel == 9 ) {
+ // select skin
+ if ( ui_pick_skin() ) {
+ emit_and_quit ( MM_RESTART );
+ }
+ } else if ( sel == 10 ) {
// about
}
ui_event++;
+ render_mask |= CHANGED_EVERYTHING;
}
// extras
// what column we in?
unsigned int col = ui_determine_screen_col ( ui_selected );
- // are we alreadt at first item?
+ // are we already at first item?
if ( forcecoil == 0 &&
pnd_conf_get_as_int_d ( g_conf, "grid.wrap_horiz_samerow", 0 ) &&
col == 0 )
{
unsigned int i = pnd_conf_get_as_int_d ( g_conf, "grid.col_max", 5 ) - 1;
- while ( i ) {
+ while ( i && ui_selected -> next ) {
ui_push_right ( 0 );
i--;
}
// wrap same or no?
if ( forcecoil == 0 &&
pnd_conf_get_as_int_d ( g_conf, "grid.wrap_horiz_samerow", 0 ) &&
- col == pnd_conf_get_as_int_d ( g_conf, "grid.col_max", 5 ) - 1 )
+ // and selected is far-right, or last icon in category (might not be far right)
+ ( ( col == pnd_conf_get_as_int_d ( g_conf, "grid.col_max", 5 ) - 1 ) ||
+ ( ui_selected -> next == NULL ) )
+ )
{
// same wrap
- unsigned int i = pnd_conf_get_as_int_d ( g_conf, "grid.col_max", 5 ) - 1;
- while ( i ) {
+ //unsigned int i = pnd_conf_get_as_int_d ( g_conf, "grid.col_max", 5 ) - 1;
+ while ( col /*i*/ ) {
ui_push_left ( 0 );
- i--;
+ col--; //i--;
}
} else {
}
void ui_push_up ( void ) {
- unsigned char col_max = pnd_conf_get_as_int ( g_conf, MMENU_DISP_COLMAX );
+ unsigned char col_max = pnd_conf_get_as_int ( g_conf, "grid.col_max" );
if ( ! ui_selected ) {
return;
// scroll down to show it
int r = ui_determine_row ( ui_selected ) - 1;
- if ( r - pnd_conf_get_as_int ( g_conf, MMENU_DISP_ROWMAX ) > 0 ) {
+ if ( r - pnd_conf_get_as_int ( g_conf, "grid.row_max" ) > 0 ) {
ui_rows_scrolled_down = (unsigned int) r;
}
}
void ui_push_down ( void ) {
- unsigned char col_max = pnd_conf_get_as_int ( g_conf, MMENU_DISP_COLMAX );
+ unsigned char col_max = pnd_conf_get_as_int ( g_conf, "grid.col_max" );
if ( ui_selected ) {
ui_rows_scrolled_down = 0;
+ render_mask |= CHANGED_EVERYTHING;
+
} else {
while ( col_max ) {
void ui_push_exec ( void ) {
if ( ui_selected ) {
+ pnd_apps_exec_disco ( pnd_run_script, ui_selected -> ref, PND_EXEC_OPTION_NORUN, NULL );
char buffer [ PATH_MAX ];
- sprintf ( buffer, "%s/%s", ui_selected -> ref -> object_path, ui_selected -> ref -> object_filename );
- pnd_apps_exec ( pnd_run_script,
- buffer,
- ui_selected -> ref -> unique_id,
- ui_selected -> ref -> exec,
- ui_selected -> ref -> startdir,
- ui_selected -> ref -> execargs,
- atoi ( ui_selected -> ref -> clockspeed ),
- PND_EXEC_OPTION_NORUN );
sprintf ( buffer, "%s %s\n", MM_RUN, pnd_apps_exec_runline() );
emit_and_quit ( buffer );
}
// unscroll
ui_rows_scrolled_down = 0;
+ render_mask |= CHANGED_CATEGORY;
+
return;
}
// unscroll
ui_rows_scrolled_down = 0;
+ render_mask |= CHANGED_CATEGORY;
+
return;
}
static mm_appref_t *timer_ref = NULL;
void ui_set_selected ( mm_appref_t *r ) {
+ render_mask |= CHANGED_SELECTION;
+
if ( ! pnd_conf_get_as_int_d ( g_conf, "minimenu.load_previews_later", 0 ) ) {
return; // no desire to defer anything
}
ui_selected = t -> ref;
ui_push_exec();
} else {
+ if ( ui_category != t -> catnum ) {
+ ui_selected = NULL;
+ }
ui_category = t -> catnum;
+ render_mask |= CHANGED_CATEGORY;
}
break;
pnd_box_handle h = g_active_apps;
unsigned char maxwidth, maxheight;
- maxwidth = pnd_conf_get_as_int_d ( g_conf, MMENU_DISP_ICON_MAX_WIDTH, 50 );
- maxheight = pnd_conf_get_as_int_d ( g_conf, MMENU_DISP_ICON_MAX_HEIGHT, 50 );
+ maxwidth = pnd_conf_get_as_int_d ( g_conf, "grid.icon_max_width", 50 );
+ maxheight = pnd_conf_get_as_int_d ( g_conf, "grid.icon_max_height", 50 );
pnd_disco_t *iter = pnd_box_get_head ( h );
return;
}
+
+unsigned char ui_pick_skin ( void ) {
+#define MAXSKINS 10
+ char *skins [ MAXSKINS ];
+ unsigned char iter;
+
+ char *searchpath = pnd_conf_get_as_char ( g_conf, "minimenu.skin_searchpath" );
+ char tempname [ 100 ];
+
+ iter = 0;
+
+ skins [ iter++ ] = "No skin change";
+
+ SEARCHPATH_PRE
+ {
+ DIR *d = opendir ( buffer );
+
+ if ( d ) {
+ struct dirent *dd;
+
+ while ( ( dd = readdir ( d ) ) ) {
+
+ if ( dd -> d_name [ 0 ] == '.' ) {
+ // ignore
+ } else if ( ( dd -> d_type == DT_DIR || dd -> d_type == DT_UNKNOWN ) &&
+ iter < MAXSKINS )
+ {
+ snprintf ( tempname, 100, "Skin: %s", dd -> d_name );
+ skins [ iter++ ] = strdup ( tempname );
+ }
+
+ }
+
+ closedir ( d );
+ }
+
+ }
+ SEARCHPATH_POST
+
+ int sel = ui_modal_single_menu ( skins, iter, "Skins", "Enter to select; other to return." );
+
+ // did they pick one?
+ if ( sel > 0 ) {
+ FILE *f;
+
+ char *s = strdup ( pnd_conf_get_as_char ( g_conf, "minimenu.skin_selected" ) );
+ s = pnd_expand_tilde ( s );
+
+ f = fopen ( s, "w" );
+
+ free ( s );
+
+ if ( f ) {
+ fprintf ( f, "%s\n", skins [ sel ] + 6 );
+ fclose ( f );
+ }
+
+ return ( 1 );
+ }
+
+ return ( 0 );
+}