summaryrefslogtreecommitdiffstats
path: root/apps/gui/viewport.h
blob: 9ab0a71439fa2adc37aa19c977ce67873b189bf7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139

/***************************************************************************
 *             __________               __   ___.
 *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
 *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
 *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
 *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
 *                     \/            \/     \/    \/            \/
 * $Id$
 *
 * Copyright (C) 2008 by Jonathan Gordon
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ****************************************************************************/

#ifndef __VIEWPORT_H__
#define __VIEWPORT_H__


#include "config.h"
#include "lcd.h"
#include "system.h"
#include "screen_access.h"

/* return the number of text lines in the vp viewport */
int viewport_get_nb_lines(struct viewport *vp);

void viewport_set_defaults(struct viewport *vp, enum screen_type screen);

/* Used to specify which screens the statusbar (SB) should be displayed on.
 *
 * The parameter is a bit OR'ed combination of the following (screen is
 * SCREEN_MAIN or SCREEN_REMOTE from screen_access.h):
 *
 * VP_SB_HIDE_ALL means "hide the SB on all screens"
 * VP_SB_ONSCREEN(screen) means "display the SB on the given screen
 *                              as specified by the SB setting for that screen"
 * VP_SB_IGNORE_SETTING(screen) means "ignore the SB setting for that screen"
 * VP_SB_ALLSCREENS means "VP_SB_ONSCREEN for all screens"
 * 
 * In most cases, VP_SB_ALLSCREENS should be used which means display the SB
 * as specified by the settings.
 * For the WPS (and other possible exceptions) use VP_SB_IGNORE_SETTING() to
 * FORCE the statusbar on for the given screen (i.e it will show regardless
 * of the setting)
 *
 * Returns the status before the call. This value can be used to restore the
 * SB "displaying rules".
 */


#define THEME_STATUSBAR     (BIT_N(0))
#define THEME_UI_VIEWPORT   (BIT_N(1))
#define THEME_BUTTONBAR     (BIT_N(2))
#define THEME_LANGUAGE      (BIT_N(3))
#define THEME_ALL           (~(0u))

#define VP_SB_HIDE_ALL 0
#define VP_SB_ONSCREEN(screen) BIT_N(screen)
#define VP_SB_IGNORE_SETTING(screen) BIT_N(4+screen)
#define VP_SB_ALLSCREENS (VP_SB_ONSCREEN(0)|VP_SB_ONSCREEN(1))

#ifndef __PCTOOL__
/*
 * Initialize the viewportmanager, which in turns initializes the UI vp and
 * statusbar stuff
 */
void viewportmanager_init(void);
int viewportmanager_get_statusbar(void);
int viewportmanager_set_statusbar(int enabled);

/* call this when a theme changed */
void viewportmanager_theme_changed(int);

/*
 * Initializes the given viewport with maximum dimensions minus status- and
 * buttonbar
 */
void viewport_set_fullscreen(struct viewport *vp, enum screen_type screen);

#ifdef HAVE_LCD_BITMAP

/*
 * Returns a pointer to the current viewport
 *  - That could be the UI vp, or a viewport passed to do_menu() or the like
 */
struct viewport* viewport_get_current_vp(void);

/*
 * Set the UI vp pointer to a different one - NULL to reset to the UI vp
 *
 * This is needed since the UI viewport needs is kept in RAM.
 */
void viewport_set_current_vp(struct viewport* vp);

/*
 * returns true if the ui viewport is active on the screen
 */
bool viewport_ui_vp_get_state(enum screen_type screen);
#ifdef HAVE_TOUCHSCREEN
bool viewport_point_within_vp(const struct viewport *vp, int x, int y);
#endif

#else /* HAVE_LCD_CHARCELL */
#define viewport_set_current_vp(a)
#define viewport_get_current_vp() NULL
#endif

#endif /* __PCTOOL__ */

#ifdef HAVE_LCD_BITMAP

/*
 * Parse a viewport definition (vp_def), which looks like:
 *
 * Screens with depth > 1:
 *   X|Y|width|height|font|foregorund color|background color
 * Screens with depth = 1:
 *   X|Y|width|height|font
 *
 * | is a separator and can be specified via the parameter
 *
 * Returns the pointer to the char after the last character parsed
 * if everything went OK or NULL if an error happened (some values
 * not specified in the definition)
 */
const char* viewport_parse_viewport(struct viewport *vp,
                                    enum screen_type screen,
                                    const char *vp_def,
                                    const char separator);
#endif /* HAVE_LCD_BITMAP */
#endif /* __VIEWPORT_H__ */