summaryrefslogtreecommitdiff
path: root/apps/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins')
-rw-r--r--apps/plugins/viewer.c229
1 files changed, 115 insertions, 114 deletions
diff --git a/apps/plugins/viewer.c b/apps/plugins/viewer.c
index 18c6a36360..bdebbbe506 100644
--- a/apps/plugins/viewer.c
+++ b/apps/plugins/viewer.c
@@ -75,20 +75,24 @@ PLUGIN_HEADER
75 75
76/* Ondio keys */ 76/* Ondio keys */
77#elif CONFIG_KEYPAD == ONDIO_PAD 77#elif CONFIG_KEYPAD == ONDIO_PAD
78#define VIEWER_QUIT BUTTON_OFF
78#define VIEWER_PAGE_UP BUTTON_UP 79#define VIEWER_PAGE_UP BUTTON_UP
79#define VIEWER_PAGE_DOWN BUTTON_DOWN 80#define VIEWER_PAGE_DOWN BUTTON_DOWN
80#define VIEWER_SCREEN_LEFT BUTTON_LEFT 81#define VIEWER_SCREEN_LEFT BUTTON_LEFT
81#define VIEWER_SCREEN_RIGHT BUTTON_RIGHT 82#define VIEWER_SCREEN_RIGHT BUTTON_RIGHT
82#define VIEWER_MENU BUTTON_OFF 83#define VIEWER_MENU (BUTTON_MENU|BUTTON_REPEAT)
83#define VIEWER_AUTOSCROLL BUTTON_MENU 84#define VIEWER_AUTOSCROLL_PRE BUTTON_MENU
85#define VIEWER_AUTOSCROLL (BUTTON_MENU|BUTTON_REL)
84 86
85/* Player keys */ 87/* Player keys */
86#elif CONFIG_KEYPAD == PLAYER_PAD 88#elif CONFIG_KEYPAD == PLAYER_PAD
87#define VIEWER_QUIT BUTTON_STOP 89#define VIEWER_QUIT BUTTON_STOP
88#define VIEWER_PAGE_UP BUTTON_LEFT 90#define VIEWER_PAGE_UP BUTTON_LEFT
89#define VIEWER_PAGE_DOWN BUTTON_RIGHT 91#define VIEWER_PAGE_DOWN BUTTON_RIGHT
92#define VIEWER_SCREEN_LEFT (BUTTON_ON|BUTTON_LEFT)
93#define VIEWER_SCREEN_RIGHT (BUTTON_ON|BUTTON_RIGHT)
90#define VIEWER_MENU BUTTON_MENU 94#define VIEWER_MENU BUTTON_MENU
91#define VIEWER_AUTOSCROLL BUTTON_ON 95#define VIEWER_AUTOSCROLL BUTTON_PLAY
92 96
93/* iRiver H1x0 && H3x0 keys */ 97/* iRiver H1x0 && H3x0 keys */
94#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ 98#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
@@ -102,18 +106,20 @@ PLUGIN_HEADER
102#define VIEWER_AUTOSCROLL BUTTON_SELECT 106#define VIEWER_AUTOSCROLL BUTTON_SELECT
103#define VIEWER_LINE_UP (BUTTON_ON | BUTTON_UP) 107#define VIEWER_LINE_UP (BUTTON_ON | BUTTON_UP)
104#define VIEWER_LINE_DOWN (BUTTON_ON | BUTTON_DOWN) 108#define VIEWER_LINE_DOWN (BUTTON_ON | BUTTON_DOWN)
109#define VIEWER_COLUMN_LEFT (BUTTON_ON | BUTTON_LEFT)
110#define VIEWER_COLUMN_RIGHT (BUTTON_ON | BUTTON_RIGHT)
105 111
106/* iPods with the 4G pad */ 112/* iPods with the 4G pad */
107#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \ 113#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
108 (CONFIG_KEYPAD == IPOD_3G_PAD) 114 (CONFIG_KEYPAD == IPOD_3G_PAD)
109#define VIEWER_QUIT_PRE BUTTON_SELECT 115#define VIEWER_QUIT_PRE BUTTON_SELECT
110#define VIEWER_QUIT (BUTTON_SELECT | BUTTON_MENU) 116#define VIEWER_QUIT (BUTTON_SELECT | BUTTON_MENU)
111#define VIEWER_MENU BUTTON_MENU
112#define VIEWER_AUTOSCROLL BUTTON_PLAY
113#define VIEWER_PAGE_UP BUTTON_SCROLL_BACK 117#define VIEWER_PAGE_UP BUTTON_SCROLL_BACK
114#define VIEWER_PAGE_DOWN BUTTON_SCROLL_FWD 118#define VIEWER_PAGE_DOWN BUTTON_SCROLL_FWD
115#define VIEWER_SCREEN_LEFT BUTTON_LEFT 119#define VIEWER_SCREEN_LEFT BUTTON_LEFT
116#define VIEWER_SCREEN_RIGHT BUTTON_RIGHT 120#define VIEWER_SCREEN_RIGHT BUTTON_RIGHT
121#define VIEWER_MENU BUTTON_MENU
122#define VIEWER_AUTOSCROLL BUTTON_PLAY
117 123
118/* iFP7xx keys */ 124/* iFP7xx keys */
119#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD 125#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
@@ -151,48 +157,36 @@ struct preferences {
151 enum { 157 enum {
152 WRAP=0, 158 WRAP=0,
153 CHOP, 159 CHOP,
154 WORD_MODES
155 } word_mode; 160 } word_mode;
156 161
157 enum { 162 enum {
158 NORMAL=0, 163 NORMAL=0,
159 JOIN, 164 JOIN,
160#ifdef HAVE_LCD_BITMAP
161 REFLOW, /* Makes no sense for the player */
162#endif
163 EXPAND, 165 EXPAND,
164 LINE_MODES, 166 REFLOW, /* won't be set on charcell LCD, must be last */
165#ifndef HAVE_LCD_BITMAP
166 REFLOW /* Sorting it behind LINE_MODES effectively disables it. */
167#endif
168 } line_mode; 167 } line_mode;
169 168
170 enum { 169 enum {
171 NARROW=0, 170 NARROW=0,
172 WIDE, 171 WIDE,
173 VIEW_MODES
174 } view_mode; 172 } view_mode;
175 173
176#ifdef HAVE_LCD_BITMAP 174#ifdef HAVE_LCD_BITMAP
177 enum { 175 enum {
178 SB_OFF=0, 176 SB_OFF=0,
179 SB_ON, 177 SB_ON,
180 SCROLLBAR_MODES
181 } scrollbar_mode; 178 } scrollbar_mode;
182 bool need_scrollbar; 179 bool need_scrollbar;
183 180
184 enum { 181 enum {
185 NO_OVERLAP=0, 182 NO_OVERLAP=0,
186 OVERLAP, 183 OVERLAP,
187 PAGE_MODES
188 } page_mode; 184 } page_mode;
189
190#endif /* HAVE_LCD_BITMAP */ 185#endif /* HAVE_LCD_BITMAP */
191 186
192 enum { 187 enum {
193 PAGE=0, 188 PAGE=0,
194 LINE, 189 LINE,
195 SCROLL_MODES
196 } scroll_mode; 190 } scroll_mode;
197 191
198 int autoscroll_speed; 192 int autoscroll_speed;
@@ -816,7 +810,6 @@ static void viewer_top(void)
816 fill_buffer(0, buffer, BUFFER_SIZE); 810 fill_buffer(0, buffer, BUFFER_SIZE);
817} 811}
818 812
819#ifdef HAVE_LCD_BITMAP
820static void viewer_bottom(void) 813static void viewer_bottom(void)
821{ 814{
822 /* Read bottom of file into buffer 815 /* Read bottom of file into buffer
@@ -838,6 +831,7 @@ static void viewer_bottom(void)
838 fill_buffer(last_sectors, buffer, BUFFER_SIZE); 831 fill_buffer(last_sectors, buffer, BUFFER_SIZE);
839} 832}
840 833
834#ifdef HAVE_LCD_BITMAP
841static void init_need_scrollbar(void) { 835static void init_need_scrollbar(void) {
842 /* Call viewer_draw in quiet mode to initialize next_screen_ptr, 836 /* Call viewer_draw in quiet mode to initialize next_screen_ptr,
843 and thus ONE_SCREEN_FITS_ALL(), and thus NEED_SCROLLBAR() */ 837 and thus ONE_SCREEN_FITS_ALL(), and thus NEED_SCROLLBAR() */
@@ -911,6 +905,7 @@ static void viewer_reset_settings(void)
911 prefs.page_mode = NO_OVERLAP; 905 prefs.page_mode = NO_OVERLAP;
912 prefs.scrollbar_mode = SB_OFF; 906 prefs.scrollbar_mode = SB_OFF;
913#endif 907#endif
908 prefs.autoscroll_speed = 1;
914} 909}
915 910
916static void viewer_load_settings(void) /* same name as global, but not the same file.. */ 911static void viewer_load_settings(void) /* same name as global, but not the same file.. */
@@ -963,7 +958,6 @@ static void viewer_exit(void *parameter)
963 rb->close(fd); 958 rb->close(fd);
964} 959}
965 960
966#ifdef HAVE_LCD_BITMAP
967static int col_limit(int col) 961static int col_limit(int col)
968{ 962{
969 if (col < 0) 963 if (col < 0)
@@ -974,114 +968,120 @@ static int col_limit(int col)
974 968
975 return col; 969 return col;
976} 970}
977#endif
978 971
979static void change_options_menu(void) 972/* settings helper functions */
980{
981 int m, result;
982 bool done = false;
983 973
984 static const struct menu_item items[] = { 974static bool word_wrap_setting(void)
985 {"Word Wrap", NULL }, 975{
986 {"Line Mode", NULL }, 976 static const struct opt_items names[] = {
987 {"Wide View", NULL }, 977 {"On", NULL},
988 {"Overlap Pages", NULL }, 978 {"Off (Chop Words)", NULL},
989 {"Scroll Mode", NULL},
990#ifdef HAVE_LCD_BITMAP
991 {"Show Scrollbar", NULL },
992#endif
993 {"Auto-Scroll Speed", NULL },
994 };
995 static const struct opt_items opt_word_mode[2] = {
996 {"On",NULL},{"Off (Chop Words)",NULL},
997 }; 979 };
980
981 return rb->set_option("Word Wrap", &prefs.word_mode, INT,
982 names, 2, NULL);
983}
984
985static bool line_mode_setting(void)
986{
987 static const struct opt_items names[] = {
988 {"Normal", NULL},
989 {"Join Lines", NULL},
990 {"Expand Lines", NULL},
998#ifdef HAVE_LCD_BITMAP 991#ifdef HAVE_LCD_BITMAP
999 static const struct opt_items opt_line_mode[4] = { 992 {"Reflow Lines", NULL},
1000 {"Normal",NULL},{"Join Lines",NULL},
1001 {"Reflow Lines",NULL},{"Expand Lines",NULL},
1002#else
1003 static const struct opt_items opt_line_mode[3] = {
1004 {"Normal",NULL},{"Join Lines",NULL},
1005 {"Expand Lines",NULL},
1006#endif 993#endif
1007 }; 994 };
1008 static const struct opt_items opt_view_mode[2] = { 995
1009 {"No (Narrow)",NULL},{"Yes",NULL} 996 return rb->set_option("Line Mode", &prefs.line_mode, INT, names,
997 sizeof(names) / sizeof(names[0]), NULL);
998}
999
1000static bool view_mode_setting(void)
1001{
1002 static const struct opt_items names[] = {
1003 {"No (Narrow)", NULL},
1004 {"Yes", NULL},
1010 }; 1005 };
1011 static const struct opt_items opt_scroll_mode[2] = { 1006
1012 {"Scroll by Page",NULL},{"Scroll by Line",NULL} 1007 return rb->set_option("Wide View", &prefs.view_mode, INT,
1008 names , 2, NULL);
1009}
1010
1011static bool scroll_mode_setting(void)
1012{
1013 static const struct opt_items names[] = {
1014 {"Scroll by Page", NULL},
1015 {"Scroll by Line", NULL},
1013 }; 1016 };
1017
1018 return rb->set_option("Scroll Mode", &prefs.scroll_mode, INT,
1019 names, 2, NULL);
1020}
1021
1014#ifdef HAVE_LCD_BITMAP 1022#ifdef HAVE_LCD_BITMAP
1015 static const struct opt_items opt_scrollbar_mode[2] = { 1023static bool page_mode_setting(void)
1016 {"Off",NULL},{"On",NULL} 1024{
1025 static const struct opt_items names[] = {
1026 {"No", NULL},
1027 {"Yes", NULL},
1017 }; 1028 };
1018 static const struct opt_items opt_page_mode[2] = { 1029
1019 {"No",NULL},{"Yes",NULL} 1030 return rb->set_option("Overlap Pages", &prefs.page_mode, INT,
1031 names, 2, NULL);
1032}
1033
1034static bool scrollbar_setting(void)
1035{
1036 static const struct opt_items names[] = {
1037 {"Off", NULL},
1038 {"On", NULL}
1020 }; 1039 };
1040
1041 return rb->set_option("Show Scrollbar", &prefs.scrollbar_mode, INT,
1042 names, 2, NULL);
1043}
1021#endif 1044#endif
1022 static const struct opt_items opt_autoscroll_speed[10] = {
1023 { "1", NULL },{ "2", NULL },{ "3", NULL },{ "4", NULL },{ "5", NULL },
1024 { "6", NULL },{ "7", NULL },{ "8", NULL },{ "9", NULL },{ "10", NULL }
1025 };
1026 m = rb->menu_init(items, sizeof(items) / sizeof(*items),
1027 NULL, NULL, NULL, NULL);
1028 1045
1029 while(!done) 1046static bool autoscroll_speed_setting(void)
1030 { 1047{
1031 result=rb->menu_show(m); 1048 return rb->set_int("Auto-scroll Speed", "", UNIT_INT,
1032 switch (result) 1049 &prefs.autoscroll_speed, NULL, 1, 1, 10, NULL);
1033 { 1050}
1034 case MENU_SELECTED_EXIT:
1035 done = true;
1036 break;
1037 1051
1038 case 0: /* word mode */ 1052static bool viewer_options_menu(void)
1039 rb->set_option("Word Wrap", &prefs.word_mode, INT, 1053{
1040 opt_word_mode , 2, NULL); 1054 int m;
1041 break; 1055 bool result;
1042 case 1: /* line mode */ 1056
1043 rb->set_option("Line Mode", &prefs.line_mode, INT, opt_line_mode, 1057 static const struct menu_item items[] = {
1044 sizeof(opt_line_mode) / sizeof(*opt_line_mode), NULL); 1058 {"Word Wrap", word_wrap_setting },
1045 break; 1059 {"Line Mode", line_mode_setting },
1046 case 2: /* view mode */ 1060 {"Wide View", view_mode_setting },
1047 rb->set_option("Wide View", &prefs.view_mode, INT,
1048 opt_view_mode , 2, NULL);
1049 break;
1050#ifdef HAVE_LCD_BITMAP 1061#ifdef HAVE_LCD_BITMAP
1051 case 3: 1062 {"Show Scrollbar", scrollbar_setting },
1052 rb->set_option("Overlap Pages", &prefs.page_mode, INT, 1063 {"Overlap Pages", page_mode_setting },
1053 opt_page_mode , 2, NULL);
1054 break;
1055#endif 1064#endif
1056 case 4: 1065 {"Scroll Mode", scroll_mode_setting},
1057 rb->set_option("Scroll Mode", &prefs.scroll_mode, INT, 1066 {"Auto-Scroll Speed", autoscroll_speed_setting },
1058 opt_scroll_mode , 2, NULL); 1067 };
1059 break; 1068 m = rb->menu_init(items, sizeof(items) / sizeof(*items),
1060 #ifdef HAVE_LCD_BITMAP 1069 NULL, NULL, NULL, NULL);
1061 case 5: 1070
1062 rb->set_option("Show Scrollbar", &prefs.scrollbar_mode, INT, 1071 result = rb->menu_run(m);
1063 opt_scrollbar_mode , 2, NULL);
1064 /* Show-scrollbar mode for current view-width mode */
1065 if (!(ONE_SCREEN_FITS_ALL())) {
1066 if (prefs.scrollbar_mode == true)
1067 init_need_scrollbar();
1068 }
1069 break;
1070 #endif
1071 case 6:
1072 rb->set_option("Auto-Scroll Speed", &prefs.autoscroll_speed, INT,
1073 opt_autoscroll_speed, sizeof(opt_autoscroll_speed) /
1074 sizeof(*opt_autoscroll_speed), NULL);
1075 break;
1076 } /* switch() */
1077 }
1078 rb->menu_exit(m); 1072 rb->menu_exit(m);
1079#ifdef HAVE_LCD_BITMAP 1073#ifdef HAVE_LCD_BITMAP
1080 rb->lcd_setmargins(0,0); 1074 rb->lcd_setmargins(0,0);
1075
1076 /* Show-scrollbar mode for current view-width mode */
1077 if (!ONE_SCREEN_FITS_ALL())
1078 if (prefs.scrollbar_mode == true)
1079 init_need_scrollbar();
1081#endif 1080#endif
1081 return result;
1082} 1082}
1083 1083
1084static void show_menu(void) 1084static void viewer_menu(void)
1085{ 1085{
1086 int m; 1086 int m;
1087 int result; 1087 int result;
@@ -1103,7 +1103,7 @@ static void show_menu(void)
1103 done = true; 1103 done = true;
1104 break; 1104 break;
1105 case 1: /* change settings */ 1105 case 1: /* change settings */
1106 change_options_menu(); 1106 done = viewer_options_menu();
1107 break; 1107 break;
1108 case 2: /* playback control */ 1108 case 2: /* playback control */
1109 playback_control(rb); 1109 playback_control(rb);
@@ -1121,6 +1121,7 @@ static void show_menu(void)
1121enum plugin_status plugin_start(struct plugin_api* api, void* file) 1121enum plugin_status plugin_start(struct plugin_api* api, void* file)
1122{ 1122{
1123 int button, i, ok; 1123 int button, i, ok;
1124 int lastbutton = BUTTON_NONE;
1124 bool autoscroll = false; 1125 bool autoscroll = false;
1125 int old_tick = *rb->current_tick; 1126 int old_tick = *rb->current_tick;
1126 1127
@@ -1157,10 +1158,14 @@ enum plugin_status plugin_start(struct plugin_api* api, void* file)
1157 button = rb->button_get_w_tmo(HZ/10); 1158 button = rb->button_get_w_tmo(HZ/10);
1158 switch (button) { 1159 switch (button) {
1159 case VIEWER_MENU: 1160 case VIEWER_MENU:
1160 show_menu(); 1161 viewer_menu();
1161 break; 1162 break;
1162 1163
1163 case VIEWER_AUTOSCROLL: 1164 case VIEWER_AUTOSCROLL:
1165#ifdef VIEWER_AUTOSCROLL_PRE
1166 if (lastbutton != VIEWER_AUTOSCROLL_PRE)
1167 break;
1168#endif
1164 autoscroll = !autoscroll; 1169 autoscroll = !autoscroll;
1165 break; 1170 break;
1166 1171
@@ -1196,7 +1201,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* file)
1196 viewer_draw(col); 1201 viewer_draw(col);
1197 break; 1202 break;
1198 1203
1199#ifdef VIEWER_SCREEN_LEFT
1200 case VIEWER_SCREEN_LEFT: 1204 case VIEWER_SCREEN_LEFT:
1201 case VIEWER_SCREEN_LEFT | BUTTON_REPEAT: 1205 case VIEWER_SCREEN_LEFT | BUTTON_REPEAT:
1202 if (prefs.view_mode == WIDE) { 1206 if (prefs.view_mode == WIDE) {
@@ -1211,9 +1215,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* file)
1211 1215
1212 viewer_draw(col); 1216 viewer_draw(col);
1213 break; 1217 break;
1214#endif
1215 1218
1216#ifdef VIEWER_SCREEN_LEFT
1217 case VIEWER_SCREEN_RIGHT: 1219 case VIEWER_SCREEN_RIGHT:
1218 case VIEWER_SCREEN_RIGHT | BUTTON_REPEAT: 1220 case VIEWER_SCREEN_RIGHT | BUTTON_REPEAT:
1219 if (prefs.view_mode == WIDE) { 1221 if (prefs.view_mode == WIDE) {
@@ -1228,7 +1230,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* file)
1228 1230
1229 viewer_draw(col); 1231 viewer_draw(col);
1230 break; 1232 break;
1231#endif
1232 1233
1233#ifdef VIEWER_LINE_UP 1234#ifdef VIEWER_LINE_UP
1234 case VIEWER_LINE_UP: 1235 case VIEWER_LINE_UP:
@@ -1266,12 +1267,10 @@ enum plugin_status plugin_start(struct plugin_api* api, void* file)
1266 break; 1267 break;
1267#endif 1268#endif
1268 1269
1269#ifdef VIEWER_QUIT
1270 case VIEWER_QUIT: 1270 case VIEWER_QUIT:
1271 viewer_exit(NULL); 1271 viewer_exit(NULL);
1272 done = true; 1272 done = true;
1273 break; 1273 break;
1274#endif
1275 1274
1276 default: 1275 default:
1277 if (rb->default_event_handler_ex(button, viewer_exit, NULL) 1276 if (rb->default_event_handler_ex(button, viewer_exit, NULL)
@@ -1279,6 +1278,8 @@ enum plugin_status plugin_start(struct plugin_api* api, void* file)
1279 return PLUGIN_USB_CONNECTED; 1278 return PLUGIN_USB_CONNECTED;
1280 break; 1279 break;
1281 } 1280 }
1281 if (button != BUTTON_NONE)
1282 lastbutton = button;
1282 } 1283 }
1283 return PLUGIN_OK; 1284 return PLUGIN_OK;
1284} 1285}