#include "SDL_ttf.h"
#include "SDL_gfxPrimitives.h"
#include "SDL_rotozoom.h"
+#include "SDL_thread.h"
#include "pnd_conf.h"
#include "pnd_logger.h"
*/
SDL_Surface *sdl_realscreen = NULL;
unsigned int sdl_ticks = 0;
+SDL_Thread *g_preview_thread = NULL;
+
+enum { sdl_user_ticker = 0,
+ sdl_user_finishedpreview = 1,
+ sdl_user_finishedicon = 2,
+};
/* app state
*/
{ IMG_SELECTED_ALPHAMASK, "graphics.IMG_SELECTED_ALPHAMASK" },
{ IMG_TAB_SEL, "graphics.IMG_TAB_SEL" },
{ IMG_TAB_UNSEL, "graphics.IMG_TAB_UNSEL" },
+ { IMG_TAB_LINE, "graphics.IMG_TAB_LINE" },
+ { IMG_TAB_LINEL, "graphics.IMG_TAB_LINEL" },
+ { IMG_TAB_LINER, "graphics.IMG_TAB_LINER" },
{ IMG_ICON_MISSING, "graphics.IMG_ICON_MISSING" },
{ IMG_SELECTED_HILITE, "graphics.IMG_SELECTED_HILITE" },
{ IMG_PREVIEW_MISSING, "graphics.IMG_PREVIEW_MISSING" },
unsigned int icon_offset_x = pnd_conf_get_as_int ( g_conf, "grid.icon_offset_x" );
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 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" );
if ( g_imagecache [ IMG_TAB_SEL ].i && g_imagecache [ IMG_TAB_UNSEL ].i ) {
unsigned int tab_width = pnd_conf_get_as_int ( g_conf, "tabs.tab_width" );
unsigned int tab_height = pnd_conf_get_as_int ( g_conf, "tabs.tab_height" );
+ unsigned int tab_selheight = pnd_conf_get_as_int ( g_conf, "tabs.tab_selheight" );
unsigned int tab_offset_x = pnd_conf_get_as_int ( g_conf, "tabs.tab_offset_x" );
unsigned int tab_offset_y = pnd_conf_get_as_int ( g_conf, "tabs.tab_offset_y" );
unsigned int text_offset_x = pnd_conf_get_as_int ( g_conf, "tabs.text_offset_x" );
unsigned int text_offset_y = pnd_conf_get_as_int ( g_conf, "tabs.text_offset_y" );
unsigned int text_width = pnd_conf_get_as_int ( g_conf, "tabs.text_width" );
+ unsigned int maxtab = ( screen_width / tab_width ) < g_categorycount ? ( screen_width / tab_width ) + ui_catshift : g_categorycount + ui_catshift;
+ // draw tabs with categories
for ( col = ui_catshift;
- col < (
- ( screen_width / tab_width ) < g_categorycount ? ( screen_width / tab_width ) + ui_catshift : g_categorycount + ui_catshift
- );
+ col < maxtab;
col++ )
{
src.x = 0;
src.y = 0;
src.w = tab_width;
- src.h = tab_height;
+ if ( col == ui_category ) {
+ src.h = tab_selheight;
+ } else {
+ src.h = tab_height;
+ }
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 );
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 == maxtab - 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 };
} // for
+ // draw tab lines under where tabs would be if we had categories
+ maxtab = ( screen_width / tab_width );
+ for ( /* foo */; col < maxtab; col++ ) {
+ SDL_Surface *s;
+
+ if ( col - ui_catshift == 0 ) {
+ s = g_imagecache [ IMG_TAB_LINEL ].i;
+ } else if ( col - ui_catshift == maxtab - 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
+
} // tabs
// scroll bars and arrows
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;
+ dest -> y = grid_offset_y + ( displayrow * cell_height ) + icon_offset_y + (( icon_max_height - iconsurface -> h ) / 2);
SDL_BlitSurface ( iconsurface, &src, sdl_realscreen, dest );
desty += src.h;
}
+ // show sub-app# on right side of cpu clock?
+ //if ( ui_selected -> ref -> subapp_number )
+ {
+ sprintf ( buffer, "(app#%u)", ui_selected -> ref -> subapp_number );
+
+ 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 = cell_offset_x + cell_width - rtext -> w;
+ dest -> y = desty - src.h;
+ SDL_BlitSurface ( rtext, NULL /* full src */, sdl_realscreen, dest );
+ SDL_FreeSurface ( rtext );
+ dest++;
+ }
+
// info hint
if ( ui_selected -> ref -> clockspeed && ui_selected -> ref -> info_filename ) {
case SDL_USEREVENT:
// update something
- if ( pnd_conf_get_as_int_d ( g_conf, "minimenu.load_previews_later", 0 ) ) {
+ if ( event.user.code == sdl_user_ticker ) {
+
+ // timer went off, time to load something
+ if ( pnd_conf_get_as_int_d ( g_conf, "minimenu.load_previews_later", 0 ) ) {
+
+ pnd_log ( pndn_debug, "Deferred preview pic load ----------\n" );
+
+ // load the preview pics now!
+ pnd_disco_t *iter = ui_selected -> ref;
+
+ if ( iter -> preview_pic1 ) {
+
+ if ( pnd_conf_get_as_int_d ( g_conf, "minimenu.threaded_preview", 0 ) ) {
+
+ g_preview_thread = SDL_CreateThread ( (void*)ui_threaded_defered_preview, iter );
+
+ if ( ! g_preview_thread ) {
+ pnd_log ( pndn_error, "ERROR: Couldn't create preview thread\n" );
+ }
+
+ } else {
+
+ if ( ! cache_preview ( iter, pnd_conf_get_as_int_d ( g_conf, "previewpic.cell_width", 200 ),
+ pnd_conf_get_as_int_d ( g_conf, "previewpic.cell_height", 180 ) )
+ )
+ {
+ pnd_log ( pndn_debug, " Couldn't load preview pic: '%s' -> '%s'\n",
+ IFNULL(iter->title_en,"No Name"), iter -> preview_pic1 );
+ }
+
+ } // threaded?
- pnd_log ( pndn_debug, "Deferred preview pic load ----------\n" );
+ } // got a preview at all?
- // load the preview pics now!
- pnd_disco_t *iter = ui_selected -> ref;
+ pnd_log ( pndn_debug, "Deferred preview pic load finish ---\n" );
- if ( iter -> preview_pic1 &&
- ! cache_preview ( iter, pnd_conf_get_as_int_d ( g_conf, "previewpic.cell_width", 200 ), pnd_conf_get_as_int_d ( g_conf, "previewpic.cell_height", 180 ) ) )
- {
- pnd_log ( pndn_debug, " Couldn't load preview pic: '%s' -> '%s'\n", IFNULL(iter->title_en,"No Name"), iter -> preview_pic1 );
+ ui_event++;
}
- pnd_log ( pndn_debug, "Deferred preview pic load finish ---\n" );
+ } else if ( event.user.code == sdl_user_finishedpreview ) {
+ // if we just finished the one we happen to be looking at, better redraw now; otherwise, if
+ // we finished another, no big woop
+ if ( ui_selected && event.user.data1 == ui_selected -> ref ) {
+ ui_event++;
+ }
+
+ } else if ( event.user.code == sdl_user_finishedicon ) {
+ // redraw, so we can show the newly loaded icon
ui_event++;
+
}
break;
SDL_Rect rects [ 4 ];
SDL_Rect *dest = rects;
+ SDL_Rect src;
bzero ( dest, sizeof(SDL_Rect)* 4 );
unsigned int font_rgba_r = pnd_conf_get_as_int_d ( g_conf, "display.font_rgba_r", 200 );
dest++;
}
- }
+ } else {
+
+ // render background
+ if ( g_imagecache [ IMG_BACKGROUND_800480 ].i ) {
+ src.x = 0;
+ src.y = 0;
+ src.w = sdl_realscreen -> w;
+ src.h = 100;
+ dest -> x = 0;
+ dest -> y = 0;
+ dest -> w = sdl_realscreen -> w;
+ dest -> h = sdl_realscreen -> h;
+ SDL_BlitSurface ( g_imagecache [ IMG_BACKGROUND_800480 ].i, &src, sdl_realscreen, dest );
+ dest++;
+ }
+
+ } // clear it
// render text
SDL_Surface *rtext;
SDL_Color tmpfontcolor = { font_rgba_r, font_rgba_g, font_rgba_b, font_rgba_a };
rtext = TTF_RenderText_Blended ( g_big_font, "Caching applications artwork...", tmpfontcolor );
- if ( clearscreen ) {
- dest -> x = 20;
- dest -> y = 20;
- } else {
- dest -> x = 20;
- dest -> y = 40;
- }
+ dest -> x = 20;
+ dest -> y = 20;
SDL_BlitSurface ( rtext, NULL /* full src */, sdl_realscreen, dest );
SDL_FreeSurface ( rtext );
dest++;
}
SDL_Event e;
+ bzero ( &e, sizeof(SDL_Event) );
e.type = SDL_USEREVENT;
+ e.user.code = sdl_user_ticker;
SDL_PushEvent ( &e );
return ( 0 );
// parent, success
return ( 1 );
}
+
+unsigned char ui_threaded_defered_preview ( pnd_disco_t *p ) {
+
+ if ( ! cache_preview ( p, pnd_conf_get_as_int_d ( g_conf, "previewpic.cell_width", 200 ),
+ pnd_conf_get_as_int_d ( g_conf, "previewpic.cell_height", 180 ) )
+ )
+ {
+ pnd_log ( pndn_debug, "THREAD: Couldn't load preview pic: '%s' -> '%s'\n",
+ IFNULL(p->title_en,"No Name"), p -> preview_pic1 );
+ }
+
+ // trigger that we completed
+ SDL_Event e;
+ bzero ( &e, sizeof(SDL_Event) );
+ e.type = SDL_USEREVENT;
+ e.user.code = sdl_user_finishedpreview;
+ e.user.data1 = p;
+ SDL_PushEvent ( &e );
+
+ return ( 0 );
+}
+
+SDL_Thread *g_icon_thread = NULL;
+void ui_post_scan ( void ) {
+
+ // if deferred icon load, kick off the thread now
+ if ( pnd_conf_get_as_int_d ( g_conf, "minimenu.load_icons_later", 0 ) == 1 ) {
+
+ g_icon_thread = SDL_CreateThread ( (void*)ui_threaded_defered_icon, NULL );
+
+ if ( ! g_icon_thread ) {
+ pnd_log ( pndn_error, "ERROR: Couldn't create icon thread\n" );
+ }
+
+ } // deferred icon load
+
+ return;
+}
+
+unsigned char ui_threaded_defered_icon ( void *p ) {
+ extern pnd_box_handle g_active_apps;
+ 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 );
+
+ pnd_disco_t *iter = pnd_box_get_head ( h );
+
+ while ( iter ) {
+
+ // cache it
+ if ( iter -> pnd_icon_pos &&
+ ! cache_icon ( iter, maxwidth, maxheight ) )
+ {
+ pnd_log ( pndn_warning, " Couldn't load icon: '%s'\n", IFNULL(iter->title_en,"No Name") );
+ } else {
+
+ // trigger that we completed
+ SDL_Event e;
+ bzero ( &e, sizeof(SDL_Event) );
+ e.type = SDL_USEREVENT;
+ e.user.code = sdl_user_finishedicon;
+ SDL_PushEvent ( &e );
+
+ //pnd_log ( pndn_warning, " Finished deferred load icon: '%s'\n", IFNULL(iter->title_en,"No Name") );
+ usleep ( pnd_conf_get_as_int_d ( g_conf, "minimenu.defer_icon_us", 50000 ) );
+
+ }
+
+ // next
+ iter = pnd_box_get_next ( iter );
+ } // while
+
+ return ( 0 );
+}