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