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