1 #include "tx_api.h"
2 
3 #include "gx_api.h"
4 #include "gx_system.h"
5 #include "gx_win32_studio_display_driver.h"
6 #include "studiox_screen_driver.h"
7 
8 #ifdef _DEBUG
9 #define new DEBUG_NEW
10 
11 #define _CRTDBG_MAP_ALLOC
12 #include <stdlib.h>
13 #include <crtdbg.h>
14 
15 #endif
16 
17 GX_WINDOW_ROOT *get_root_window(void);
18 extern HWND GetGuixWinHandle(void);
19 
20 #define MAX_WIN32_EVENTS 64
21 HANDLE gx_win32_event_semaphore;
22 HANDLE gx_win32_lock_mutex;
23 
24 typedef struct win32_event_struct {
25   GX_EVENT event;
26   struct win32_event_struct *next;
27 } win32_event;
28 
29 win32_event win32_event_memory[MAX_WIN32_EVENTS];
30 
31 win32_event *gx_win32_event_queue;
32 win32_event *gx_win32_free_events;
33 
gx_generic_rtos_initialize(VOID)34 VOID  gx_generic_rtos_initialize(VOID)
35 {
36     int loop;
37     win32_event *new_event;
38 
39     gx_win32_free_events = NULL;
40     gx_win32_event_queue = NULL;
41 
42     gx_win32_lock_mutex = CreateMutex(NULL, FALSE, NULL);
43 
44     gx_win32_event_semaphore = CreateSemaphore(
45         NULL,           // default security attributes
46         0,  // initial count
47         MAX_WIN32_EVENTS,  // maximum count
48         NULL);          // unnamed semaphore
49 
50     new_event = win32_event_memory;
51     new_event += MAX_WIN32_EVENTS - 1;
52 
53     for (loop = 0; loop < MAX_WIN32_EVENTS; loop++)
54     {
55         new_event->next = gx_win32_free_events;
56         gx_win32_free_events = new_event;
57         new_event--;
58     }
59 }
60 
gx_generic_thread_start(VOID (* guix_thread_entry)(ULONG))61 UINT  gx_generic_thread_start(VOID(*guix_thread_entry)(ULONG))
62 {
63     return 0;
64 }
65 
gx_generic_event_post(GX_EVENT * event_ptr)66 UINT  gx_generic_event_post(GX_EVENT *event_ptr)
67 {
68     win32_event *new_event;
69     win32_event *last_event;
70     GX_WIN32_DISPLAY_DRIVER_DATA *data = gx_win32_get_data_instance_by_thread_id(GetCurrentThreadId());
71 
72     if (!data)
73     {
74         data = gx_win32_get_data_instance_by_win_handle(get_target_win_handle());
75     }
76 
77     if (!gx_win32_free_events || !data)
78     {
79         return 0;
80     }
81 
82     if (data->win32_driver_winhandle == GetGuixWinHandle())
83     {
84         return _gx_system_event_dispatch(event_ptr);
85     }
86 
87     if (data->win32_root_win && !(data->win32_root_win->gx_widget_status & GX_STATUS_VISIBLE))
88     {
89         return 0;
90     }
91 
92     GX_ENTER_CRITICAL
93     new_event = gx_win32_free_events;
94     gx_win32_free_events = new_event->next;
95 
96     new_event->event = *event_ptr;
97     new_event->next = NULL;
98 
99     if (gx_win32_event_queue)
100     {
101         last_event = gx_win32_event_queue;
102         while(last_event->next)
103         {
104             last_event = last_event->next;
105         }
106         last_event->next = new_event;
107     }
108     else
109     {
110         gx_win32_event_queue = new_event;
111     }
112     ReleaseSemaphore(gx_win32_event_semaphore, 1, NULL);
113     GX_EXIT_CRITICAL
114     return 0;
115 }
116 
gx_generic_event_fold(GX_EVENT * event_ptr)117 UINT  gx_generic_event_fold(GX_EVENT *event_ptr)
118 {
119     gx_generic_event_post(event_ptr);
120     return 0;
121 }
122 
gx_generic_event_purge(GX_WIDGET * widget)123 VOID  gx_generic_event_purge(GX_WIDGET *widget)
124 {
125 }
126 
gx_generic_event_pop(GX_EVENT * put_event,GX_BOOL wait)127 UINT  gx_generic_event_pop(GX_EVENT *put_event, GX_BOOL wait)
128 {
129     win32_event *pEvent;
130     DWORD result;
131 
132     if (wait)
133     {
134         result = WaitForSingleObject(gx_win32_event_semaphore, INFINITE);
135     }
136     else
137     {
138         result = WaitForSingleObject(gx_win32_event_semaphore, 0);
139     }
140 
141     if (result == 0)
142     {
143         // succcess
144         GX_ENTER_CRITICAL
145             pEvent = gx_win32_event_queue;
146 
147         if (pEvent == NULL)
148         {
149             GX_EXIT_CRITICAL
150                 return GX_FAILURE;
151         }
152 
153         // pop the event from active queue:
154         gx_win32_event_queue = pEvent->next;;
155 
156         // store event in GUIX event structure
157         *put_event = pEvent->event;
158 
159         // link the event into the free event queue:
160         pEvent->next = gx_win32_free_events;
161         gx_win32_free_events = pEvent;
162 
163         GX_EXIT_CRITICAL
164         return GX_SUCCESS;
165     }
166 
167     return GX_FAILURE;
168 }
169 
gx_generic_timer_start(VOID)170 VOID  gx_generic_timer_start(VOID)
171 {
172 }
173 
gx_generic_timer_stop(VOID)174 VOID  gx_generic_timer_stop(VOID)
175 {
176 }
177 
gx_generic_system_mutex_lock(VOID)178 VOID  gx_generic_system_mutex_lock(VOID)
179 {
180     WaitForSingleObject(gx_win32_lock_mutex, INFINITE);
181 }
182 
gx_generic_system_mutex_unlock(VOID)183 VOID  gx_generic_system_mutex_unlock(VOID)
184 {
185     ReleaseMutex(gx_win32_lock_mutex);
186 }
187 
gx_generic_system_time_get(VOID)188 ULONG gx_generic_system_time_get(VOID)
189 {
190     return GetTickCount() / GX_SYSTEM_TIMER_MS;
191 }
192 
gx_generic_thread_identify(VOID)193 VOID *gx_generic_thread_identify(VOID)
194 {
195     return (VOID *) GetCurrentThreadId();
196 }
197 
198 
199 
200 
201 
202