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