1 /* This is a small demo of the high-performance GUIX graphics framework. */
2 
3 #include <stdio.h>
4 #include "tx_api.h"
5 #include "gx_api.h"
6 #include "gx_validation_utility.h"
7 #include "gx_menu.h"
8 #include "gx_system.h"
9 #include "tx_thread.h"
10 
11 TEST_PARAM test_parameter = {
12     "guix_window_execute", /* Test name */
13     0, 0, 639, 479  /* Define the coordinates of the capture area.
14                          In this test, we only need to capture the line
15                          drawing area.  */
16 };
17 
18 static VOID      control_thread_entry(ULONG);
main(int argc,char ** argv)19 int main(int argc, char ** argv)
20 {
21     /* Parse the command line argument. */
22     gx_validation_setup(argc, argv);
23 
24     /* Start ThreadX system */
25     tx_kernel_enter();
26     return(0);
27 }
28 
tx_application_define(void * first_unused_memory)29 VOID tx_application_define(void *first_unused_memory)
30 {
31 
32     /* Create a dedicated thread to perform various operations
33        on the line drawing example. These operations simulate
34        user input. */
35     gx_validation_control_thread_create(control_thread_entry);
36 
37     /* Termiante the test if it runs for more than 100 ticks */
38     /* This function is not implemented yet. */
39     gx_validation_watchdog_create(100);
40 
41     /* Call the actual line example routine. */
42     gx_validation_application_define(first_unused_memory);
43 
44 }
45 
46 
47 /* Replace the default graphics driver with the validation driver. */
48 #ifdef win32_graphics_driver_setup_24xrgb
49 #undef win32_graphics_driver_setup_24xrgb
50 #endif
51 #define win32_graphics_driver_setup_24xrgb  gx_validation_graphics_driver_setup_24xrgb
52 
53 
54 #ifdef WIN32
55 #undef WIN32
56 #endif
57 
58 #include "gx_validation_wrapper.h"
59 #include "demo_guix_all_widgets_execute.c"
60 
61 typedef struct TEST_STRUCT{
62     INT   event_type;
63     INT   xpos;
64     INT   ypos;
65     char *comment;
66 }TEST;
67 
68 #define USER_EVENT_EXECUTE_WINDOW GX_FIRST_USER_EVENT
69 #define TEST_TIMER_ID 1024
70 TEST test_list[]={
71 {USER_EVENT_EXECUTE_WINDOW, 0,   0, "execute window"},
72 {GX_EVENT_TIMER,            0,   0, "start a timer and return 1"},
73 {USER_EVENT_EXECUTE_WINDOW, 0,   0, "execute window"},
74 {GX_EVENT_HIDE,             0,   0, "send hide event"},
75 {USER_EVENT_EXECUTE_WINDOW, 0,   0, "execute window"},
76 {GX_EVENT_CLOSE,            0,   0, "send close event"},
77 {USER_EVENT_EXECUTE_WINDOW, 0,   0, "execute window"},
78 {0,                         0,   0, "send event 0"},
79 {GX_EVENT_PEN_DOWN,         0,   0, "pen down on (0, 0)"},
80 {GX_EVENT_PEN_DRAG,         0,   0, "pen drag on (0, 0)"},
81 {GX_EVENT_PEN_UP,           0,   0, "pen up on (0, 0)"},
82 {GX_EVENT_PEN_DOWN,       370, 310, "pen down on (370, 310)"},
83 {GX_EVENT_PEN_DRAG,       370, 310, "pen drag on (370, 310)"},
84 {GX_EVENT_PEN_UP,         370, 370, "pen up on (370, 310)"},
85 {0, 0, 0, 0}
86 };
87 
88 GX_BOOL set_return_code = GX_TRUE;
89 GX_BOOL initiate_tx_queue = GX_FALSE;
90 
test_popup_modal_draw(GX_WINDOW * window)91 VOID test_popup_modal_draw(GX_WINDOW *window)
92 {
93     gx_window_draw(window);
94 
95     if(initiate_tx_queue)
96     {
97         /* Delete the event queue.  */
98         _tx_thread_preempt_disable = 1;
99         initiate_tx_queue = GX_FALSE;
100     }
101 }
102 
popup_modal_event_process(GX_WINDOW * window,GX_EVENT * event_ptr)103 UINT popup_modal_event_process(GX_WINDOW *window, GX_EVENT *event_ptr)
104 {
105 ULONG return_code;
106 
107     switch(event_ptr->gx_event_type)
108     {
109         case GX_EVENT_TIMER:
110             if(event_ptr->gx_event_payload.gx_event_timer_id == TEST_TIMER_ID)
111             {
112                 gx_system_timer_stop((GX_WIDGET *)window, TEST_TIMER_ID);
113                 return 1;
114             }
115             break;
116 
117         case USER_EVENT_EXECUTE_WINDOW:
118             gx_widget_attach(&button_screen, &popup_modal);
119             if(set_return_code)
120             {
121                 gx_window_execute((GX_WINDOW *)&popup_modal, &return_code);
122             }
123             else
124             {
125                 gx_window_execute((GX_WINDOW *)&popup_modal, GX_NULL);
126             }
127             _tx_thread_preempt_disable = 0;
128             break;
129 
130         default:
131             return gx_window_event_process(window, event_ptr);
132     }
133     return 0;
134 }
135 
control_thread_entry(ULONG input)136 static VOID control_thread_entry(ULONG input)
137 {
138 INT        frame_id = 1;
139 GX_EVENT   my_event;
140 TEST      *entry = test_list;
141 
142     gx_widget_event_process_set((GX_WIDGET *)&popup_modal, popup_modal_event_process);
143     gx_widget_draw_set(&popup_modal, test_popup_modal_draw);
144 
145     memset(&my_event, 0, sizeof(GX_EVENT));
146     my_event.gx_event_display_handle = 1;
147 
148     while(entry->comment)
149     {
150         /* Simulate click on text button to execute window. */
151         switch(entry->event_type)
152         {
153         case GX_EVENT_TIMER:
154             gx_system_timer_start((GX_WIDGET *)&popup_modal, TEST_TIMER_ID, 1, 1);
155             tx_thread_sleep(2);
156             break;
157 
158         case GX_EVENT_PEN_DOWN:
159         case GX_EVENT_PEN_UP:
160         case GX_EVENT_PEN_DRAG:
161             my_event.gx_event_type = entry->event_type;
162             my_event.gx_event_target = GX_NULL;
163             my_event.gx_event_sender = 0;
164             my_event.gx_event_payload.gx_event_pointdata.gx_point_x = entry->xpos;
165             my_event.gx_event_payload.gx_event_pointdata.gx_point_y = entry->ypos;
166             gx_system_event_send(&my_event);
167             break;
168 
169         default:
170             my_event.gx_event_type = entry->event_type;
171             my_event.gx_event_target = (GX_WIDGET *)&popup_modal;
172             my_event.gx_event_sender = 0;
173             gx_system_event_send(&my_event);
174             break;
175         }
176 
177         gx_validation_set_frame_id(frame_id++);
178         gx_validation_set_frame_comment(entry->comment);
179         gx_validation_screen_refresh();
180         entry++;
181     }
182 
183     initiate_tx_queue = GX_TRUE;
184 
185     gx_validation_screen_refresh();
186     if(_gx_system_last_error != GX_SYSTEM_EVENT_RECEIVE_ERROR)
187     {
188         exit(1);
189     }
190 
191     initiate_tx_queue = GX_TRUE;
192     set_return_code = GX_FALSE;
193 
194     /* Execute window. */
195     my_event.gx_event_type = USER_EVENT_EXECUTE_WINDOW;
196     my_event.gx_event_target = (GX_WIDGET *)&popup_modal;
197     my_event.gx_event_sender = 0;
198     gx_system_event_send(&my_event);
199 
200     gx_validation_screen_refresh();
201     if(_gx_system_last_error != GX_SYSTEM_EVENT_RECEIVE_ERROR)
202     {
203         exit(2);
204     }
205 
206     /* execute window. */
207     my_event.gx_event_type = USER_EVENT_EXECUTE_WINDOW;
208     my_event.gx_event_target = (GX_WIDGET *)&popup_modal;
209     my_event.gx_event_sender = 0;
210     gx_system_event_send(&my_event);
211     gx_system_event_send(&my_event);
212 
213     /* terminate executetion. */
214     my_event.gx_event_type = GX_EVENT_TERMINATE;
215     my_event.gx_event_target = (GX_WIDGET *)&popup_modal;
216     my_event.gx_event_sender = 0;
217     gx_system_event_send(&my_event);
218 
219     tx_thread_sleep(5);
220 
221     gx_validation_end();
222 
223     exit(0);
224 }
225 
226