1 /* This is a small demo of the high-performance GUIX graphics framework. */
2 
3 #include <stdio.h>
4 #include <string.h>
5 #include "gx_api.h"
6 #include "all_widgets_execute_resources.h"
7 #include "all_widgets_execute_specifications.h"
8 
9 #define DROP_LIST_VISIBLE_ROWS 100
10 #define NUMBER_ANIMATION_TIMER 2
11 
12 extern TEXT_SCREEN_CONTROL_BLOCK text_screen;
13 extern MENU_SCREEN_CONTROL_BLOCK menu_screen;
14 
15 GX_WINDOW *pTextScreen;
16 GX_WINDOW *pWindowScreen;
17 GX_WINDOW *pButtonScreen;
18 GX_WINDOW *pIndicatorScreen;
19 GX_WINDOW *pPopupScreen;
20 GX_WINDOW *pGaugeScreen;
21 GX_WINDOW *pSpriteScreen;
22 GX_SCROLLBAR list_scroll;
23 
24 GX_WINDOW          NestedWindow;
25 GX_WINDOW_ROOT     nested_root;
26 
27 GX_BOOL            day_wheel_selected_row_changed = GX_FALSE;/* Used for testing*/
28 GX_BOOL            month_wheel_selected_row_changed = GX_FALSE;/* Used for testing*/
29 #define NESTED_WINDOW_WIDTH  94
30 #define NESTED_WINDOW_HEIGHT  73
31 
32 /* Define the ThreadX demo thread control block and stack.  */
33 
34 GX_WINDOW_ROOT    *root;
35 
36 TX_BYTE_POOL       mem_pool;
37 
38 #define            SCRATCHPAD_PIXELS (PRIMARY_X_RESOLUTION * PRIMARY_X_RESOLUTION)
39 GX_COLOR           scratchpad[SCRATCHPAD_PIXELS];
40 GX_COLOR           composite_canvas_memory[SCRATCHPAD_PIXELS];
41 GX_COLOR           animation_canvas_memory[NESTED_WINDOW_WIDTH * NESTED_WINDOW_HEIGHT];
42 
43 GX_CANVAS          composite_canvas;
44 GX_CANVAS          animation_canvas;
45 
46 extern GX_STUDIO_DISPLAY_INFO all_widgets_execute_display_table[];
47 
48 typedef struct {
49     GX_PROMPT prompt;
50     CHAR text[80];
51 } DROP_LIST_WIDGET;
52 
53 DROP_LIST_WIDGET drop_list_widgets[DROP_LIST_VISIBLE_ROWS + 1];
54 
55 /* Define prototypes.   */
56 VOID PopulateDropList();
57 VOID start_guix(VOID);
58 extern UINT win32_graphics_driver_setup_24xrgb(GX_DISPLAY *display);
59 void scroll_wheel_create();
60 
61 INT numeric_prompt_value = 10000;
62 
main(int argc,char ** argv)63 int main(int argc, char ** argv)
64 {
65   tx_kernel_enter();
66   return(0);
67 }
68 
memory_allocate(ULONG size)69 VOID *memory_allocate(ULONG size)
70 {
71     VOID *memptr;
72 
73     if (tx_byte_allocate(&mem_pool, &memptr, size, TX_NO_WAIT) == TX_SUCCESS)
74     {
75         return memptr;
76     }
77 
78     return NULL;
79 }
80 
memory_free(VOID * mem)81 VOID memory_free(VOID *mem)
82 {
83     tx_byte_release(mem);
84 }
85 
tx_application_define(void * first_unused_memory)86 VOID tx_application_define(void *first_unused_memory)
87 {
88     /* Create the main demo thread.  */
89 
90     /* create byte pool for rotate to use */
91     tx_byte_pool_create(&mem_pool, "scratchpad", scratchpad,
92                         SCRATCHPAD_PIXELS * sizeof(GX_COLOR));
93 
94     start_guix();
95 }
96 
start_guix(void)97 VOID start_guix(void)
98 {
99     GX_RECTANGLE winsize;
100     /* Initialize GUIX.  */
101     gx_system_initialize();
102 
103     /* install our memory allocator and de-allocator */
104     gx_system_memory_allocator_set(memory_allocate, memory_free);
105 
106     /* configure the display */
107     gx_studio_display_configure(PRIMARY, win32_graphics_driver_setup_24xrgb,
108                                 LANGUAGE_ENGLISH, PRIMARY_THEME_1, &root);
109 
110     /* create the button screen */
111     gx_studio_named_widget_create("button_screen", (GX_WIDGET *)root, (GX_WIDGET **)&pButtonScreen);
112 
113     /* create the text widget screen */
114     gx_studio_named_widget_create("text_screen", GX_NULL, (GX_WIDGET **) &pTextScreen);
115 
116     /* create the windows screen */
117     gx_studio_named_widget_create("window_screen", GX_NULL, (GX_WIDGET **)&pWindowScreen);
118     PopulateDropList();
119 
120     /* create the indicator screen */
121     gx_studio_named_widget_create("indicator_screen", GX_NULL, (GX_WIDGET **) &pIndicatorScreen);
122 
123     /* create the popup screen */
124     gx_studio_named_widget_create("popup_modal", GX_NULL, (GX_WIDGET **) &pPopupScreen);
125 
126     /* create circular gauge screen */
127     gx_studio_named_widget_create("gauge_screen", GX_NULL, (GX_WIDGET **)&pGaugeScreen);
128 
129     /* create sprite screen */
130     gx_studio_named_widget_create("sprite_screen", GX_NULL, (GX_WIDGET **)&pSpriteScreen);
131 
132     /* create menu screen */
133     gx_studio_named_widget_create("menu_screen", GX_NULL, GX_NULL);
134 
135     /* Show the root window to make it and patients screen visible.  */
136     gx_widget_show(root);
137 
138     /* create the composite canvas used during animations */
139     gx_canvas_create(&composite_canvas, GX_NULL,
140         all_widgets_execute_display_table[0].display,
141         GX_CANVAS_COMPOSITE,
142         root->gx_widget_size.gx_rectangle_right - root->gx_widget_size.gx_rectangle_left + 1,
143         root->gx_widget_size.gx_rectangle_bottom - root->gx_widget_size.gx_rectangle_top + 1,
144         composite_canvas_memory, SCRATCHPAD_PIXELS * sizeof(GX_COLOR));
145     gx_canvas_alpha_set(&composite_canvas, 255);
146 
147     /* create the nested window shown on the window screen */
148 
149     winsize.gx_rectangle_left = winsize.gx_rectangle_top = 0;
150     winsize.gx_rectangle_right = NESTED_WINDOW_WIDTH - 1;
151     winsize.gx_rectangle_bottom = NESTED_WINDOW_HEIGHT - 1;
152     gx_window_create(&NestedWindow, GX_NULL, GX_NULL, GX_STYLE_BORDER_THIN, 0, &winsize);
153     gx_widget_fill_color_set(&NestedWindow, GX_COLOR_ID_BLUE, GX_COLOR_ID_BLUE, GX_COLOR_ID_BLUE);
154 
155     /* create the root window used for window blend animation */
156     gx_window_root_create(&nested_root, "nested_root", &animation_canvas, GX_STYLE_BORDER_NONE, GX_NULL, &NestedWindow.gx_widget_size);
157     gx_widget_attach((GX_WIDGET *)&nested_root, (GX_WIDGET *)&NestedWindow);
158 
159     /* start the GUIX thread */
160     gx_system_start();
161 }
162 
scroll_wheel_value_set(GX_PROMPT * prompt,INT selected_row)163 void scroll_wheel_value_set(GX_PROMPT *prompt, INT selected_row)
164 {
165     GX_CHAR text_buffer[10];
166     GX_STRING text;
167 
168     gx_utility_ltoa(selected_row, text_buffer, 10);
169     text.gx_string_ptr = text_buffer;
170     text.gx_string_length = strnlen(text_buffer, sizeof(text_buffer));
171 
172     gx_prompt_text_set_ext(prompt, &text);
173 }
174 
175 
buttons_handler(GX_WINDOW * window,GX_EVENT * event_ptr)176 UINT buttons_handler(GX_WINDOW *window, GX_EVENT *event_ptr)
177 {
178     switch(event_ptr->gx_event_type)
179     {
180     case GX_SIGNAL(ID_CHECKBOX, GX_EVENT_TOGGLE_ON):
181         gx_widget_style_remove(&button_screen.button_screen_pixelmap_button1, GX_STYLE_ENABLED);
182         break;
183 
184     case GX_SIGNAL(ID_CHECKBOX, GX_EVENT_TOGGLE_OFF):
185         gx_widget_style_add(&button_screen.button_screen_pixelmap_button1, GX_STYLE_ENABLED);
186         break;
187 
188     default:
189         return gx_window_event_process(window, event_ptr);
190     }
191     return 0;
192 }
193 
window_screen_event_process(GX_WINDOW * window,GX_EVENT * event_ptr)194 UINT window_screen_event_process(GX_WINDOW *window, GX_EVENT *event_ptr)
195 {
196     switch(event_ptr->gx_event_type)
197     {
198     case GX_EVENT_SHOW:
199         /* Create new canvas to save the semi-transparent window,
200         Then set alpha to canvas and shift it.                      */
201         gx_canvas_create(&animation_canvas, GX_NULL,
202             all_widgets_execute_display_table[0].display,
203             GX_CANVAS_MANAGED_VISIBLE,
204             NESTED_WINDOW_WIDTH, NESTED_WINDOW_HEIGHT,
205             animation_canvas_memory, NESTED_WINDOW_WIDTH * NESTED_WINDOW_HEIGHT * sizeof(GX_COLOR));
206         gx_canvas_alpha_set(&animation_canvas, 255);
207         gx_canvas_offset_set(&animation_canvas, 94, 67);
208         gx_widget_show((GX_WIDGET *)&nested_root);
209         gx_window_event_process(window, event_ptr);
210         break;
211 
212     case GX_EVENT_HIDE:
213         gx_widget_hide((GX_WIDGET *)&nested_root);
214         gx_canvas_delete(&animation_canvas);
215         gx_window_event_process(window, event_ptr);
216         break;
217 
218 #if 0
219     case GX_EVENT_TIMER:
220         if (event_ptr->gx_event_payload.gx_event_timer_id == NUMBER_ANIMATION_TIMER)
221         {
222             numeric_prompt_value++;
223 
224             if (numeric_prompt_value > 19999)
225             {
226                 numeric_prompt_value = 10000;
227             }
228             gx_numeric_prompt_value_set(&text_screen.text_screen_numeric_prompt, numeric_prompt_value);
229             gx_numeric_pixelmap_prompt_value_set(&text_screen.text_screen_numeric_pixelmap_prompt, numeric_prompt_value);
230         }
231         break;
232 #endif
233 
234     default:
235         return gx_window_event_process(window, event_ptr);
236     }
237     return 0;
238 }
239 
drop_list_row_create(GX_VERTICAL_LIST * list,GX_WIDGET * widget,INT index)240 VOID drop_list_row_create(GX_VERTICAL_LIST *list, GX_WIDGET *widget, INT index)
241 {
242 GX_BOOL created;
243 GX_RECTANGLE size;
244 GX_CHAR temp[10];
245 GX_STRING text;
246 
247     DROP_LIST_WIDGET *entry = (DROP_LIST_WIDGET *) widget;
248 
249     GX_STRCPY(entry->text, " List Entry #");
250     gx_utility_ltoa(index + 1, temp, 10);
251     GX_STRCAT(entry->text, (char*)temp);
252 
253     gx_widget_created_test(widget, &created);
254 
255     if (!created)
256     {
257         gx_utility_rectangle_define(&size, 0, 0, 100, 30);
258         gx_prompt_create(&entry->prompt, entry->text, list, 0, GX_STYLE_ENABLED|GX_STYLE_TEXT_LEFT|GX_STYLE_BORDER_NONE|GX_STYLE_TRANSPARENT, 0, &size);
259         gx_prompt_text_color_set(&entry->prompt, GX_COLOR_ID_CANVAS, GX_COLOR_ID_CANVAS, GX_COLOR_ID_CANVAS);
260     }
261 
262     text.gx_string_ptr = entry->text;
263     text.gx_string_length = strnlen(entry->text, sizeof(entry->text));
264 
265     gx_prompt_text_set_ext(&entry->prompt, &text);
266 }
267 
PopulateDropList(void)268 VOID PopulateDropList(void)
269 {
270     int index;
271     GX_VERTICAL_LIST *list;
272 
273     WINDOW_SCREEN_CONTROL_BLOCK *control = (WINDOW_SCREEN_CONTROL_BLOCK *) pWindowScreen;
274     GX_DROP_LIST *drop = &control->window_screen_drop_list;
275     gx_drop_list_popup_get(drop, &list);
276 
277     for (index = 0; index < DROP_LIST_VISIBLE_ROWS; index++)
278     {
279         drop_list_row_create(list, (GX_WIDGET *) &drop_list_widgets[index], index);
280     }
281 
282     gx_vertical_scrollbar_create(&list_scroll, "list_scroll", list, GX_NULL,
283         GX_SCROLLBAR_VERTICAL | GX_SCROLLBAR_RELATIVE_THUMB | GX_SCROLLBAR_END_BUTTONS | GX_STYLE_ENABLED);
284 }
285 
gauge_prompt_draw(GX_PROMPT * widget)286 VOID gauge_prompt_draw(GX_PROMPT *widget)
287 {
288 GX_STRING text;
289 
290     gx_context_string_get_ext(GX_STRING_ID_STRING_44, &text);
291     gx_context_brush_define(widget->gx_prompt_normal_text_color, 0, GX_BRUSH_UNDERLINE);
292     gx_context_brush_width_set(2);
293     gx_context_font_set(widget->gx_prompt_font_id);
294     gx_canvas_text_draw_ext(widget->gx_widget_size.gx_rectangle_left,
295                         widget->gx_widget_size.gx_rectangle_top,
296                         &text);
297 }
298 
format_func(GX_NUMERIC_PROMPT * prompt,INT value)299 VOID format_func(GX_NUMERIC_PROMPT *prompt, INT value)
300 {
301     gx_utility_ltoa(value % 1000, prompt->gx_numeric_prompt_buffer, GX_NUMERIC_PROMPT_BUFFER_SIZE);
302 }
303 
numeric_pixelmap_format_func(GX_NUMERIC_PIXELMAP_PROMPT * prompt,INT value)304 VOID numeric_pixelmap_format_func(GX_NUMERIC_PIXELMAP_PROMPT *prompt, INT value)
305 {
306     gx_utility_ltoa(value % 1000, prompt->gx_numeric_pixelmap_prompt_buffer, GX_NUMERIC_PROMPT_BUFFER_SIZE);
307 }
308