summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/screens.c197
1 files changed, 148 insertions, 49 deletions
diff --git a/apps/screens.c b/apps/screens.c
index 6b0a05df89..bfc506d6b2 100644
--- a/apps/screens.c
+++ b/apps/screens.c
@@ -153,15 +153,138 @@ static int handle_usb_events(void)
153} 153}
154#endif 154#endif
155 155
156#define MODE_NAME_LEN 32 156#ifdef USB_NONE
157void usb_screen(void) 157void usb_screen(void)
158{ 158{
159#ifdef USB_NONE 159}
160 /* nothing here! */
161#else 160#else
161#define MODE_NAME_LEN 32
162
163struct usb_screen_vps_t
164{
165 struct viewport parent;
166#ifdef HAVE_LCD_BITMAP
167 struct viewport logo;
168#ifdef USB_ENABLE_HID
169 struct viewport title;
170#endif
171#endif
172};
173
174#ifdef HAVE_LCD_BITMAP
175static void usb_screen_fix_viewports(struct screen *screen,
176 struct usb_screen_vps_t *usb_screen_vps)
177{
178 int logo_width, logo_height;
179 struct viewport *parent = &usb_screen_vps->parent;
180 struct viewport *logo = &usb_screen_vps->logo;
181
182#ifdef HAVE_REMOTE_LCD
183 if (screen->screen_type == SCREEN_REMOTE)
184 {
185 logo_width = BMPWIDTH_remote_usblogo;
186 logo_height = BMPHEIGHT_remote_usblogo;
187 }
188 else
189#endif
190 {
191 logo_width = BMPWIDTH_usblogo;
192 logo_height = BMPHEIGHT_usblogo;
193 }
194
195 viewport_set_defaults(parent, screen->screen_type);
196 if (parent->width < logo_width || parent->height < logo_height)
197 viewport_set_fullscreen(parent, screen->screen_type);
198
199 *logo = *parent;
200 logo->x = parent->width - logo_width;
201 logo->y = (parent->height - logo_height) / 2;
202 logo->width = logo_width;
203 logo->height = logo_height;
204
205#ifdef USB_ENABLE_HID
206 struct viewport *title = &usb_screen_vps->title;
207 int char_height, nb_lines;
208
209 /* nb_lines only returns the number of fully visible lines, small screens
210 or really large fonts could cause problems with the calculation below.
211 */
212 nb_lines = viewport_get_nb_lines(parent);
213 if (nb_lines == 0)
214 nb_lines++;
215
216 char_height = parent->height/nb_lines;
217
218 *title = *parent;
219 title->y = logo->y + logo->height + char_height;
220#endif
221}
222#endif
223
224static void usb_screens_draw(struct usb_screen_vps_t *usb_screen_vps_ar)
225{
162 int i; 226 int i;
163 int usb_bars = VP_SB_ALLSCREENS; /* force statusbars */ 227 int usb_bars = VP_SB_ALLSCREENS; /* force statusbars */
228
229 FOR_NB_SCREENS(i)
230 {
231 struct screen *screen = &screens[i];
232
233 struct usb_screen_vps_t *usb_screen_vps = &usb_screen_vps_ar[i];
234 struct viewport *parent = &usb_screen_vps->parent;
235#ifdef HAVE_LCD_BITMAP
236 struct viewport *logo = &usb_screen_vps->logo;
237#endif
238
239 screen->set_viewport(parent);
240 screen->backdrop_show(BACKDROP_MAIN);
241 screen->backlight_on();
242 screen->clear_viewport();
243
244#ifdef HAVE_LCD_BITMAP
245 screen->set_viewport(logo);
246#ifdef HAVE_REMOTE_LCD
247 if (i == SCREEN_REMOTE)
248 {
249 screen->bitmap(remote_usblogo, 0, 0, logo->width,
250 logo->height);
251 }
252 else
253#endif
254 {
255 screen->transparent_bitmap(usblogo, 0, 0, logo->width,
256 logo->height);
257#ifdef USB_ENABLE_HID
258 screen->set_viewport(&usb_screen_vps->title);
259 usb_screen_vps->title.flags |= VP_FLAG_ALIGN_CENTER;
260 screen->puts_scroll(0, 0, str(keypad_mode_name_get()));
261#endif /* USB_ENABLE_HID */
262 }
263 screen->set_viewport(parent);
264
265#else /* HAVE_LCD_BITMAP */
266 screen->double_height(false);
267 screen->puts_scroll(0, 0, "[USB Mode]");
268 status_set_param(false);
269 status_set_audio(false);
270 status_set_usb(true);
271#endif /* HAVE_LCD_BITMAP */
272
273 screen->update_viewport();
274 screen->set_viewport(NULL);
275
276 /* force statusbar by ignoring the setting */
277 usb_bars |= VP_SB_IGNORE_SETTING(i);
278 }
279
280 viewportmanager_set_statusbar(usb_bars);
281}
282
283void usb_screen(void)
284{
285 int i;
164 int old_bars = viewportmanager_get_statusbar(); 286 int old_bars = viewportmanager_get_statusbar();
287 struct usb_screen_vps_t usb_screen_vps_ar[NB_SCREENS];
165#if defined HAVE_TOUCHSCREEN 288#if defined HAVE_TOUCHSCREEN
166 enum touchscreen_mode old_mode = touchscreen_get_mode(); 289 enum touchscreen_mode old_mode = touchscreen_get_mode();
167 290
@@ -178,55 +301,19 @@ void usb_screen(void)
178 usb_keypad_mode = global_settings.usb_keypad_mode; 301 usb_keypad_mode = global_settings.usb_keypad_mode;
179#endif 302#endif
180 303
181 while (1) 304 FOR_NB_SCREENS(i)
182 { 305 {
183 FOR_NB_SCREENS(i) 306 struct screen *screen = &screens[i];
184 {
185 struct screen *screen = &screens[i];
186 307
187 screen->backdrop_show(BACKDROP_MAIN); 308 screen->set_viewport(NULL);
188 screen->backlight_on();
189 screen->clear_display();
190#ifdef HAVE_REMOTE_LCD
191 if (i == SCREEN_REMOTE)
192 {
193 screen->bitmap(remote_usblogo,
194 (LCD_REMOTE_WIDTH-BMPWIDTH_remote_usblogo),
195 (LCD_REMOTE_HEIGHT-BMPHEIGHT_remote_usblogo)/2,
196 BMPWIDTH_remote_usblogo, BMPHEIGHT_remote_usblogo);
197 }
198 else
199#endif
200 {
201#ifdef HAVE_LCD_BITMAP 309#ifdef HAVE_LCD_BITMAP
202 screen->transparent_bitmap(usblogo, 310 usb_screen_fix_viewports(screen, &usb_screen_vps_ar[i]);
203 (LCD_WIDTH-BMPWIDTH_usblogo), 311#endif
204 (LCD_HEIGHT-BMPHEIGHT_usblogo)/2, 312 }
205 BMPWIDTH_usblogo, BMPHEIGHT_usblogo);
206#ifdef USB_ENABLE_HID
207 int w, h;
208
209 screen->getstringsize(str(keypad_mode_name_get()), &w, &h);
210 screen->putsxy((LCD_WIDTH - w) / 2, BMPHEIGHT_usblogo +
211 (LCD_HEIGHT - BMPHEIGHT_usblogo + h) / 2,
212 str(keypad_mode_name_get()));
213#endif /* USB_ENABLE_HID */
214#else /* HAVE_LCD_BITMAP */
215 screen->double_height(false);
216 screen->puts_scroll(0, 0, "[USB Mode]");
217 status_set_param(false);
218 status_set_audio(false);
219 status_set_usb(true);
220#endif /* HAVE_LCD_BITMAP */
221 }
222 screen->update();
223
224 /* force statusbar by ignoring the setting */
225 usb_bars |= VP_SB_IGNORE_SETTING(i);
226 }
227
228 viewportmanager_set_statusbar(usb_bars);
229 313
314 while (1)
315 {
316 usb_screens_draw(usb_screen_vps_ar);
230#ifdef SIMULATOR 317#ifdef SIMULATOR
231 if (button_get_w_tmo(HZ/2)) 318 if (button_get_w_tmo(HZ/2))
232 break; 319 break;
@@ -237,6 +324,18 @@ void usb_screen(void)
237#endif /* SIMULATOR */ 324#endif /* SIMULATOR */
238 } 325 }
239 326
327 FOR_NB_SCREENS(i)
328 {
329 const struct viewport* vp = NULL;
330
331#if defined(HAVE_LCD_BITMAP) && defined(USB_ENABLE_HID)
332 vp = &usb_screen_vps_ar[i].title;
333#elif !defined(HAVE_LCD_BITMAP)
334 vp = &usb_screen_vps_ar[i].parent;
335#endif
336 if (vp)
337 screens[i].scroll_stop(vp);
338 }
240#ifdef USB_ENABLE_HID 339#ifdef USB_ENABLE_HID
241 if (global_settings.usb_keypad_mode != usb_keypad_mode) 340 if (global_settings.usb_keypad_mode != usb_keypad_mode)
242 { 341 {
@@ -259,8 +358,8 @@ void usb_screen(void)
259 viewportmanager_set_statusbar(old_bars); 358 viewportmanager_set_statusbar(old_bars);
260 send_event(GUI_EVENT_REFRESH, NULL); 359 send_event(GUI_EVENT_REFRESH, NULL);
261 360
262#endif /* USB_NONE */
263} 361}
362#endif /* !defined(USB_NONE) */
264 363
265#if (CONFIG_STORAGE & STORAGE_MMC) 364#if (CONFIG_STORAGE & STORAGE_MMC)
266int mmc_remove_request(void) 365int mmc_remove_request(void)