mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-12-03 06:07:37 +01:00
269 lines
12 KiB
PHP
269 lines
12 KiB
PHP
|
|
{$ifndef __G_MAIN_H__}
|
|
{$define __G_MAIN_H__}
|
|
|
|
//{$include gslist.inc}
|
|
//{$include gthread.inc}
|
|
|
|
type
|
|
PGMainContext = pointer;
|
|
PGMainLoop = pointer;
|
|
|
|
PGSourceFunc = ^TGSourceFunc;
|
|
TGSourceFunc = function (data:gpointer):gboolean;cdecl;
|
|
|
|
{< private > }
|
|
PGSourceCallbackFuncs = ^TGSourceCallbackFuncs;
|
|
|
|
PGSource = ^TGSource;
|
|
PGSourceFuncs = ^TGSourceFuncs;
|
|
|
|
TGSource = record
|
|
callback_data : gpointer;
|
|
callback_funcs : PGSourceCallbackFuncs;
|
|
source_funcs : PGSourceFuncs;
|
|
ref_count : guint;
|
|
context : PGMainContext;
|
|
priority : gint;
|
|
flags : guint;
|
|
source_id : guint;
|
|
poll_fds : PGSList;
|
|
prev : PGSource;
|
|
next : PGSource;
|
|
reserved1 : gpointer;
|
|
reserved2 : gpointer;
|
|
end;
|
|
|
|
TGSourceCallbackFuncs = record
|
|
ref : procedure (cb_data:gpointer); cdecl;
|
|
unref : procedure (cb_data:gpointer); cdecl;
|
|
get : procedure (cb_data:gpointer; source:PGSource; func:PGSourceFunc; data:Pgpointer); cdecl;
|
|
end;
|
|
|
|
TGSourceDummyMarshal = procedure {no parameters} ;cdecl;
|
|
{ Can be NULL }
|
|
{ For use by g_source_set_closure }
|
|
{ Really is of type GClosureMarshal }
|
|
|
|
TGSourceFuncs = record
|
|
prepare : function (source:PGSource; timeout:gint):gboolean; cdecl;
|
|
check : function (source:PGSource):gboolean; cdecl;
|
|
dispatch : function (source:PGSource; callback:TGSourceFunc; user_data:gpointer):gboolean; cdecl;
|
|
finalize : procedure (source:PGSource); cdecl;
|
|
closure_callback : TGSourceFunc;
|
|
closure_marshal : TGSourceDummyMarshal;
|
|
end;
|
|
|
|
{ Any definitions using GPollFD or GPollFunc are primarily
|
|
for Unix and not guaranteed to be the compatible on all
|
|
operating systems on which GLib runs. Right now, the
|
|
GLib does use these functions on Win32 as well, but interprets
|
|
them in a fairly different way than on Unix. If you use
|
|
these definitions, you are should be prepared to recode
|
|
for different operating systems.
|
|
|
|
|
|
On Win32, the fd in a GPollFD should be Win32 HANDLE ( not a file
|
|
descriptor as provided by the C runtime) that can be used by
|
|
MsgWaitForMultipleObjects. This does not include file handles
|
|
from CreateFile, SOCKETs, nor pipe handles. (But you can use
|
|
WSAEventSelect to signal events when a SOCKET is readable).
|
|
|
|
On Win32, fd can also be the special value G_WIN32_MSG_HANDLE to
|
|
indicate polling for messages. These message queue GPollFDs should
|
|
be added with the g_main_poll_win32_msg_add function.
|
|
|
|
But note that G_WIN32_MSG_HANDLE GPollFDs should not be used by GDK
|
|
(GTK) programs, as GDK itself wants to read messages and convert them
|
|
to GDK events.
|
|
|
|
So, unless you really know what you are doing, it's best not to try
|
|
to use the main loop polling stuff for your own needs on
|
|
Win32. It's really only written for the GIMP's needs so
|
|
far.
|
|
}
|
|
|
|
PGPollFD = ^TGPollFD;
|
|
TGPollFD = record
|
|
fd : gint;
|
|
events : gushort;
|
|
revents : gushort;
|
|
end;
|
|
|
|
TGPollFunc = function (ufds:PGPollFD; nfsd:guint; timeout:gint):gint;cdecl;
|
|
|
|
{ Standard priorities }
|
|
|
|
const
|
|
G_PRIORITY_HIGH = -(100);
|
|
G_PRIORITY_DEFAULT = 0;
|
|
G_PRIORITY_HIGH_IDLE = 100;
|
|
G_PRIORITY_DEFAULT_IDLE = 200;
|
|
G_PRIORITY_LOW = 300;
|
|
{ GMainContext: }
|
|
|
|
function g_main_context_new:PGMainContext;cdecl;external gliblib name 'g_main_context_new';
|
|
|
|
procedure g_main_context_ref(context:PGMainContext);cdecl;external gliblib name 'g_main_context_ref';
|
|
|
|
procedure g_main_context_unref(context:PGMainContext);cdecl;external gliblib name 'g_main_context_unref';
|
|
|
|
function g_main_context_default:PGMainContext;cdecl;external gliblib name 'g_main_context_default';
|
|
|
|
function g_main_context_iteration(context:PGMainContext; may_block:gboolean):gboolean;cdecl;external gliblib name 'g_main_context_iteration';
|
|
|
|
function g_main_context_pending(context:PGMainContext):gboolean;cdecl;external gliblib name 'g_main_context_pending';
|
|
|
|
{ For implementation of legacy interfaces
|
|
}
|
|
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';
|
|
|
|
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';
|
|
|
|
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';
|
|
|
|
{ Low level functions for implementing custom main loops.
|
|
}
|
|
procedure g_main_context_wakeup(context:PGMainContext);cdecl;external gliblib name 'g_main_context_wakeup';
|
|
|
|
function g_main_context_acquire(context:PGMainContext):gboolean;cdecl;external gliblib name 'g_main_context_acquire';
|
|
|
|
procedure g_main_context_release(context:PGMainContext);cdecl;external gliblib name 'g_main_context_release';
|
|
|
|
function g_main_context_wait(context:PGMainContext; cond:PGCond; mutex:PGMutex):gboolean;cdecl;external gliblib name 'g_main_context_wait';
|
|
|
|
function g_main_context_prepare(context:PGMainContext; priority:Pgint):gboolean;cdecl;external gliblib name 'g_main_context_prepare';
|
|
|
|
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';
|
|
|
|
function g_main_context_check(context:PGMainContext; max_priority:gint; fds:PGPollFD; n_fds:gint):gint;cdecl;external gliblib name 'g_main_context_check';
|
|
|
|
procedure g_main_context_dispatch(context:PGMainContext);cdecl;external gliblib name 'g_main_context_dispatch';
|
|
|
|
procedure g_main_context_set_poll_func(context:PGMainContext; func:TGPollFunc);cdecl;external gliblib name 'g_main_context_set_poll_func';
|
|
|
|
function g_main_context_get_poll_func(context:PGMainContext):TGPollFunc;cdecl;external gliblib name 'g_main_context_get_poll_func';
|
|
|
|
{ Low level functions for use by source implementations
|
|
}
|
|
procedure g_main_context_add_poll(context:PGMainContext; fd:PGPollFD; priority:gint);cdecl;external gliblib name 'g_main_context_add_poll';
|
|
|
|
procedure g_main_context_remove_poll(context:PGMainContext; fd:PGPollFD);cdecl;external gliblib name 'g_main_context_remove_poll';
|
|
|
|
{ GMainLoop: }
|
|
function g_main_loop_new(context:PGMainContext; is_running:gboolean):PGMainLoop;cdecl;external gliblib name 'g_main_loop_new';
|
|
|
|
procedure g_main_loop_run(loop:PGMainLoop);cdecl;external gliblib name 'g_main_loop_run';
|
|
|
|
procedure g_main_loop_quit(loop:PGMainLoop);cdecl;external gliblib name 'g_main_loop_quit';
|
|
|
|
function g_main_loop_ref(loop:PGMainLoop):PGMainLoop;cdecl;external gliblib name 'g_main_loop_ref';
|
|
|
|
procedure g_main_loop_unref(loop:PGMainLoop);cdecl;external gliblib name 'g_main_loop_unref';
|
|
|
|
function g_main_loop_is_running(loop:PGMainLoop):gboolean;cdecl;external gliblib name 'g_main_loop_is_running';
|
|
|
|
function g_main_loop_get_context(loop:PGMainLoop):PGMainContext;cdecl;external gliblib name 'g_main_loop_get_context';
|
|
|
|
{ GSource: }
|
|
function g_source_new(source_funcs:PGSourceFuncs; struct_size:guint):PGSource;cdecl;external gliblib name 'g_source_new';
|
|
|
|
function g_source_ref(source:PGSource):PGSource;cdecl;external gliblib name 'g_source_ref';
|
|
|
|
procedure g_source_unref(source:PGSource);cdecl;external gliblib name 'g_source_unref';
|
|
|
|
function g_source_attach(source:PGSource; context:PGMainContext):guint;cdecl;external gliblib name 'g_source_attach';
|
|
|
|
procedure g_source_destroy(source:PGSource);cdecl;external gliblib name 'g_source_destroy';
|
|
|
|
procedure g_source_set_priority(source:PGSource; priority:gint);cdecl;external gliblib name 'g_source_set_priority';
|
|
|
|
function g_source_get_priority(source:PGSource):gint;cdecl;external gliblib name 'g_source_get_priority';
|
|
|
|
procedure g_source_set_can_recurse(source:PGSource; can_recurse:gboolean);cdecl;external gliblib name 'g_source_set_can_recurse';
|
|
|
|
function g_source_get_can_recurse(source:PGSource):gboolean;cdecl;external gliblib name 'g_source_get_can_recurse';
|
|
|
|
function g_source_get_id(source:PGSource):guint;cdecl;external gliblib name 'g_source_get_id';
|
|
|
|
function g_source_get_context(source:PGSource):PGMainContext;cdecl;external gliblib name 'g_source_get_context';
|
|
|
|
procedure g_source_set_callback(source:PGSource; func:TGSourceFunc; data:gpointer; notify:TGDestroyNotify);cdecl;external gliblib name 'g_source_set_callback';
|
|
|
|
{ Used to implement g_source_connect_closure and internally }
|
|
procedure g_source_set_callback_indirect(source:PGSource; callback_data:gpointer; callback_funcs:PGSourceCallbackFuncs);cdecl;external gliblib name 'g_source_set_callback_indirect';
|
|
|
|
procedure g_source_add_poll(source:PGSource; fd:PGPollFD);cdecl;external gliblib name 'g_source_add_poll';
|
|
|
|
procedure g_source_remove_poll(source:PGSource; fd:PGPollFD);cdecl;external gliblib name 'g_source_remove_poll';
|
|
|
|
procedure g_source_get_current_time(source:PGSource; timeval:PGTimeVal);cdecl;external gliblib name 'g_source_get_current_time';
|
|
|
|
{ void g_source_connect_closure (GSource source,
|
|
GClosure closure);
|
|
}
|
|
{ Specific source types
|
|
}
|
|
function g_idle_source_new:PGSource;cdecl;external gliblib name 'g_idle_source_new';
|
|
|
|
function g_timeout_source_new(interval:guint):PGSource;cdecl;external gliblib name 'g_timeout_source_new';
|
|
|
|
{ Miscellaneous functions
|
|
}
|
|
procedure g_get_current_time(result:PGTimeVal);cdecl;external gliblib name 'g_get_current_time';
|
|
|
|
{ ============== Compat main loop stuff ================== }
|
|
|
|
function g_main_new(is_running: gboolean): PGMainLoop;
|
|
|
|
|
|
{ these functions are maped to their newer versions }
|
|
procedure g_main_run (loop:PGMainLoop);cdecl;external gliblib name 'g_main_loop_run';
|
|
procedure g_main_quit (loop:PGMainLoop);cdecl;external gliblib name 'g_main_loop_quit';
|
|
procedure g_main_destroy (loop:PGMainLoop);cdecl;external gliblib name 'g_main_loop_unref';
|
|
function g_main_is_running (loop:PGMainLoop):gboolean;cdecl;external gliblib name 'g_main_loop_is_running';
|
|
|
|
|
|
{ Functions to manipulate the default main loop}
|
|
function g_main_iteration (may_block: gboolean): gboolean;
|
|
function g_main_pending: gboolean;
|
|
// g_main_context_pending (NULL)
|
|
procedure g_main_set_poll_func(func: TGPollFunc);
|
|
// g_main_context_set_poll_func (NULL, func)
|
|
|
|
{ ======= end of Compat main loop stuff ================== }
|
|
|
|
{ Source manipulation by ID }
|
|
|
|
function g_source_remove(tag:guint):gboolean;cdecl;external gliblib name 'g_source_remove';
|
|
|
|
function g_source_remove_by_user_data(user_data:gpointer):gboolean;cdecl;external gliblib name 'g_source_remove_by_user_data';
|
|
|
|
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';
|
|
|
|
{ Idles and timeouts }
|
|
function g_timeout_add_full(priority:gint; interval:guint; _function:TGSourceFunc; data:gpointer; notify:TGDestroyNotify):guint;cdecl;external gliblib name 'g_timeout_add_full';
|
|
|
|
function g_timeout_add(interval:guint; _function:TGSourceFunc; data:gpointer):guint;cdecl;external gliblib name 'g_timeout_add';
|
|
|
|
function g_idle_add(_function:TGSourceFunc; data:gpointer):guint;cdecl;external gliblib name 'g_idle_add';
|
|
|
|
function g_idle_add_full(priority:gint; _function:TGSourceFunc; data:gpointer; notify:TGDestroyNotify):guint;cdecl;external gliblib name 'g_idle_add_full';
|
|
|
|
function g_idle_remove_by_data(data:gpointer):gboolean;cdecl;external gliblib name 'g_idle_remove_by_data';
|
|
|
|
{ Hook for GClosure / GSource integration. Don't touch }
|
|
// GLIB_VAR GSourceFuncs g_timeout_funcs;
|
|
// GLIB_VAR GSourceFuncs g_idle_funcs;
|
|
|
|
{$ifdef win32}
|
|
{ This is used to add polling for Windows messages. GDK (GTK+) programs
|
|
should not use this.
|
|
}
|
|
|
|
procedure g_main_poll_win32_msg_add(priority:gint; fd:PGPollFD; hwnd:guint);cdecl;external gliblib name 'g_main_poll_win32_msg_add';
|
|
{$endif}
|
|
|
|
{$endif}
|
|
|