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