1 /* This is a small demo of the high-performance GUIX graphics framework. */
2 
3 #include <stdio.h>
4 #include "gx_api.h"
5 #include "all_widgets_resources.h"
6 #include "all_widgets_specifications.h"
7 
8 #define DROP_LIST_VISIBLE_ROWS 100
9 #define NUMBER_ANIMATION_TIMER 2
10 
11 extern TEXT_SCREEN_CONTROL_BLOCK text_screen;
12 extern MENU_SCREEN_CONTROL_BLOCK menu_screen;
13 
14 GX_WINDOW *pTextScreen;
15 GX_WINDOW *pWindowScreen;
16 GX_WINDOW *pButtonScreen;
17 GX_WINDOW *pIndicatorScreen;
18 GX_WINDOW *pPopupScreen;
19 GX_WINDOW *pGaugeScreen;
20 GX_WINDOW *pSpriteScreen;
21 GX_WINDOW *pScrollWheelScreen;
22 GX_SCROLLBAR list_scroll;
23 
24 GX_WINDOW          NestedWindow;
25 GX_WINDOW_ROOT     nested_root;
26 
27 int          scroll_wheel_selected = 0;/* Used for testing*/
28 TX_SEMAPHORE *selected_semaphore = GX_NULL;
29 
30 #define NESTED_WINDOW_WIDTH  94
31 #define NESTED_WINDOW_HEIGHT  73
32 
33 #define ID_ANIMATION_CANVAS_ROOT_WINDOW 65500
34 
35 /* Define the ThreadX demo thread control block and stack.  */
36 
37 GX_WINDOW_ROOT    *root;
38 
39 TX_BYTE_POOL       rotate_pool;
40 
41 #define            SCRATCHPAD_PIXELS (PRIMARY_X_RESOLUTION * PRIMARY_X_RESOLUTION)
42 GX_COLOR           scratchpad[SCRATCHPAD_PIXELS];
43 GX_COLOR           composite_canvas_memory[SCRATCHPAD_PIXELS];
44 GX_COLOR           animation_canvas_memory[NESTED_WINDOW_WIDTH * NESTED_WINDOW_HEIGHT];
45 
46 GX_CANVAS          composite_canvas;
47 GX_CANVAS          animation_canvas;
48 
49 extern GX_STUDIO_DISPLAY_INFO all_widgets_display_table[];
50 
51 typedef struct {
52     GX_PROMPT prompt;
53     CHAR text[80];
54 } DROP_LIST_WIDGET;
55 
56 DROP_LIST_WIDGET drop_list_widgets[DROP_LIST_VISIBLE_ROWS + 1];
57 
58 /* Define prototypes.   */
59 VOID PopulateDropList();
60 VOID start_guix(VOID);
61 extern UINT win32_graphics_driver_setup_24xrgb(GX_DISPLAY *display);
62 void scroll_wheel_create();
63 
64 INT numeric_prompt_value = 10000;
65 INT button_click_count = 0;
66 INT button_focus_gain_count = 0;
67 
68 /* Define radial slider anchor angle list. */
69 GX_VALUE radial_slider_anchor_list[] = { 242, 214, 191, 168, 142, 112, 67, 38, 13, -10, -34, -63 };
70 
71 /* Define screen toggle function that used for resgression tests. */
ToggleScreen(GX_WINDOW * new_win,GX_WINDOW * old_win)72 void ToggleScreen(GX_WINDOW *new_win, GX_WINDOW *old_win)
73 {
74     if(!new_win->gx_widget_parent)
75     {
76         gx_widget_attach(root, (GX_WIDGET *)new_win);
77     }
78     else
79     {
80         gx_widget_show((GX_WIDGET *)new_win);
81     }
82     gx_widget_hide((GX_WIDGET *)old_win);
83 }
84 
main(int argc,char ** argv)85 int main(int argc, char ** argv)
86 {
87   tx_kernel_enter();
88   return(0);
89 }
90 
rotate_memory_allocate(ULONG size)91 VOID *rotate_memory_allocate(ULONG size)
92 {
93     VOID *memptr;
94 
95     if (tx_byte_allocate(&rotate_pool, &memptr, size, TX_NO_WAIT) == TX_SUCCESS)
96     {
97         return memptr;
98     }
99 
100     return NULL;
101 }
102 
rotate_memory_free(VOID * mem)103 VOID rotate_memory_free(VOID *mem)
104 {
105     tx_byte_release(mem);
106 }
107 
tx_application_define(void * first_unused_memory)108 VOID tx_application_define(void *first_unused_memory)
109 {
110     /* Create the main demo thread.  */
111 
112     /* create byte pool for rotate to use */
113     tx_byte_pool_create(&rotate_pool, "scratchpad", scratchpad,
114                         SCRATCHPAD_PIXELS * sizeof(GX_COLOR));
115 
116 #if defined(DISABLE_GUIX_START)
117     /* For testing need. */
118 #else
119     start_guix();
120 #endif
121 }
122 
start_guix(void)123 VOID start_guix(void)
124 {
125     GX_RECTANGLE winsize;
126 
127     /* Initialize GUIX.  */
128     gx_system_initialize();
129 
130     /* install our memory allocator and de-allocator */
131     gx_system_memory_allocator_set(rotate_memory_allocate, rotate_memory_free);
132 
133     gx_studio_display_configure(PRIMARY, win32_graphics_driver_setup_24xrgb,
134                                 LANGUAGE_ENGLISH, PRIMARY_THEME_1, &root);
135 
136     /* create the button screen */
137     gx_studio_named_widget_create("button_screen", (GX_WIDGET *) root, (GX_WIDGET **) &pButtonScreen);
138 
139     /* create the text widget screen */
140     gx_studio_named_widget_create("text_screen", GX_NULL, (GX_WIDGET **) &pTextScreen);
141 
142     /* create the windows screen */
143     gx_studio_named_widget_create("window_screen", GX_NULL, (GX_WIDGET **) &pWindowScreen);
144     PopulateDropList();
145 
146     /* create the indicator screen */
147     gx_studio_named_widget_create("indicator_screen", GX_NULL, (GX_WIDGET **) &pIndicatorScreen);
148 
149     /* create the popup screen */
150     gx_studio_named_widget_create("popup_modal", GX_NULL, (GX_WIDGET **) &pPopupScreen);
151 
152     /* create circular gauge screen */
153     gx_studio_named_widget_create("gauge_screen", GX_NULL, (GX_WIDGET **)&pGaugeScreen);
154 
155     /* create sprite screen */
156     gx_studio_named_widget_create("sprite_screen", GX_NULL, (GX_WIDGET **)&pSpriteScreen);
157 
158     /* create menu screen */
159     gx_studio_named_widget_create("menu_screen", GX_NULL, GX_NULL);
160 
161     gx_studio_named_widget_create("rotate_screen", GX_NULL, GX_NULL);
162 
163     gx_studio_named_widget_create("radial_slider_screen", GX_NULL, GX_NULL);
164 
165     gx_studio_named_widget_create("rich_text_view_screen", GX_NULL, GX_NULL);
166 
167     gx_studio_named_widget_create("focus_test_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         all_widgets_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_BLUE, GX_COLOR_ID_BLUE, GX_COLOR_ID_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, ID_ANIMATION_CANVAS_ROOT_WINDOW, &NestedWindow.gx_widget_size);
191     gx_widget_attach((GX_WIDGET *)&nested_root, (GX_WIDGET *)&NestedWindow);
192 
193     /* start the GUIX thread */
194     gx_system_start();
195 }
196 
scroll_wheel_value_set(GX_PROMPT * prompt,INT selected_row)197 void scroll_wheel_value_set(GX_PROMPT *prompt, INT selected_row)
198 {
199     GX_CHAR text_buffer[10];
200     GX_STRING text;
201 
202     gx_utility_ltoa(selected_row, text_buffer, sizeof(text_buffer));
203     text.gx_string_ptr = text_buffer;
204     text.gx_string_length = strnlen(text_buffer, sizeof(text_buffer));
205 
206     gx_prompt_text_set_ext(prompt, &text);
207 }
208 
buttons_handler(GX_WINDOW * window,GX_EVENT * event_ptr)209 UINT buttons_handler(GX_WINDOW *window, GX_EVENT *event_ptr)
210 {
211     switch(event_ptr->gx_event_type)
212     {
213     case GX_SIGNAL(ID_BUTTON, GX_EVENT_CLICKED):
214         button_click_count++;
215         gx_numeric_prompt_value_set(&button_screen.button_screen_count_prompt, button_click_count);
216         break;
217 
218     case GX_SIGNAL(ID_CHECKBOX, GX_EVENT_TOGGLE_ON):
219         gx_widget_style_remove(&button_screen.button_screen_pixelmap_button1, GX_STYLE_ENABLED);
220         break;
221 
222     case GX_SIGNAL(ID_CHECKBOX, GX_EVENT_TOGGLE_OFF):
223         gx_widget_style_add(&button_screen.button_screen_pixelmap_button1, GX_STYLE_ENABLED);
224         break;
225 
226     case GX_SIGNAL(ID_BUTTON, GX_EVENT_FOCUS_GAIN_NOTIFY):
227         button_focus_gain_count++;
228         break;
229 
230     default:
231         return gx_window_event_process(window, event_ptr);
232     }
233     return 0;
234 }
235 
236 
window_screen_event_handler(GX_WINDOW * window,GX_EVENT * event_ptr)237 UINT window_screen_event_handler(GX_WINDOW *window, GX_EVENT *event_ptr)
238 {
239     switch(event_ptr->gx_event_type)
240     {
241     case GX_EVENT_SHOW:
242         /* Create new canvas to save the semi-transparent window,
243         Then set alpha to canvas and shift it.                      */
244         gx_canvas_create(&animation_canvas, GX_NULL,
245             all_widgets_display_table[0].display,
246             GX_CANVAS_MANAGED_VISIBLE,
247             NESTED_WINDOW_WIDTH, NESTED_WINDOW_HEIGHT,
248             animation_canvas_memory, NESTED_WINDOW_WIDTH * NESTED_WINDOW_HEIGHT * sizeof(GX_COLOR));
249         gx_canvas_alpha_set(&animation_canvas, 255);
250         gx_canvas_offset_set(&animation_canvas, 94, 67);
251         gx_widget_show((GX_WIDGET *)&nested_root);
252         gx_window_event_process(window, event_ptr);
253 
254         gx_window_client_scroll(&window_screen.window_screen_scroll_frame_1, -1, 1);
255         break;
256 
257     case GX_EVENT_HIDE:
258         gx_widget_hide((GX_WIDGET *)&nested_root);
259         gx_canvas_delete(&animation_canvas);
260         gx_window_event_process(window, event_ptr);
261         break;
262 
263     default:
264         return gx_window_event_process(window, event_ptr);
265     }
266     return 0;
267 }
268 
text_screen_event_handler(GX_WINDOW * window,GX_EVENT * event_ptr)269 UINT text_screen_event_handler(GX_WINDOW *window, GX_EVENT *event_ptr)
270 {
271     UINT      buffer_size;
272     GX_STRING string;
273 
274     switch (event_ptr->gx_event_type)
275     {
276     case GX_EVENT_SHOW:
277         gx_system_timer_start(pTextScreen, NUMBER_ANIMATION_TIMER, 20, 20);
278         gx_window_event_process(window, event_ptr);
279         break;
280 
281     case GX_SIGNAL(ID_SL_INPUT, GX_EVENT_TEXT_EDITED):
282         gx_single_line_text_input_buffer_get(&text_screen.text_screen_text_input_1, (GX_CHAR **)&string.gx_string_ptr, &string.gx_string_length, &buffer_size);
283         if ((string.gx_string_length == text_screen.text_screen_text_input_1.gx_single_line_text_input_string_size) &&
284             (buffer_size == text_screen.text_screen_text_input_1.gx_single_line_text_input_buffer_size))
285         {
286             gx_multi_line_text_view_text_set_ext(&text_screen.text_screen_text_view_1, &string);
287         }
288         break;
289 
290     case GX_SIGNAL(ID_ML_INPUT, GX_EVENT_TEXT_EDITED):
291         gx_multi_line_text_input_buffer_get(&text_screen.text_screen_text_input_2, (GX_CHAR **)&string.gx_string_ptr, &string.gx_string_length, &buffer_size);
292         if ((string.gx_string_length == text_screen.text_screen_text_input_2.gx_multi_line_text_view_text.gx_string_length) &&
293             (buffer_size == text_screen.text_screen_text_input_2.gx_multi_line_text_input_buffer_size))
294         {
295             gx_multi_line_text_view_text_set_ext(&text_screen.text_screen_text_view_1, &string);
296         }
297         break;
298 
299     case GX_EVENT_TIMER:
300         if (event_ptr->gx_event_payload.gx_event_timer_id == NUMBER_ANIMATION_TIMER)
301         {
302             numeric_prompt_value++;
303 
304             if (numeric_prompt_value > 19999)
305             {
306                 numeric_prompt_value = 10000;
307             }
308             gx_numeric_prompt_value_set(&text_screen.text_screen_numeric_prompt, numeric_prompt_value);
309             gx_numeric_pixelmap_prompt_value_set(&text_screen.text_screen_numeric_pixelmap_prompt, numeric_prompt_value);
310         }
311         break;
312 
313     default:
314         return gx_window_event_process(window, event_ptr);
315     }
316     return 0;
317 }
318 
radial_slider_screen_event_process(GX_WINDOW * window,GX_EVENT * event_ptr)319 UINT radial_slider_screen_event_process(GX_WINDOW *window, GX_EVENT *event_ptr)
320 {
321     switch (event_ptr->gx_event_type)
322     {
323     case GX_SIGNAL(ID_ANIMATED, GX_EVENT_TOGGLE_ON):
324         gx_radial_slider_animation_set(&radial_slider_screen.radial_slider_screen_radial_slider, 15, 2, GX_ANIMATION_CIRC_EASE_IN_OUT, GX_NULL);
325         break;
326 
327     case GX_SIGNAL(ID_ANIMATED, GX_EVENT_TOGGLE_OFF):
328         gx_radial_slider_animation_set(&radial_slider_screen.radial_slider_screen_radial_slider, 0, 0, 0, GX_NULL);
329         break;
330 
331     case GX_SIGNAL(ID_SET_ANCHOR_LIST, GX_EVENT_TOGGLE_ON):
332         gx_radial_slider_anchor_angles_set(&radial_slider_screen.radial_slider_screen_radial_slider, radial_slider_anchor_list, sizeof(radial_slider_anchor_list) / sizeof(GX_VALUE));
333         break;
334 
335     case GX_SIGNAL(ID_SET_ANCHOR_LIST, GX_EVENT_TOGGLE_OFF):
336         gx_radial_slider_anchor_angles_set(&radial_slider_screen.radial_slider_screen_radial_slider, GX_NULL, 0);
337         break;
338 
339     case GX_SIGNAL(ID_RADIAL_SLIDER, GX_EVENT_SLIDER_VALUE):
340         gx_numeric_prompt_value_set(&radial_slider_screen.radial_slider_screen_radial_slider_value, event_ptr->gx_event_payload.gx_event_intdata[0]);
341         break;
342 
343     default:
344         return gx_window_event_process(window, event_ptr);
345     }
346 
347     return 0;
348 }
349 
drop_list_row_create(GX_VERTICAL_LIST * list,GX_WIDGET * widget,INT index)350 VOID drop_list_row_create(GX_VERTICAL_LIST *list, GX_WIDGET *widget, INT index)
351 {
352 GX_BOOL created;
353 GX_RECTANGLE size;
354 GX_CHAR temp[10];
355 GX_STRING string;
356 
357     DROP_LIST_WIDGET *entry = (DROP_LIST_WIDGET *) widget;
358 
359     GX_STRCPY(entry->text, " List Entry #");
360     gx_utility_ltoa(index + 1, temp, sizeof(temp));
361     GX_STRCAT(entry->text, (char*)temp);
362 
363     gx_widget_created_test(widget, &created);
364 
365     if (!created)
366     {
367         gx_utility_rectangle_define(&size, 0, 0, 100, 30);
368         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);
369         gx_prompt_text_color_set(&entry->prompt, GX_COLOR_ID_CANVAS, GX_COLOR_ID_CANVAS, GX_COLOR_ID_CANVAS);
370     }
371 
372     string.gx_string_ptr = entry->text;
373     string.gx_string_length = strnlen(entry->text, sizeof(entry->text));
374     gx_prompt_text_set_ext(&entry->prompt, &string);
375 }
376 
PopulateDropList(void)377 VOID PopulateDropList(void)
378 {
379     int index;
380     GX_VERTICAL_LIST *list;
381 
382     WINDOW_SCREEN_CONTROL_BLOCK *control = (WINDOW_SCREEN_CONTROL_BLOCK *) pWindowScreen;
383     GX_DROP_LIST *drop = &control->window_screen_drop_list;
384     gx_drop_list_popup_get(drop, &list);
385 
386     for (index = 0; index < DROP_LIST_VISIBLE_ROWS; index++)
387     {
388         drop_list_row_create(list, (GX_WIDGET *) &drop_list_widgets[index], index);
389     }
390 
391     gx_vertical_scrollbar_create(&list_scroll, "list_scroll", list, GX_NULL,
392         GX_SCROLLBAR_VERTICAL | GX_SCROLLBAR_RELATIVE_THUMB | GX_SCROLLBAR_END_BUTTONS | GX_STYLE_ENABLED);
393 
394 }
395 
gauge_prompt_draw(GX_PROMPT * widget)396 VOID gauge_prompt_draw(GX_PROMPT *widget)
397 {
398 GX_STRING text;
399 
400     gx_context_string_get_ext(GX_STRING_ID_STRING_44, &text);
401     gx_context_brush_define(widget->gx_prompt_normal_text_color, 0, GX_BRUSH_UNDERLINE);
402     gx_context_brush_width_set(2);
403     gx_context_font_set(widget->gx_prompt_font_id);
404     gx_canvas_text_draw_ext(widget->gx_widget_size.gx_rectangle_left,
405                             widget->gx_widget_size.gx_rectangle_top,
406                             &text);
407 }
408 
format_func(GX_NUMERIC_PROMPT * prompt,INT value)409 VOID format_func(GX_NUMERIC_PROMPT *prompt, INT value)
410 {
411     gx_utility_ltoa(value % 1000, prompt->gx_numeric_prompt_buffer, GX_NUMERIC_PROMPT_BUFFER_SIZE);
412 }
413 
numeric_pixelmap_format_func(GX_NUMERIC_PIXELMAP_PROMPT * prompt,INT value)414 VOID numeric_pixelmap_format_func(GX_NUMERIC_PIXELMAP_PROMPT *prompt, INT value)
415 {
416     gx_utility_ltoa(value % 1000, prompt->gx_numeric_pixelmap_prompt_buffer, GX_NUMERIC_PROMPT_BUFFER_SIZE);
417 }
418