summaryrefslogtreecommitdiff
path: root/apps/gui
diff options
context:
space:
mode:
Diffstat (limited to 'apps/gui')
-rw-r--r--apps/gui/skin_engine/skin_display.c2
-rw-r--r--apps/gui/statusbar-skinned.c38
-rw-r--r--apps/gui/viewport.c67
3 files changed, 79 insertions, 28 deletions
diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c
index 51f86e5686..460101a17b 100644
--- a/apps/gui/skin_engine/skin_display.c
+++ b/apps/gui/skin_engine/skin_display.c
@@ -108,7 +108,7 @@ void skin_statusbar_changed(struct gui_wps *skin)
108 const int screen = display->screen_type; 108 const int screen = display->screen_type;
109 109
110 struct viewport *vp = &find_viewport(VP_DEFAULT_LABEL, data)->vp; 110 struct viewport *vp = &find_viewport(VP_DEFAULT_LABEL, data)->vp;
111 viewport_set_fullscreen(vp, screen); 111 viewport_set_defaults(vp, screen);
112 112
113 if (data->wps_sb_tag) 113 if (data->wps_sb_tag)
114 { /* fix up the default viewport */ 114 { /* fix up the default viewport */
diff --git a/apps/gui/statusbar-skinned.c b/apps/gui/statusbar-skinned.c
index 9756401ccb..ba46253f5d 100644
--- a/apps/gui/statusbar-skinned.c
+++ b/apps/gui/statusbar-skinned.c
@@ -77,15 +77,49 @@ void sb_skin_data_load(enum screen_type screen, const char *buf, bool isfile)
77 loaded_ok[screen] = success; 77 loaded_ok[screen] = success;
78} 78}
79 79
80/* temporary viewport structs while the non-skinned bar is in the build */
81static struct viewport inbuilt[NB_SCREENS];
80struct viewport *sb_skin_get_info_vp(enum screen_type screen) 82struct viewport *sb_skin_get_info_vp(enum screen_type screen)
81{ 83{
82 return &find_viewport(VP_INFO_LABEL, sb_skin[screen].data)->vp; 84 int bar_setting = global_settings.statusbar;
85#if NB_SCREENS > 1
86 if (screen == SCREEN_REMOTE)
87 bar_setting = global_settings.remote_statusbar;
88#endif
89 if (bar_setting == STATUSBAR_CUSTOM)
90 return &find_viewport(VP_INFO_LABEL, sb_skin[screen].data)->vp;
91 else if (bar_setting == STATUSBAR_OFF)
92 return NULL;
93 else
94 {
95 viewport_set_fullscreen(&inbuilt[screen], screen);
96 /* WE need to return the UI area.. NOT the statusbar area! */
97 if (bar_setting == STATUSBAR_TOP)
98 inbuilt[screen].y = STATUSBAR_HEIGHT;
99 inbuilt[screen].height -= STATUSBAR_HEIGHT;
100 return &inbuilt[screen];
101 }
83} 102}
84 103
85inline bool sb_skin_get_state(enum screen_type screen) 104inline bool sb_skin_get_state(enum screen_type screen)
86{ 105{
87 int skinbars = sb_skin[screen].sync_data->statusbars; 106 int skinbars = sb_skin[screen].sync_data->statusbars;
88 return loaded_ok[screen] && (skinbars & VP_SB_ONSCREEN(screen)); 107 /* Temp fix untill the hardcoded bar is removed */
108 int bar_setting = global_settings.statusbar;
109#if NB_SCREENS > 1
110 if (screen == SCREEN_REMOTE)
111 bar_setting = global_settings.remote_statusbar;
112#endif
113 switch (bar_setting)
114 {
115 case STATUSBAR_CUSTOM:
116 return loaded_ok[screen] && (skinbars & VP_SB_ONSCREEN(screen));
117 case STATUSBAR_TOP:
118 case STATUSBAR_BOTTOM:
119 case STATUSBAR_OFF:
120 return (VP_SB_ONSCREEN(screen));
121 }
122 return false; /* Should never actually get here */
89} 123}
90 124
91 125
diff --git a/apps/gui/viewport.c b/apps/gui/viewport.c
index b5696842e3..5c6caebbc5 100644
--- a/apps/gui/viewport.c
+++ b/apps/gui/viewport.c
@@ -102,28 +102,9 @@ void viewport_set_fullscreen(struct viewport *vp,
102 const enum screen_type screen) 102 const enum screen_type screen)
103{ 103{
104 vp->x = 0; 104 vp->x = 0;
105 vp->y = 0;
105 vp->width = screens[screen].lcdwidth; 106 vp->width = screens[screen].lcdwidth;
106 107 vp->height = screens[screen].lcdheight;
107#ifdef HAVE_LCD_BITMAP
108 struct viewport *sb_skin_vp = sb_skin_get_info_vp(screen);
109 if (sb_skin_vp && sb_skin_get_state(screen)
110 && statusbar_enabled & VP_SB_ONSCREEN(screen))
111 {
112 *vp = *sb_skin_vp;
113 }
114 else
115 {
116 if (statusbar_position(screen) != STATUSBAR_BOTTOM && showing_bars(screen))
117 vp->y = STATUSBAR_HEIGHT;
118 else
119 vp->y = 0;
120#else
121 {
122 vp->y = 0;
123#endif
124 vp->height = screens[screen].lcdheight
125 - (showing_bars(screen)?STATUSBAR_HEIGHT:0);
126 }
127 108
128#ifdef HAVE_LCD_BITMAP 109#ifdef HAVE_LCD_BITMAP
129 set_default_align_flags(vp); 110 set_default_align_flags(vp);
@@ -158,13 +139,49 @@ void viewport_set_fullscreen(struct viewport *vp,
158void viewport_set_defaults(struct viewport *vp, 139void viewport_set_defaults(struct viewport *vp,
159 const enum screen_type screen) 140 const enum screen_type screen)
160{ 141{
142 /* Reposition:
143 1) If the "ui viewport" setting is set, and a sbs is loaded which specifies a %Vi
144 return the intersection of those two viewports
145 2) If only one of the "ui viewport" setting, or sbs %Vi is set
146 return it
147 3) No user viewports set
148 return the full display
149 */
161#ifdef HAVE_LCD_BITMAP 150#ifdef HAVE_LCD_BITMAP
151
152 struct viewport *sbs_area = NULL, *user_setting = NULL;
153 /* get the two viewports */
162 if (ui_vp_info.active[screen]) 154 if (ui_vp_info.active[screen])
163 *vp = ui_vp_info.vp[screen]; 155 user_setting = &ui_vp_info.vp[screen];
156 if (sb_skin_get_state(screen))
157 sbs_area = sb_skin_get_info_vp(screen);
158 /* have both? get their intersection */
159 if (sbs_area && user_setting)
160 {
161 struct viewport *a = sbs_area, *b = user_setting;
162 /* make sure they do actually overlap,
163 * if they dont its user error, so use the full display
164 * and live with redraw problems */
165 if (a->x < b->x + b->width &&
166 a->x + a->width > b->x &&
167 a->y < b->y + b->height &&
168 a->y + a->height > b->y)
169 {
170 vp->x = MAX(a->x, b->x);
171 vp->y = MAX(a->y, b->y);
172 vp->width = MIN(a->x + a->width, b->x + b->width) - vp->x;
173 vp->height = MIN(a->y + a->height, b->y + b->height) - vp->y;
174 }
175 }
176 /* only one so use it */
177 else if (sbs_area)
178 *vp = *sbs_area;
179 else if (user_setting)
180 *vp = *user_setting;
181 /* have neither so its fullscreen which was fixed at the beginning */
164 else 182 else
165#endif 183 viewport_set_fullscreen(vp, screen);
166 viewport_set_fullscreen(vp, screen); 184#endif /* HAVE_LCD_BITMAP */
167
168} 185}
169 186
170void viewportmanager_init(void) 187void viewportmanager_init(void)