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_565bgr_resources.h"
6 #include "all_widgets_565bgr_specifications.h"
7 
8 #define DROP_LIST_VISIBLE_ROWS 5
9 #define NUMBER_ANIMATION_TIMER 2
10 
11 #define MEMORY_PIXELS (MAIN_DISPLAY_X_RESOLUTION * MAIN_DISPLAY_X_RESOLUTION)
12 #define NESTED_WINDOW_WIDTH  94
13 #define NESTED_WINDOW_HEIGHT  73
14 
15 /* Define the ThreadX demo thread control block and stack.  */
16 
17 TX_THREAD          demo_thread;
18 UCHAR              demo_thread_stack[4096];
19 GX_WINDOW_ROOT    *root;
20 
21 TX_BYTE_POOL       memory_pool;
22 GX_COLOR           memory_buffer[MEMORY_PIXELS];
23 
24 GX_WINDOW          NestedWindow;
25 GX_WINDOW_ROOT     nested_root;
26 
27 GX_COLOR           composite_canvas_memory[MEMORY_PIXELS];
28 GX_COLOR           animation_canvas_memory[NESTED_WINDOW_WIDTH * NESTED_WINDOW_HEIGHT];
29 
30 GX_CANVAS          composite_canvas;
31 GX_CANVAS          animation_canvas;
32 GX_SCROLLBAR       list_scroll;
33 
34 typedef struct {
35     GX_PROMPT prompt;
36     CHAR text[80];
37 } DROP_LIST_WIDGET;
38 
39 DROP_LIST_WIDGET drop_list_widgets[DROP_LIST_VISIBLE_ROWS + 1];
40 
41 INT numeric_prompt_value = 10000;
42 
43 /* Define prototypes.   */
44 VOID PopulateDropList();
45 VOID demo_thread_entry(ULONG thread_input);
46 VOID *memory_allocate(ULONG size);
47 VOID memory_free(VOID* mem);
48 extern UINT win32_graphics_driver_setup_565bgr(GX_DISPLAY *display);
49 
main(int argc,char ** argv)50 int main(int argc, char ** argv)
51 {
52   tx_kernel_enter();
53   return(0);
54 }
55 
memory_allocate(ULONG size)56 VOID *memory_allocate(ULONG size)
57 {
58     VOID *memptr;
59 
60     if (tx_byte_allocate(&memory_pool, &memptr, size, TX_NO_WAIT) == TX_SUCCESS)
61     {
62         return memptr;
63     }
64 
65     return NULL;
66 }
67 
memory_free(VOID * mem)68 VOID memory_free(VOID *mem)
69 {
70     tx_byte_release(mem);
71 }
72 
tx_application_define(void * first_unused_memory)73 VOID tx_application_define(void *first_unused_memory)
74 {
75     /* Create the main demo thread.  */
76     tx_thread_create(&demo_thread, "GUIX Demo Thread", demo_thread_entry,
77                      0,  demo_thread_stack, sizeof(demo_thread_stack),
78                      1, 1, TX_NO_TIME_SLICE, TX_AUTO_START);
79 }
80 
81 
demo_thread_entry(ULONG thread_input)82 VOID  demo_thread_entry(ULONG thread_input)
83 {
84     GX_RECTANGLE winsize;
85 
86     tx_byte_pool_create(&memory_pool, "memory pool", memory_buffer, MEMORY_PIXELS * sizeof(GX_COLOR));
87 
88     /* Initialize GUIX.  */
89     gx_system_initialize();
90 
91     gx_studio_display_configure(MAIN_DISPLAY, win32_graphics_driver_setup_565bgr,
92                                 LANGUAGE_ENGLISH, MAIN_DISPLAY_THEME_1, &root);
93 
94     /* create the button screen */
95     gx_studio_named_widget_create("button_screen", (GX_WIDGET *) root, GX_NULL);
96 
97     /* create the text widget screen */
98     gx_studio_named_widget_create("text_screen", GX_NULL, GX_NULL);
99 
100     /* create the windows screen */
101     gx_studio_named_widget_create("window_screen", GX_NULL, GX_NULL);
102     PopulateDropList();
103 
104     /* create the indicator screen */
105     gx_studio_named_widget_create("indicator_screen", GX_NULL, GX_NULL);
106 
107     /* create the shapes screen */
108     gx_studio_named_widget_create("shapes_screen", GX_NULL, GX_NULL);
109 
110     /* create the rotate screen */
111     gx_studio_named_widget_create("rotate_screen", GX_NULL, GX_NULL);
112 
113     /* create the resize screen */
114     gx_studio_named_widget_create("resize_screen", GX_NULL, GX_NULL);
115 
116     /* create menu screen */
117     gx_studio_named_widget_create("menu_screen", GX_NULL, GX_NULL);
118 
119     /* create lines screen */
120     gx_studio_named_widget_create("lines_screen", GX_NULL, GX_NULL);
121 
122     /* create circular gauge screen */
123     gx_studio_named_widget_create("gauge_screen", GX_NULL, GX_NULL);
124 
125     /* create scroll wheel screen */
126     gx_studio_named_widget_create("scroll_wheel_screen", GX_NULL, GX_NULL);
127 
128     /* create scroll wheel screen */
129     gx_studio_named_widget_create("pixelmap_screen", GX_NULL, GX_NULL);
130 
131     /* Show the root window to make it and patients screen visible.  */
132     gx_widget_show(root);
133 
134     /* create the composite canvas used during animations */
135     gx_canvas_create(&composite_canvas, GX_NULL,
136         root->gx_window_root_canvas->gx_canvas_display,
137         GX_CANVAS_COMPOSITE,
138         root->gx_widget_size.gx_rectangle_right - root->gx_widget_size.gx_rectangle_left + 1,
139         root->gx_widget_size.gx_rectangle_bottom - root->gx_widget_size.gx_rectangle_top + 1,
140         composite_canvas_memory, MEMORY_PIXELS * sizeof(GX_COLOR));
141     gx_canvas_alpha_set(&composite_canvas, 255);
142 
143     /* create the nested window shown on the window screen */
144 
145     winsize.gx_rectangle_left = winsize.gx_rectangle_top = 0;
146     winsize.gx_rectangle_right = NESTED_WINDOW_WIDTH - 1;
147     winsize.gx_rectangle_bottom = NESTED_WINDOW_HEIGHT - 1;
148     gx_window_create(&NestedWindow, GX_NULL, GX_NULL, GX_STYLE_BORDER_THIN, 0, &winsize);
149     gx_widget_fill_color_set(&NestedWindow, GX_COLOR_ID_BLUE, GX_COLOR_ID_BLUE, GX_COLOR_ID_BLUE);
150 
151     /* create the root window used for window blend animation */
152     gx_window_root_create(&nested_root, "nested_root", &animation_canvas, GX_STYLE_BORDER_NONE, GX_NULL, &NestedWindow.gx_widget_size);
153     gx_widget_attach((GX_WIDGET *)&nested_root, (GX_WIDGET *)&NestedWindow);
154 
155     /* let GUIX run */
156     gx_system_start();
157     gx_system_memory_allocator_set(memory_allocate, memory_free);
158 
159 }
160 
ToggleScreen(GX_WINDOW * new_win,GX_WINDOW * old_win)161 void ToggleScreen(GX_WINDOW *new_win, GX_WINDOW *old_win)
162 {
163     if (!new_win->gx_widget_parent)
164     {
165         gx_widget_attach(root, (GX_WIDGET *) new_win);
166     }
167     else
168     {
169         gx_widget_show((GX_WIDGET *) new_win);
170     }
171     gx_widget_hide((GX_WIDGET *) old_win);
172 }
173 
next_button_handler(GX_WINDOW * window,GX_EVENT * event_ptr)174 UINT next_button_handler(GX_WINDOW *window, GX_EVENT *event_ptr)
175 {
176     switch(event_ptr->gx_event_type)
177     {
178     case GX_EVENT_SHOW:
179         gx_window_event_process(window, event_ptr);
180         if (window->gx_widget_id == ID_WINDOW_SCREEN)
181         {
182             /* Create new canvas to save the semi-transparent window,
183             Then set alpha to canvas and shift it.                      */
184             gx_canvas_create(&animation_canvas, GX_NULL,
185                 root->gx_window_root_canvas->gx_canvas_display,
186                 GX_CANVAS_MANAGED_VISIBLE,
187                 NESTED_WINDOW_WIDTH, NESTED_WINDOW_HEIGHT,
188                 animation_canvas_memory, NESTED_WINDOW_WIDTH * NESTED_WINDOW_HEIGHT * sizeof(GX_COLOR));
189             gx_canvas_alpha_set(&animation_canvas, 255);
190             gx_canvas_offset_set(&animation_canvas, 84, 47);
191             gx_canvas_shift(&animation_canvas, 10, 20);
192             gx_widget_show((GX_WIDGET *)&nested_root);
193 
194             gx_window_client_scroll(&window_screen.window_screen_scroll_frame_1, 1, 1);
195         }
196         break;
197 
198     case GX_EVENT_HIDE:
199         if (window->gx_widget_id == ID_WINDOW_SCREEN)
200         {
201             gx_widget_hide((GX_WIDGET *)&nested_root);
202             gx_canvas_delete(&animation_canvas);
203         }
204         else if (window->gx_widget_id == ID_TEXT_SCREEN)
205         {
206             gx_system_timer_stop(window, NUMBER_ANIMATION_TIMER);
207         }
208         gx_window_event_process(window, event_ptr);
209         break;
210 
211     default:
212         return gx_window_event_process(window, event_ptr);
213     }
214     return 0;
215 }
216 
drop_list_row_create(GX_VERTICAL_LIST * list,GX_WIDGET * widget,INT index)217 VOID drop_list_row_create(GX_VERTICAL_LIST *list, GX_WIDGET *widget, INT index)
218 {
219 GX_BOOL created;
220 GX_RECTANGLE size;
221 GX_CHAR temp[10];
222 GX_STRING string;
223 
224     DROP_LIST_WIDGET *entry = (DROP_LIST_WIDGET *) widget;
225 
226     GX_STRCPY(entry->text, "List Entry #");
227     gx_utility_ltoa(index + 1, temp, 10);
228     GX_STRCAT(entry->text, (char*)temp);
229 
230     gx_widget_created_test(widget, &created);
231 
232     if (!created)
233     {
234         gx_utility_rectangle_define(&size, 0, 0, 100, 30);
235         gx_prompt_create(&entry->prompt, entry->text, list, 0, GX_STYLE_ENABLED|GX_STYLE_TEXT_LEFT|GX_STYLE_BORDER_NONE, 0, &size);
236         gx_widget_fill_color_set(&entry->prompt, GX_COLOR_ID_BLACK, GX_COLOR_ID_BLUE, GX_COLOR_ID_BLACK);
237         gx_prompt_text_color_set(&entry->prompt, GX_COLOR_ID_WHITE, GX_COLOR_ID_WHITE, GX_COLOR_ID_WHITE);
238     }
239 
240     string.gx_string_ptr = entry->text;
241     string.gx_string_length = strnlen(entry->text, sizeof(entry->text));
242     gx_prompt_text_set_ext(&entry->prompt, &string);
243 }
244 
PopulateDropList(void)245 VOID PopulateDropList(void)
246 {
247     int index;
248     GX_VERTICAL_LIST *list;
249 
250     WINDOW_SCREEN_CONTROL_BLOCK *control = (WINDOW_SCREEN_CONTROL_BLOCK *) &window_screen;
251     GX_DROP_LIST *drop = &control->window_screen_drop_list;
252     gx_drop_list_popup_get(drop, &list);
253 
254     for (index = 0; index < DROP_LIST_VISIBLE_ROWS; index++)
255     {
256         drop_list_row_create(list, (GX_WIDGET *) &drop_list_widgets[index], index);
257     }
258 
259     gx_vertical_scrollbar_create(&list_scroll, "list_scroll", list, GX_NULL,
260         GX_SCROLLBAR_VERTICAL | GX_SCROLLBAR_RELATIVE_THUMB | GX_SCROLLBAR_END_BUTTONS | GX_STYLE_ENABLED);
261 
262 }