1 /* This is a small demo of the high-performance GUIX graphics framework. */
2 #include <stdio.h>
3 #include "gx_api.h"
4 #include "folder_output_test_MAIN_DISPLAY_resources.h"
5 #include "folder_output_test_SECONDARY_resources.h"
6 #include "folder_output_test_specifications.h"
7 
8 
9 #define DROP_LIST_VISIBLE_ROWS 100
10 #define NUMBER_ANIMATION_TIMER 2
11 
12 extern MAIN_DISPLAY_TEXT_SCREEN_CONTROL_BLOCK MAIN_DISPLAY_text_screen;
13 extern MAIN_DISPLAY_MENU_SCREEN_CONTROL_BLOCK MAIN_DISPLAY_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_WINDOW *pScrollWheelScreen;
23 GX_SCROLLBAR list_scroll;
24 
25 GX_WINDOW          NestedWindow;
26 GX_WINDOW_ROOT     nested_root;
27 
28 int          scroll_wheel_selected = 0;/* Used for testing*/
29 TX_SEMAPHORE *selected_semaphore = GX_NULL;
30 
31 #define NESTED_WINDOW_WIDTH  94
32 #define NESTED_WINDOW_HEIGHT  73
33 
34 /* Define the ThreadX demo thread control block and stack.  */
35 
36 GX_WINDOW_ROOT    *root;
37 
38 TX_BYTE_POOL       rotate_pool;
39 
40 #define            SCRATCHPAD_PIXELS (MAIN_DISPLAY_X_RESOLUTION * MAIN_DISPLAY_X_RESOLUTION)
41 GX_COLOR           scratchpad[SCRATCHPAD_PIXELS];
42 GX_COLOR           composite_canvas_memory[SCRATCHPAD_PIXELS];
43 GX_COLOR           animation_canvas_memory[NESTED_WINDOW_WIDTH * NESTED_WINDOW_HEIGHT];
44 
45 GX_CANVAS          composite_canvas;
46 GX_CANVAS          animation_canvas;
47 
48 extern GX_STUDIO_DISPLAY_INFO folder_output_test_display_table[];
49 
50 typedef struct {
51     GX_PROMPT prompt;
52     CHAR text[80];
53 } DROP_LIST_WIDGET;
54 
55 DROP_LIST_WIDGET drop_list_widgets[DROP_LIST_VISIBLE_ROWS + 1];
56 
57 /* Define prototypes.   */
58 VOID PopulateDropList();
59 VOID start_guix(VOID);
60 extern UINT win32_graphics_driver_setup_24xrgb(GX_DISPLAY *display);
61 void scroll_wheel_create();
62 
63 INT numeric_prompt_value = 10000;
64 INT button_click_count = 0;
65 
66 /* Define screen toggle function that used for resgression tests. */
ToggleScreen(GX_WINDOW * new_win,GX_WINDOW * old_win)67 void ToggleScreen(GX_WINDOW *new_win, GX_WINDOW *old_win)
68 {
69     if(!new_win->gx_widget_parent)
70     {
71         gx_widget_attach(root, (GX_WIDGET *)new_win);
72     }
73     else
74     {
75         gx_widget_show((GX_WIDGET *)new_win);
76     }
77     gx_widget_hide((GX_WIDGET *)old_win);
78 }
79 
main(int argc,char ** argv)80 int main(int argc, char ** argv)
81 {
82   tx_kernel_enter();
83   return(0);
84 }
85 
rotate_memory_allocate(ULONG size)86 VOID *rotate_memory_allocate(ULONG size)
87 {
88     VOID *memptr;
89 
90     if (tx_byte_allocate(&rotate_pool, &memptr, size, TX_NO_WAIT) == TX_SUCCESS)
91     {
92         return memptr;
93     }
94 
95     return NULL;
96 }
97 
rotate_memory_free(VOID * mem)98 VOID rotate_memory_free(VOID *mem)
99 {
100     tx_byte_release(mem);
101 }
102 
tx_application_define(void * first_unused_memory)103 VOID tx_application_define(void *first_unused_memory)
104 {
105     /* Create the main demo thread.  */
106 
107     /* create byte pool for rotate to use */
108     tx_byte_pool_create(&rotate_pool, "scratchpad", scratchpad,
109                         SCRATCHPAD_PIXELS * sizeof(GX_COLOR));
110 
111     start_guix();
112 }
113 
start_guix(void)114 VOID start_guix(void)
115 {
116     GX_RECTANGLE winsize;
117 
118     /* Initialize GUIX.  */
119     gx_system_initialize();
120 
121     /* install our memory allocator and de-allocator */
122     gx_system_memory_allocator_set(rotate_memory_allocate, rotate_memory_free);
123 
124 /* comment out the macro define RUN_MAIN_DISPLAY when you want run sencond display. */
125 #define RUN_MAIN_DISPLAY
126 
127 #ifdef RUN_MAIN_DISPLAY
128     gx_studio_display_configure(MAIN_DISPLAY, win32_graphics_driver_setup_24xrgb,
129         MAIN_DISPLAY_LANGUAGE_JAPANESE, MAIN_DISPLAY_THEME_1, &root);
130 
131     /* create the button screen */
132     gx_studio_named_widget_create("MAIN_DISPLAY_button_screen", (GX_WIDGET *) root, (GX_WIDGET **) &pButtonScreen);
133 
134     /* create the text widget screen */
135     gx_studio_named_widget_create("MAIN_DISPLAY_text_screen", GX_NULL, (GX_WIDGET **) &pTextScreen);
136 
137     /* create the windows screen */
138     gx_studio_named_widget_create("MAIN_DISPLAY_window_screen", GX_NULL, (GX_WIDGET **) &pWindowScreen);
139     PopulateDropList();
140 
141     /* create the indicator screen */
142     gx_studio_named_widget_create("MAIN_DISPLAY_indicator_screen", GX_NULL, (GX_WIDGET **) &pIndicatorScreen);
143 
144     /* create the popup screen */
145     gx_studio_named_widget_create("MAIN_DISPLAY_popup_modal_derived_derived", GX_NULL, (GX_WIDGET **) &pPopupScreen);
146 
147     /* create the popup screen */
148     gx_studio_named_widget_create("MAIN_DISPLAY_base_derived_1", GX_NULL, GX_NULL);
149 
150     /* create the popup screen */
151     gx_studio_named_widget_create("MAIN_DISPLAY_popup_modal_derived_1", GX_NULL, GX_NULL);
152 
153     /* create the popup screen */
154     gx_studio_named_widget_create("MAIN_DISPLAY_popup_modal_derived_derived_1", GX_NULL, GX_NULL);
155 
156     /* create circular gauge screen */
157     gx_studio_named_widget_create("MAIN_DISPLAY_gauge_screen", GX_NULL, (GX_WIDGET **)&pGaugeScreen);
158 
159     /* create sprite screen */
160     gx_studio_named_widget_create("MAIN_DISPLAY_sprite_screen", GX_NULL, (GX_WIDGET **)&pSpriteScreen);
161 
162     /* create menu screen */
163     gx_studio_named_widget_create("MAIN_DISPLAY_menu_screen", GX_NULL, GX_NULL);
164 
165     gx_studio_named_widget_create("MAIN_DISPLAY_rotate_screen", GX_NULL, GX_NULL);
166 
167     gx_studio_named_widget_create("MAIN_DISPLAY_child_template_screen", GX_NULL, GX_NULL);
168 
169     /* Show the root window to make it and patients screen visible.  */
170     gx_widget_show(root);
171 
172     /* create the composite canvas used during animations */
173     gx_canvas_create(&composite_canvas, GX_NULL,
174         folder_output_test_display_table[0].display,
175         GX_CANVAS_COMPOSITE,
176         root->gx_widget_size.gx_rectangle_right - root->gx_widget_size.gx_rectangle_left + 1,
177         root->gx_widget_size.gx_rectangle_bottom - root->gx_widget_size.gx_rectangle_top + 1,
178         composite_canvas_memory, SCRATCHPAD_PIXELS * sizeof(GX_COLOR));
179     gx_canvas_alpha_set(&composite_canvas, 255);
180 
181     /* create the nested window shown on the window screen */
182 
183     winsize.gx_rectangle_left = winsize.gx_rectangle_top = 0;
184     winsize.gx_rectangle_right = NESTED_WINDOW_WIDTH - 1;
185     winsize.gx_rectangle_bottom = NESTED_WINDOW_HEIGHT - 1;
186     gx_window_create(&NestedWindow, GX_NULL, GX_NULL, GX_STYLE_BORDER_THIN, 0, &winsize);
187     gx_widget_fill_color_set(&NestedWindow, GX_COLOR_ID_MAIN_DISPLAY_BLUE, GX_COLOR_ID_MAIN_DISPLAY_BLUE, GX_COLOR_ID_MAIN_DISPLAY_BLUE);
188 
189     /* create the root window used for window blend animation */
190     gx_window_root_create(&nested_root, "nested_root", &animation_canvas, GX_STYLE_BORDER_NONE, GX_NULL, &NestedWindow.gx_widget_size);
191     gx_widget_attach((GX_WIDGET *)&nested_root, (GX_WIDGET *)&NestedWindow);
192 #else
193     gx_studio_display_configure(SECONDARY, win32_graphics_driver_setup_24xrgb,
194         SECONDARY_LANGUAGE_CHINESE, SECONDARY_THEME_1, &root);
195 
196     /* create the button screen */
197     gx_studio_named_widget_create("SECONDARY_button_screen", (GX_WIDGET *)root, (GX_WIDGET **)&pButtonScreen);
198 
199     /* create the text widget screen */
200     gx_studio_named_widget_create("SECONDARY_text_screen", GX_NULL, (GX_WIDGET **)&pTextScreen);
201 
202     /* create the windows screen */
203     gx_studio_named_widget_create("SECONDARY_window_screen", GX_NULL, (GX_WIDGET **)&pWindowScreen);
204 
205     /* create the indicator screen */
206     gx_studio_named_widget_create("SECONDARY_indicator_screen", GX_NULL, (GX_WIDGET **)&pIndicatorScreen);
207 
208     /* create the popup screen */
209     gx_studio_named_widget_create("SECONDARY_popup_modal_derived_derived", GX_NULL, (GX_WIDGET **)&pPopupScreen);
210 
211     /* create circular gauge screen */
212     gx_studio_named_widget_create("SECONDARY_gauge_screen", GX_NULL, (GX_WIDGET **)&pGaugeScreen);
213 
214     /* create sprite screen */
215     gx_studio_named_widget_create("SECONDARY_sprite_screen", GX_NULL, (GX_WIDGET **)&pSpriteScreen);
216 
217     /* create menu screen */
218     gx_studio_named_widget_create("SECONDARY_menu_screen", GX_NULL, GX_NULL);
219 
220     gx_studio_named_widget_create("SECONDARY_rotate_screen", GX_NULL, GX_NULL);
221     gx_widget_show(root);
222 #endif
223 
224     /* start the GUIX thread */
225     gx_system_start();
226 }
227 
scroll_wheel_value_set(GX_PROMPT * prompt,INT selected_row)228 void scroll_wheel_value_set(GX_PROMPT *prompt, INT selected_row)
229 {
230     GX_CHAR text[10];
231 
232     gx_utility_ltoa(selected_row, text, 10);
233 
234     gx_prompt_text_set(prompt, text);
235 }
236 
buttons_handler(GX_WINDOW * window,GX_EVENT * event_ptr)237 UINT buttons_handler(GX_WINDOW *window, GX_EVENT *event_ptr)
238 {
239     switch(event_ptr->gx_event_type)
240     {
241     case GX_SIGNAL(ID_BUTTON, GX_EVENT_CLICKED):
242         button_click_count++;
243         gx_numeric_prompt_value_set(&MAIN_DISPLAY_button_screen.MAIN_DISPLAY_button_screen_count_prompt, button_click_count);
244         break;
245 
246     case GX_SIGNAL(ID_CHECKBOX, GX_EVENT_TOGGLE_ON):
247         gx_widget_style_remove(&MAIN_DISPLAY_button_screen.MAIN_DISPLAY_button_screen_pixelmap_button1, GX_STYLE_ENABLED);
248         break;
249 
250     case GX_SIGNAL(ID_CHECKBOX, GX_EVENT_TOGGLE_OFF):
251         gx_widget_style_add(&MAIN_DISPLAY_button_screen.MAIN_DISPLAY_button_screen_pixelmap_button1, GX_STYLE_ENABLED);
252         break;
253 
254     default:
255         return gx_window_event_process(window, event_ptr);
256     }
257     return 0;
258 }
259 
260 
window_screen_event_handler(GX_WINDOW * window,GX_EVENT * event_ptr)261 UINT window_screen_event_handler(GX_WINDOW *window, GX_EVENT *event_ptr)
262 {
263     switch(event_ptr->gx_event_type)
264     {
265     case GX_EVENT_SHOW:
266         /* Create new canvas to save the semi-transparent window,
267         Then set alpha to canvas and shift it.                      */
268         gx_canvas_create(&animation_canvas, GX_NULL,
269             folder_output_test_display_table[0].display,
270             GX_CANVAS_MANAGED_VISIBLE,
271             NESTED_WINDOW_WIDTH, NESTED_WINDOW_HEIGHT,
272             animation_canvas_memory, NESTED_WINDOW_WIDTH * NESTED_WINDOW_HEIGHT * sizeof(GX_COLOR));
273         gx_canvas_alpha_set(&animation_canvas, 255);
274         gx_canvas_offset_set(&animation_canvas, 94, 67);
275         gx_widget_show((GX_WIDGET *)&nested_root);
276         gx_window_event_process(window, event_ptr);
277         break;
278 
279     case GX_EVENT_HIDE:
280         gx_widget_hide((GX_WIDGET *)&nested_root);
281         gx_canvas_delete(&animation_canvas);
282         gx_window_event_process(window, event_ptr);
283         break;
284 
285     default:
286         return gx_window_event_process(window, event_ptr);
287     }
288     return 0;
289 }
290 
text_screen_event_handler(GX_WINDOW * window,GX_EVENT * event_ptr)291 UINT text_screen_event_handler(GX_WINDOW *window, GX_EVENT *event_ptr)
292 {
293     GX_CHAR *text_buffer;
294     UINT     buffer_size;
295     UINT     string_size;
296 
297     switch (event_ptr->gx_event_type)
298     {
299     case GX_EVENT_SHOW:
300         gx_system_timer_start(pTextScreen, NUMBER_ANIMATION_TIMER, 20, 20);
301         gx_window_event_process(window, event_ptr);
302         break;
303 
304     case GX_SIGNAL(ID_SL_INPUT, GX_EVENT_TEXT_EDITED):
305         gx_single_line_text_input_buffer_get(&MAIN_DISPLAY_text_screen.MAIN_DISPLAY_text_screen_text_input_1, &text_buffer, &string_size, &buffer_size);
306         if ((string_size == MAIN_DISPLAY_text_screen.MAIN_DISPLAY_text_screen_text_input_1.gx_single_line_text_input_string_size) &&
307             (buffer_size == MAIN_DISPLAY_text_screen.MAIN_DISPLAY_text_screen_text_input_1.gx_single_line_text_input_buffer_size))
308         {
309             gx_multi_line_text_view_text_set(&MAIN_DISPLAY_text_screen.MAIN_DISPLAY_text_screen_text_view_1, text_buffer);
310         }
311         break;
312 
313     case GX_SIGNAL(ID_ML_INPUT, GX_EVENT_TEXT_EDITED):
314         gx_multi_line_text_input_buffer_get(&MAIN_DISPLAY_text_screen.MAIN_DISPLAY_text_screen_text_input_2, &text_buffer, &string_size, &buffer_size);
315         if ((string_size == MAIN_DISPLAY_text_screen.MAIN_DISPLAY_text_screen_text_input_2.gx_multi_line_text_view_text.gx_string_length) &&
316             (buffer_size == MAIN_DISPLAY_text_screen.MAIN_DISPLAY_text_screen_text_input_2.gx_multi_line_text_input_buffer_size))
317         {
318             gx_multi_line_text_view_text_set(&MAIN_DISPLAY_text_screen.MAIN_DISPLAY_text_screen_text_view_1, text_buffer);
319         }
320         break;
321 
322     case GX_EVENT_TIMER:
323         if (event_ptr->gx_event_payload.gx_event_timer_id == NUMBER_ANIMATION_TIMER)
324         {
325             numeric_prompt_value++;
326 
327             if (numeric_prompt_value > 19999)
328             {
329                 numeric_prompt_value = 10000;
330             }
331             gx_numeric_prompt_value_set(&MAIN_DISPLAY_text_screen.MAIN_DISPLAY_text_screen_numeric_prompt, numeric_prompt_value);
332             gx_numeric_pixelmap_prompt_value_set(&MAIN_DISPLAY_text_screen.MAIN_DISPLAY_text_screen_numeric_pixelmap_prompt, numeric_prompt_value);
333         }
334         break;
335 
336     default:
337         return gx_window_event_process(window, event_ptr);
338     }
339     return 0;
340 }
341 
drop_list_row_create(GX_VERTICAL_LIST * list,GX_WIDGET * widget,INT index)342 VOID drop_list_row_create(GX_VERTICAL_LIST *list, GX_WIDGET *widget, INT index)
343 {
344 GX_BOOL created;
345 GX_RECTANGLE size;
346 GX_CHAR temp[10];
347 
348     DROP_LIST_WIDGET *entry = (DROP_LIST_WIDGET *) widget;
349 
350     GX_STRCPY(entry->text, " List Entry #");
351     gx_utility_ltoa(index + 1, temp, 10);
352     GX_STRCAT(entry->text, (char*)temp);
353 
354     gx_widget_created_test(widget, &created);
355 
356     if (!created)
357     {
358         gx_utility_rectangle_define(&size, 0, 0, 100, 30);
359         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);
360         gx_prompt_text_color_set(&entry->prompt, GX_COLOR_ID_CANVAS, GX_COLOR_ID_CANVAS, GX_COLOR_ID_CANVAS);
361     }
362 
363     gx_prompt_text_set(&entry->prompt, (GX_CHAR*)entry->text);
364 }
365 
PopulateDropList(void)366 VOID PopulateDropList(void)
367 {
368     int index;
369     GX_VERTICAL_LIST *list;
370 
371     MAIN_DISPLAY_WINDOW_SCREEN_CONTROL_BLOCK *control = (MAIN_DISPLAY_WINDOW_SCREEN_CONTROL_BLOCK *) pWindowScreen;
372     GX_DROP_LIST *drop = &control->MAIN_DISPLAY_window_screen_drop_list;
373     gx_drop_list_popup_get(drop, &list);
374 
375     for (index = 0; index < DROP_LIST_VISIBLE_ROWS; index++)
376     {
377         drop_list_row_create(list, (GX_WIDGET *) &drop_list_widgets[index], index);
378     }
379 
380     gx_vertical_scrollbar_create(&list_scroll, "list_scroll", list, GX_NULL,
381         GX_SCROLLBAR_VERTICAL | GX_SCROLLBAR_RELATIVE_THUMB | GX_SCROLLBAR_END_BUTTONS | GX_STYLE_ENABLED);
382 
383 }
384 
gauge_prompt_draw(GX_PROMPT * widget)385 VOID gauge_prompt_draw(GX_PROMPT *widget)
386 {
387 GX_CONST GX_CHAR *text;
388 
389     gx_system_string_get(GX_STRING_ID_MAIN_DISPLAY_STRING_44, &text);
390     gx_context_brush_define(widget->gx_prompt_normal_text_color, 0, GX_BRUSH_UNDERLINE);
391     gx_context_brush_width_set(2);
392     gx_context_font_set(widget->gx_prompt_font_id);
393     gx_canvas_text_draw(widget->gx_widget_size.gx_rectangle_left,
394                         widget->gx_widget_size.gx_rectangle_top,
395                         text, -1);
396 }
397 
format_func(GX_NUMERIC_PROMPT * prompt,INT value)398 VOID format_func(GX_NUMERIC_PROMPT *prompt, INT value)
399 {
400     gx_utility_ltoa(value % 1000, prompt->gx_numeric_prompt_buffer, GX_NUMERIC_PROMPT_BUFFER_SIZE);
401 }
402 
numeric_pixelmap_format_func(GX_NUMERIC_PIXELMAP_PROMPT * prompt,INT value)403 VOID numeric_pixelmap_format_func(GX_NUMERIC_PIXELMAP_PROMPT *prompt, INT value)
404 {
405     gx_utility_ltoa(value % 1000, prompt->gx_numeric_pixelmap_prompt_buffer, GX_NUMERIC_PROMPT_BUFFER_SIZE);
406 }
407