summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorKevin Ferrare <kevin@rockbox.org>2005-10-29 02:33:19 +0000
committerKevin Ferrare <kevin@rockbox.org>2005-10-29 02:33:19 +0000
commite75cbdd2a84904e9294091c0ae599762b067077a (patch)
tree96ebdd8d8a9cbe2495c896e489a9f413bc0ffd1f /apps
parentdff9352430cfbcb8f3be5e26ccd752c7cdddf1e2 (diff)
downloadrockbox-e75cbdd2a84904e9294091c0ae599762b067077a.tar.gz
rockbox-e75cbdd2a84904e9294091c0ae599762b067077a.tar.bz2
rockbox-e75cbdd2a84904e9294091c0ae599762b067077a.zip
Some changes to the remote code : some one lines function turned into macros ; changed pre-increment to post-increment since it's clearer that way ; added a data pointer to the list callback (global variables are baaaad) ; some more documentation of the API and minor cleanups
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7681 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r--apps/gui/icon.h4
-rw-r--r--apps/gui/list.c84
-rw-r--r--apps/gui/list.h69
-rw-r--r--apps/gui/statusbar.c8
-rw-r--r--apps/gui/statusbar.h4
-rw-r--r--apps/screen_access.c18
-rw-r--r--apps/screen_access.h18
-rw-r--r--apps/tree.c23
8 files changed, 130 insertions, 98 deletions
diff --git a/apps/gui/icon.h b/apps/gui/icon.h
index 119ee3cc47..8fe7262ffe 100644
--- a/apps/gui/icon.h
+++ b/apps/gui/icon.h
@@ -24,9 +24,9 @@
/* Defines a type for the icons since it's not the same thing on
* char-based displays and bitmap displays */
#ifdef HAVE_LCD_BITMAP
- #define ICON const unsigned char *
+ typedef const unsigned char * ICON;
#else
- #define ICON unsigned short
+ typedef unsigned short ICON;
#endif
#define CURSOR_CHAR 0x92
diff --git a/apps/gui/list.c b/apps/gui/list.c
index 1a83a65e64..ed26f1c9a8 100644
--- a/apps/gui/list.c
+++ b/apps/gui/list.c
@@ -39,8 +39,12 @@
void gui_list_init(struct gui_list * gui_list,
- void (*callback_get_item_icon)(int selected_item, ICON * icon),
- char * (*callback_get_item_name)(int selected_item, char *buffer))
+ void (*callback_get_item_icon)
+ (int selected_item, void * data, ICON * icon),
+ char * (*callback_get_item_name)
+ (int selected_item, void * data, char *buffer),
+ void * data
+ )
{
gui_list->callback_get_item_icon = callback_get_item_icon;
gui_list->callback_get_item_name = callback_get_item_name;
@@ -48,12 +52,8 @@ void gui_list_init(struct gui_list * gui_list,
gui_list_set_nb_items(gui_list, 0);
gui_list->selected_item = 0;
gui_list->start_item = 0;
- gui_list->limit_scroll=false;
-}
-
-inline void gui_list_set_nb_items(struct gui_list * gui_list, int nb_items)
-{
- gui_list->nb_items = nb_items;
+ gui_list->limit_scroll = false;
+ gui_list->data=data;
}
void gui_list_set_display(struct gui_list * gui_list, struct screen * display)
@@ -70,30 +70,25 @@ void gui_list_set_display(struct gui_list * gui_list, struct screen * display)
void gui_list_put_selection_in_screen(struct gui_list * gui_list,
bool put_from_end)
{
- struct screen * display = gui_list->display;
+ int nb_lines=gui_list->display->nb_lines;
if(put_from_end)
{
int list_end = gui_list->selected_item + SCROLL_LIMIT - 1;
if(list_end > gui_list->nb_items)
- list_end = gui_list->nb_items;
- gui_list->start_item = list_end - display->nb_lines;
+ list_end = nb_lines;
+ gui_list->start_item = list_end - nb_lines;
}
else
{
int list_start = gui_list->selected_item - SCROLL_LIMIT + 1;
- if(list_start + display->nb_lines > gui_list->nb_items)
- list_start = gui_list->nb_items - display->nb_lines;
+ if(list_start + nb_lines > gui_list->nb_items)
+ list_start = gui_list->nb_items - nb_lines;
gui_list->start_item = list_start;
}
if(gui_list->start_item < 0)
gui_list->start_item = 0;
}
-inline int gui_list_get_sel_pos(struct gui_list * gui_list)
-{
- return gui_list->selected_item;
-}
-
void gui_list_draw(struct gui_list * gui_list)
{
struct screen * display=gui_list->display;
@@ -117,13 +112,13 @@ void gui_list_draw(struct gui_list * gui_list)
text_pos = 0; /* here it's in pixels */
if(draw_scrollbar)
{
- ++cursor_pos;
- ++icon_pos;
+ cursor_pos++;
+ icon_pos++;
text_pos += SCROLLBAR_WIDTH;
}
if(!draw_cursor)
{
- --icon_pos;
+ icon_pos--;
}
else
text_pos += CURSOR_WIDTH;
@@ -165,6 +160,7 @@ void gui_list_draw(struct gui_list * gui_list)
if(current_item >= gui_list->nb_items)
break;
entry_name = gui_list->callback_get_item_name(current_item,
+ gui_list->data,
entry_buffer);
if(current_item == gui_list->selected_item)
{
@@ -193,7 +189,9 @@ void gui_list_draw(struct gui_list * gui_list)
if(draw_icons)
{
ICON icon;
- gui_list->callback_get_item_icon(current_item, &icon);
+ gui_list->callback_get_item_icon(current_item,
+ gui_list->data,
+ &icon);
screen_put_iconxy(display, icon_pos, i, icon);
}
}
@@ -234,7 +232,7 @@ void gui_list_select_next(struct gui_list * gui_list)
{
if(gui_list->limit_scroll)
return;
- ++gui_list->selected_item;
+ gui_list->selected_item++;
/* we have already reached the bottom of the list */
gui_list->selected_item = 0;
gui_list->start_item = 0;
@@ -242,14 +240,14 @@ void gui_list_select_next(struct gui_list * gui_list)
else
{
int nb_lines = gui_list->display->nb_lines;
- ++gui_list->selected_item;
+ gui_list->selected_item++;
item_pos = gui_list->selected_item - gui_list->start_item;
end_item = gui_list->start_item + nb_lines;
/* we start scrolling vertically when reaching the line
* (nb_lines-SCROLL_LIMIT)
* and when we are not in the last part of the list*/
if( item_pos > nb_lines-SCROLL_LIMIT && end_item < gui_list->nb_items )
- ++gui_list->start_item;
+ gui_list->start_item++;
}
}
@@ -262,7 +260,7 @@ void gui_list_select_previous(struct gui_list * gui_list)
{
if(gui_list->limit_scroll)
return;
- --gui_list->selected_item;
+ gui_list->selected_item--;
/* we have aleady reached the top of the list */
int start;
gui_list->selected_item = gui_list->nb_items-1;
@@ -274,10 +272,10 @@ void gui_list_select_previous(struct gui_list * gui_list)
}
else
{
- --gui_list->selected_item;
+ gui_list->selected_item--;
item_pos = gui_list->selected_item - gui_list->start_item;
if( item_pos < SCROLL_LIMIT-1 && gui_list->start_item > 0 )
- --gui_list->start_item;
+ gui_list->start_item--;
}
}
@@ -317,7 +315,7 @@ void gui_list_select_previous_page(struct gui_list * gui_list, int nb_lines)
void gui_list_add_item(struct gui_list * gui_list)
{
- ++gui_list->nb_items;
+ gui_list->nb_items++;
/* if only one item in the list, select it */
if(gui_list->nb_items == 1)
gui_list->selected_item = 0;
@@ -337,34 +335,35 @@ void gui_list_del_item(struct gui_list * gui_list)
{
/* Oops we are removing the selected item,
select the previous one */
- --gui_list->selected_item;
+ gui_list->selected_item--;
}
- --gui_list->nb_items;
+ gui_list->nb_items--;
/* scroll the list if needed */
if( (dist_start_from_end < nb_lines) && (gui_list->start_item != 0) )
- --gui_list->start_item;
+ gui_list->start_item--;
}
}
-inline void gui_list_limit_scroll(struct gui_list * gui_list, bool scroll)
-{
- gui_list->limit_scroll=scroll;
-}
/*
* Synchronized lists stuffs
*/
void gui_synclist_init(
struct gui_synclist * lists,
- void (*callback_get_item_icon)(int selected_item, ICON * icon),
- char * (*callback_get_item_name)(int selected_item, char *buffer)
+ void (*callback_get_item_icon)
+ (int selected_item, void * data, ICON * icon),
+ char * (*callback_get_item_name)
+ (int selected_item, void * data, char *buffer),
+ void * data
)
{
int i;
for(i = 0;i < NB_SCREENS;i++)
{
- gui_list_init(&(lists->gui_list[i]), callback_get_item_icon,
- callback_get_item_name);
+ gui_list_init(&(lists->gui_list[i]),
+ callback_get_item_icon,
+ callback_get_item_name,
+ data);
gui_list_set_display(&(lists->gui_list[i]), &(screens[i]));
}
}
@@ -378,11 +377,6 @@ void gui_synclist_set_nb_items(struct gui_synclist * lists, int nb_items)
}
}
-int gui_synclist_get_sel_pos(struct gui_synclist * lists)
-{
- return gui_list_get_sel_pos(&(lists->gui_list[0]));
-}
-
void gui_synclist_draw(struct gui_synclist * lists)
{
int i;
diff --git a/apps/gui/list.h b/apps/gui/list.h
index e47f260a1b..4472fadbf8 100644
--- a/apps/gui/list.h
+++ b/apps/gui/list.h
@@ -63,21 +63,50 @@
#define LIST_PGDN (BUTTON_ON | BUTTON_DOWN)
#endif
-
+/*
+ * The gui_list is based on callback functions, if you want the list
+ * to display something you have to provide it a function that
+ * tells it what to display.
+ * There are two callback function :
+ * one to get the text and one to get the icon
+ * Callback interface :
+ *
+ * Text callback
+ * - selected_item : an integer that tells the number of the item to display
+ * - data : a void pointer to the data you gave to the list when
+ * you initialized it
+ * - buffer : a buffer to put the resulting text on it
+ * (The content of the buffer may not be used by the list, we use
+ * the return value of the function in all cases to avoid filling
+ * a buffer when it's not necessary)
+ * Returns a pointer to a string that contains the text to display
+ *
+ * Icon callback
+ * - selected_item : an integer that tells the number of the item to display
+ * - data : a void pointer to the data you gave to the list when
+ * you initialized it
+ * - icon : a pointer to the icon, the value inside it is used to display
+ * the icon after the function returns.
+ * Note : we use the ICON type because the real type depends of the plateform
+ */
struct gui_list
{
int nb_items;
int selected_item;
int start_item; /* the item that is displayed at the top of the screen */
- void (*callback_get_item_icon)(int selected_item, ICON * icon);
- char * (*callback_get_item_name)(int selected_item, char *buffer);
+ void (*callback_get_item_icon)
+ (int selected_item, void * data, ICON * icon);
+ char * (*callback_get_item_name)
+ (int selected_item, void * data, char *buffer);
struct screen * display;
int line_scroll_limit;
/* defines wether the list should stop when reaching the top/bottom
* or should continue (by going to bottom/top) */
bool limit_scroll;
+ /* The data that will be passed to the callback function YOU implement */
+ void * data;
};
/*
@@ -89,9 +118,12 @@ struct gui_list
* to a given item number
*/
extern void gui_list_init(struct gui_list * gui_list,
- void (*callback_get_item_icon)(int selected_item, ICON * icon),
- char * (*callback_get_item_name)(int selected_item, char *buffer)
- );
+ void (*callback_get_item_icon)
+ (int selected_item, void * data, ICON * icon),
+ char * (*callback_get_item_name)
+ (int selected_item, void * data, char *buffer),
+ void * data
+ );
/*
* Sets the numbers of items the list can currently display
@@ -99,7 +131,8 @@ extern void gui_list_init(struct gui_list * gui_list,
* - gui_list : the list structure to initialize
* - nb_items : the numbers of items you want
*/
-extern inline void gui_list_set_nb_items(struct gui_list * gui_list, int nb_items);
+#define gui_list_set_nb_items(gui_list, nb) \
+ (gui_list)->nb_items = nb
/*
* Puts the selection in the screen
@@ -125,7 +158,8 @@ extern void gui_list_set_display(struct gui_list * gui_list,
* - gui_list : the list structure
* Returns the position
*/
-extern inline int gui_list_get_sel_pos(struct gui_list * gui_list);
+#define gui_list_get_sel_pos(gui_list) \
+ (gui_list)->selected_item
/*
* Selects an item in the list
@@ -190,7 +224,8 @@ extern void gui_list_del_item(struct gui_list * gui_list);
* - true : stops when reaching top/bottom
* - false : continues to go to bottom/top when reaching top/bottom
*/
-extern inline void gui_list_limit_scroll(struct gui_list * gui_list, bool scroll);
+#define gui_list_limit_scroll(gui_list, scroll) \
+ (gui_list)->limit_scroll=scroll
/*
* This part handles as many lists as there are connected screens
@@ -206,13 +241,21 @@ struct gui_synclist
struct gui_list gui_list[NB_SCREENS];
};
-extern void gui_synclist_init(struct gui_synclist * lists,
- void (*callback_get_item_icon)(int selected_item, ICON * icon),
- char * (*callback_get_item_name)(int selected_item, char *buffer)
- );
+extern void gui_synclist_init(
+ struct gui_synclist * lists,
+ void (*callback_get_item_icon)
+ (int selected_item, void * data, ICON * icon),
+ char * (*callback_get_item_name)
+ (int selected_item, void * data, char *buffer),
+ void * data
+ );
extern void gui_synclist_set_nb_items(struct gui_synclist * lists, int nb_items);
extern int gui_synclist_get_sel_pos(struct gui_synclist * lists);
+
+#define gui_synclist_get_sel_pos(lists) \
+ gui_list_get_sel_pos(&((lists)->gui_list[0]))
+
extern void gui_synclist_draw(struct gui_synclist * lists);
extern void gui_synclist_select_item(struct gui_synclist * lists,
int item_number);
diff --git a/apps/gui/statusbar.c b/apps/gui/statusbar.c
index 0e7210218e..0f24208d33 100644
--- a/apps/gui/statusbar.c
+++ b/apps/gui/statusbar.c
@@ -40,9 +40,7 @@
/* FIXME: should be removed from icon.h to avoid redefinition,
but still needed for compatibility with old system */
-#define STATUSBAR_X_POS 0
-#define STATUSBAR_Y_POS 0 /* MUST be a multiple of 8 */
-#define STATUSBAR_HEIGHT 8
+
#define STATUSBAR_BATTERY_X_POS 0
#define STATUSBAR_BATTERY_WIDTH 18
#define STATUSBAR_PLUG_X_POS STATUSBAR_X_POS + \
@@ -115,7 +113,7 @@ void gui_statusbar_draw(struct gui_statusbar * bar, bool force_redraw)
struct tm* tm; /* For Time */
#endif
-#ifndef HAVE_LCD_BITMAP
+#ifdef HAVE_LCD_CHARCELLS
(void)force_redraw; /* players always "redraw" */
#endif
@@ -259,7 +257,7 @@ void gui_statusbar_draw(struct gui_statusbar * bar, bool force_redraw)
}
-#ifndef HAVE_LCD_BITMAP
+#ifdef HAVE_LCD_CHARCELLS
if (bar->info.battlevel > -1)
display->icon(ICON_BATTERY, battery_state);
display->icon(ICON_BATTERY_1, bar->info.battlevel > 25);
diff --git a/apps/gui/statusbar.h b/apps/gui/statusbar.h
index d3acbec8e5..d80968ff5e 100644
--- a/apps/gui/statusbar.h
+++ b/apps/gui/statusbar.h
@@ -23,6 +23,10 @@
#include "config.h"
#include "status.h"
+#define STATUSBAR_X_POS 0
+#define STATUSBAR_Y_POS 0 /* MUST be a multiple of 8 */
+#define STATUSBAR_HEIGHT 8
+
struct status_info {
int battlevel;
int volume;
diff --git a/apps/screen_access.c b/apps/screen_access.c
index e56a75dcce..8656ee8ace 100644
--- a/apps/screen_access.c
+++ b/apps/screen_access.c
@@ -171,24 +171,6 @@ void screen_update_nblines(struct screen * screen)
}
-#ifdef HAVE_LCD_BITMAP
-int screen_get_text_y_start(struct screen * screen)
-{
- screen=0;/* Avoid warning, this parameter is here for api integrity */
- return(global_settings.statusbar?STATUSBAR_HEIGHT:0);
-}
-
-int screen_get_text_y_end(struct screen * screen)
-{
-#ifdef HAS_BUTTONBAR
- return( screen->height - (global_settings.buttonbar?BUTTONBAR_HEIGHT:0) );
-#else
- return( screen->height );
-#endif
-
-}
-#endif
-
void screen_access_init(void)
{
screen_init(&screens[0], SCREEN_MAIN);
diff --git a/apps/screen_access.h b/apps/screen_access.h
index b04cabff46..2113a38757 100644
--- a/apps/screen_access.h
+++ b/apps/screen_access.h
@@ -7,7 +7,7 @@
* \/ \/ \/ \/ \/
* $Id$
*
- * Copyright (C) 2005 by KÚvin FERRARE
+ * Copyright (C) 2005 by K´┐Żin FERRARE
*
* All files in this archive are subject to the GNU General Public License.
* See the file COPYING in the source tree root for full license agreement.
@@ -34,7 +34,7 @@ enum screen_type {
#define NB_SCREENS 1
#endif
-#ifndef HAVE_LCD_BITMAP
+#ifdef HAVE_LCD_CHARCELLS
#define MAX_LINES_ON_SCREEN 2
#endif
@@ -113,15 +113,23 @@ extern void screen_update_nblines(struct screen * screen);
* - screen : the screen structure
* Returns the number of pixels
*/
-extern int screen_get_text_y_start(struct screen * screen);
+#define screen_get_text_y_start(screen) \
+ (global_settings.statusbar?STATUSBAR_HEIGHT:0)
/*
* Compute the number of pixels below which text can't be displayed
* - screen : the screen structure
* Returns the number of pixels
*/
-extern int screen_get_text_y_end(struct screen * screen);
-#endif
+#ifdef HAS_BUTTONBAR
+#define screen_get_text_y_end(screen) \
+ ( (screen)->height - (global_settings.buttonbar?BUTTONBAR_HEIGHT:0) )
+#else
+#define screen_get_text_y_end(screen) \
+ ( (screen)->height )
+#endif /* HAS_BUTTONBAR */
+
+#endif /* HAVE_LCD_BITMAP */
/*
* Initializes the whole screen_access api
diff --git a/apps/tree.c b/apps/tree.c
index 33fb92259c..738b9fcf11 100644
--- a/apps/tree.c
+++ b/apps/tree.c
@@ -146,16 +146,18 @@ char * strip_extension(char * filename, char * buffer)
else
return(filename);
}
-char * tree_get_filename(int selected_item, char *buffer)
+char * tree_get_filename(int selected_item, void * data, char *buffer)
{
+ struct tree_context * local_tc=(struct tree_context *)data;
char *name;
int attr=0;
- bool id3db = *tc.dirfilter == SHOW_ID3DB;
+ bool id3db = *(local_tc->dirfilter) == SHOW_ID3DB;
+
if (id3db) {
- name = ((char**)tc.dircache)[selected_item * tc.dentry_size];
+ name = ((char**)local_tc->dircache)[selected_item * local_tc->dentry_size];
}
else {
- struct entry* dc = tc.dircache;
+ struct entry* dc = local_tc->dircache;
struct entry* e = &dc[selected_item];
name = e->name;
attr = e->attr;
@@ -163,8 +165,8 @@ char * tree_get_filename(int selected_item, char *buffer)
/* if any file filter is on, and if it's not a directory,
* strip the extension */
- if ( (*tc.dirfilter != SHOW_ID3DB) && !(attr & ATTR_DIRECTORY)
- && (*tc.dirfilter != SHOW_ALL) )
+ if ( (*(local_tc->dirfilter) != SHOW_ID3DB) && !(attr & ATTR_DIRECTORY)
+ && (*(local_tc->dirfilter) != SHOW_ALL) )
{
return(strip_extension(name, buffer));
}
@@ -172,14 +174,15 @@ char * tree_get_filename(int selected_item, char *buffer)
}
-void tree_get_fileicon(int selected_item, ICON * icon)
+void tree_get_fileicon(int selected_item, void * data, ICON * icon)
{
- bool id3db = *tc.dirfilter == SHOW_ID3DB;
+ struct tree_context * local_tc=(struct tree_context *)data;
+ bool id3db = *(local_tc->dirfilter) == SHOW_ID3DB;
if (id3db) {
*icon = db_get_icon(&tc);
}
else {
- struct entry* dc = tc.dircache;
+ struct entry* dc = local_tc->dircache;
struct entry* e = &dc[selected_item];
*icon = filetype_get_icon(e->attr);
}
@@ -224,7 +227,7 @@ void browse_root(void)
gui_buttonbar_set_display(&tree_buttonbar, &(screens[SCREEN_MAIN]) );
#endif
gui_syncstatusbar_init(&statusbars);
- gui_synclist_init(&tree_lists, &tree_get_fileicon, &tree_get_filename);
+ gui_synclist_init(&tree_lists, &tree_get_fileicon, &tree_get_filename, &tc);
#ifndef SIMULATOR
dirbrowse();
#else