diff options
Diffstat (limited to 'apps')
-rw-r--r-- | apps/gui/skin_engine/skin_display.c | 2 | ||||
-rw-r--r-- | apps/gui/statusbar-skinned.c | 38 | ||||
-rw-r--r-- | apps/gui/viewport.c | 67 |
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 */ | ||
81 | static struct viewport inbuilt[NB_SCREENS]; | ||
80 | struct viewport *sb_skin_get_info_vp(enum screen_type screen) | 82 | struct 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 | ||
85 | inline bool sb_skin_get_state(enum screen_type screen) | 104 | inline 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, | |||
158 | void viewport_set_defaults(struct viewport *vp, | 139 | void 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 | ||
170 | void viewportmanager_init(void) | 187 | void viewportmanager_init(void) |