5
//{$include gslist.inc}
6
//{$include gthread.inc}
9
PGMainContext = pointer;
12
PGSourceFunc = ^TGSourceFunc;
13
TGSourceFunc = function (data:gpointer):gboolean;cdecl;
16
PGSourceCallbackFuncs = ^TGSourceCallbackFuncs;
19
PGSourceFuncs = ^TGSourceFuncs;
22
callback_data : gpointer;
23
callback_funcs : PGSourceCallbackFuncs;
24
source_funcs : PGSourceFuncs;
26
context : PGMainContext;
37
TGSourceCallbackFuncs = record
38
ref : procedure (cb_data:gpointer); cdecl;
39
unref : procedure (cb_data:gpointer); cdecl;
40
get : procedure (cb_data:gpointer; source:PGSource; func:PGSourceFunc; data:Pgpointer); cdecl;
43
TGSourceDummyMarshal = procedure {no parameters} ;cdecl;
45
{ For use by g_source_set_closure }
46
{ Really is of type GClosureMarshal }
48
TGSourceFuncs = record
49
prepare : function (source:PGSource; timeout:gint):gboolean; cdecl;
50
check : function (source:PGSource):gboolean; cdecl;
51
dispatch : function (source:PGSource; callback:TGSourceFunc; user_data:gpointer):gboolean; cdecl;
52
finalize : procedure (source:PGSource); cdecl;
53
closure_callback : TGSourceFunc;
54
closure_marshal : TGSourceDummyMarshal;
57
{ Any definitions using GPollFD or GPollFunc are primarily
58
for Unix and not guaranteed to be the compatible on all
59
operating systems on which GLib runs. Right now, the
60
GLib does use these functions on Win32 as well, but interprets
61
them in a fairly different way than on Unix. If you use
62
these definitions, you are should be prepared to recode
63
for different operating systems.
66
On Win32, the fd in a GPollFD should be Win32 HANDLE ( not a file
67
descriptor as provided by the C runtime) that can be used by
68
MsgWaitForMultipleObjects. This does not include file handles
69
from CreateFile, SOCKETs, nor pipe handles. (But you can use
70
WSAEventSelect to signal events when a SOCKET is readable).
72
On Win32, fd can also be the special value G_WIN32_MSG_HANDLE to
73
indicate polling for messages. These message queue GPollFDs should
74
be added with the g_main_poll_win32_msg_add function.
76
But note that G_WIN32_MSG_HANDLE GPollFDs should not be used by GDK
77
(GTK) programs, as GDK itself wants to read messages and convert them
80
So, unless you really know what you are doing, it's best not to try
81
to use the main loop polling stuff for your own needs on
82
Win32. It's really only written for the GIMP's needs so
93
TGPollFunc = function (ufds:PGPollFD; nfsd:guint; timeout:gint):gint;cdecl;
95
{ Standard priorities }
98
G_PRIORITY_HIGH = -(100);
99
G_PRIORITY_DEFAULT = 0;
100
G_PRIORITY_HIGH_IDLE = 100;
101
G_PRIORITY_DEFAULT_IDLE = 200;
102
G_PRIORITY_LOW = 300;
105
function g_main_context_new:PGMainContext;cdecl;external gliblib name 'g_main_context_new';
107
procedure g_main_context_ref(context:PGMainContext);cdecl;external gliblib name 'g_main_context_ref';
109
procedure g_main_context_unref(context:PGMainContext);cdecl;external gliblib name 'g_main_context_unref';
111
function g_main_context_default:PGMainContext;cdecl;external gliblib name 'g_main_context_default';
113
function g_main_context_iteration(context:PGMainContext; may_block:gboolean):gboolean;cdecl;external gliblib name 'g_main_context_iteration';
115
function g_main_context_pending(context:PGMainContext):gboolean;cdecl;external gliblib name 'g_main_context_pending';
117
{ For implementation of legacy interfaces
119
function g_main_context_find_source_by_id(context:PGMainContext; source_id:guint):PGSource;cdecl;external gliblib name 'g_main_context_find_source_by_id';
121
function g_main_context_find_source_by_user_data(context:PGMainContext; user_data:gpointer):PGSource;cdecl;external gliblib name 'g_main_context_find_source_by_user_data';
123
function g_main_context_find_source_by_funcs_user_data(context:PGMainContext; funcs:PGSourceFuncs; user_data:gpointer):PGSource;cdecl;external gliblib name 'g_main_context_find_source_by_funcs_user_data';
125
{ Low level functions for implementing custom main loops.
127
procedure g_main_context_wakeup(context:PGMainContext);cdecl;external gliblib name 'g_main_context_wakeup';
129
function g_main_context_acquire(context:PGMainContext):gboolean;cdecl;external gliblib name 'g_main_context_acquire';
131
procedure g_main_context_release(context:PGMainContext);cdecl;external gliblib name 'g_main_context_release';
133
function g_main_context_wait(context:PGMainContext; cond:PGCond; mutex:PGMutex):gboolean;cdecl;external gliblib name 'g_main_context_wait';
135
function g_main_context_prepare(context:PGMainContext; priority:Pgint):gboolean;cdecl;external gliblib name 'g_main_context_prepare';
137
function g_main_context_query(context:PGMainContext; max_priority:gint; timeout:Pgint; fds:PGPollFD; n_fds:gint):gint;cdecl;external gliblib name 'g_main_context_query';
139
function g_main_context_check(context:PGMainContext; max_priority:gint; fds:PGPollFD; n_fds:gint):gint;cdecl;external gliblib name 'g_main_context_check';
141
procedure g_main_context_dispatch(context:PGMainContext);cdecl;external gliblib name 'g_main_context_dispatch';
143
procedure g_main_context_set_poll_func(context:PGMainContext; func:TGPollFunc);cdecl;external gliblib name 'g_main_context_set_poll_func';
145
function g_main_context_get_poll_func(context:PGMainContext):TGPollFunc;cdecl;external gliblib name 'g_main_context_get_poll_func';
147
{ Low level functions for use by source implementations
149
procedure g_main_context_add_poll(context:PGMainContext; fd:PGPollFD; priority:gint);cdecl;external gliblib name 'g_main_context_add_poll';
151
procedure g_main_context_remove_poll(context:PGMainContext; fd:PGPollFD);cdecl;external gliblib name 'g_main_context_remove_poll';
154
function g_main_loop_new(context:PGMainContext; is_running:gboolean):PGMainLoop;cdecl;external gliblib name 'g_main_loop_new';
156
procedure g_main_loop_run(loop:PGMainLoop);cdecl;external gliblib name 'g_main_loop_run';
158
procedure g_main_loop_quit(loop:PGMainLoop);cdecl;external gliblib name 'g_main_loop_quit';
160
function g_main_loop_ref(loop:PGMainLoop):PGMainLoop;cdecl;external gliblib name 'g_main_loop_ref';
162
procedure g_main_loop_unref(loop:PGMainLoop);cdecl;external gliblib name 'g_main_loop_unref';
164
function g_main_loop_is_running(loop:PGMainLoop):gboolean;cdecl;external gliblib name 'g_main_loop_is_running';
166
function g_main_loop_get_context(loop:PGMainLoop):PGMainContext;cdecl;external gliblib name 'g_main_loop_get_context';
169
function g_source_new(source_funcs:PGSourceFuncs; struct_size:guint):PGSource;cdecl;external gliblib name 'g_source_new';
171
function g_source_ref(source:PGSource):PGSource;cdecl;external gliblib name 'g_source_ref';
173
procedure g_source_unref(source:PGSource);cdecl;external gliblib name 'g_source_unref';
175
function g_source_attach(source:PGSource; context:PGMainContext):guint;cdecl;external gliblib name 'g_source_attach';
177
procedure g_source_destroy(source:PGSource);cdecl;external gliblib name 'g_source_destroy';
179
procedure g_source_set_priority(source:PGSource; priority:gint);cdecl;external gliblib name 'g_source_set_priority';
181
function g_source_get_priority(source:PGSource):gint;cdecl;external gliblib name 'g_source_get_priority';
183
procedure g_source_set_can_recurse(source:PGSource; can_recurse:gboolean);cdecl;external gliblib name 'g_source_set_can_recurse';
185
function g_source_get_can_recurse(source:PGSource):gboolean;cdecl;external gliblib name 'g_source_get_can_recurse';
187
function g_source_get_id(source:PGSource):guint;cdecl;external gliblib name 'g_source_get_id';
189
function g_source_get_context(source:PGSource):PGMainContext;cdecl;external gliblib name 'g_source_get_context';
191
procedure g_source_set_callback(source:PGSource; func:TGSourceFunc; data:gpointer; notify:TGDestroyNotify);cdecl;external gliblib name 'g_source_set_callback';
193
{ Used to implement g_source_connect_closure and internally }
194
procedure g_source_set_callback_indirect(source:PGSource; callback_data:gpointer; callback_funcs:PGSourceCallbackFuncs);cdecl;external gliblib name 'g_source_set_callback_indirect';
196
procedure g_source_add_poll(source:PGSource; fd:PGPollFD);cdecl;external gliblib name 'g_source_add_poll';
198
procedure g_source_remove_poll(source:PGSource; fd:PGPollFD);cdecl;external gliblib name 'g_source_remove_poll';
200
procedure g_source_get_current_time(source:PGSource; timeval:PGTimeVal);cdecl;external gliblib name 'g_source_get_current_time';
202
{ void g_source_connect_closure (GSource source,
205
{ Specific source types
207
function g_idle_source_new:PGSource;cdecl;external gliblib name 'g_idle_source_new';
209
function g_timeout_source_new(interval:guint):PGSource;cdecl;external gliblib name 'g_timeout_source_new';
211
{ Miscellaneous functions
213
procedure g_get_current_time(result:PGTimeVal);cdecl;external gliblib name 'g_get_current_time';
215
{ ============== Compat main loop stuff ================== }
217
function g_main_new(is_running: gboolean): PGMainLoop;
220
{ these functions are maped to their newer versions }
221
procedure g_main_run (loop:PGMainLoop);cdecl;external gliblib name 'g_main_loop_run';
222
procedure g_main_quit (loop:PGMainLoop);cdecl;external gliblib name 'g_main_loop_quit';
223
procedure g_main_destroy (loop:PGMainLoop);cdecl;external gliblib name 'g_main_loop_unref';
224
function g_main_is_running (loop:PGMainLoop):gboolean;cdecl;external gliblib name 'g_main_loop_is_running';
227
{ Functions to manipulate the default main loop}
228
function g_main_iteration (may_block: gboolean): gboolean;
229
function g_main_pending: gboolean;
230
// g_main_context_pending (NULL)
231
procedure g_main_set_poll_func(func: TGPollFunc);
232
// g_main_context_set_poll_func (NULL, func)
234
{ ======= end of Compat main loop stuff ================== }
236
{ Source manipulation by ID }
238
function g_source_remove(tag:guint):gboolean;cdecl;external gliblib name 'g_source_remove';
240
function g_source_remove_by_user_data(user_data:gpointer):gboolean;cdecl;external gliblib name 'g_source_remove_by_user_data';
242
function g_source_remove_by_funcs_user_data(funcs:PGSourceFuncs; user_data:gpointer):gboolean;cdecl;external gliblib name 'g_source_remove_by_funcs_user_data';
244
{ Idles and timeouts }
245
function g_timeout_add_full(priority:gint; interval:guint; _function:TGSourceFunc; data:gpointer; notify:TGDestroyNotify):guint;cdecl;external gliblib name 'g_timeout_add_full';
247
function g_timeout_add(interval:guint; _function:TGSourceFunc; data:gpointer):guint;cdecl;external gliblib name 'g_timeout_add';
249
function g_idle_add(_function:TGSourceFunc; data:gpointer):guint;cdecl;external gliblib name 'g_idle_add';
251
function g_idle_add_full(priority:gint; _function:TGSourceFunc; data:gpointer; notify:TGDestroyNotify):guint;cdecl;external gliblib name 'g_idle_add_full';
253
function g_idle_remove_by_data(data:gpointer):gboolean;cdecl;external gliblib name 'g_idle_remove_by_data';
255
{ Hook for GClosure / GSource integration. Don't touch }
256
// GLIB_VAR GSourceFuncs g_timeout_funcs;
257
// GLIB_VAR GSourceFuncs g_idle_funcs;
260
{ This is used to add polling for Windows messages. GDK (GTK+) programs
264
procedure g_main_poll_win32_msg_add(priority:gint; fd:PGPollFD; hwnd:guint);cdecl;external gliblib name 'g_main_poll_win32_msg_add';