tSupport for GTK+ timeouts added to Windows port - vaccinewars - be a doctor an… | |
git clone git://src.adamsgaard.dk/vaccinewars | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit e40abf49838d86a57c90f8bb5bd384b6e2a982b8 | |
parent 84b3f77040b303ad27ecafea95e0fe6a5b48dcb7 | |
Author: Ben Webb <[email protected]> | |
Date: Tue, 10 Apr 2001 13:19:21 +0000 | |
Support for GTK+ timeouts added to Windows port | |
Diffstat: | |
M src/gtkport.c | 75 +++++++++++++++++++++++++++++… | |
M src/gtkport.h | 3 +++ | |
2 files changed, 78 insertions(+), 0 deletions(-) | |
--- | |
diff --git a/src/gtkport.c b/src/gtkport.c | |
t@@ -242,6 +242,15 @@ struct _GdkInput { | |
gpointer data; | |
}; | |
+typedef struct _GtkTimeout GtkTimeout; | |
+ | |
+struct _GtkTimeout { | |
+ guint32 interval; | |
+ GtkFunction function; | |
+ gpointer data; | |
+ guint id; | |
+}; | |
+ | |
typedef struct _GtkItemFactoryChild GtkItemFactoryChild; | |
struct _GtkItemFactoryChild { | |
t@@ -621,6 +630,7 @@ static HINSTANCE hInst; | |
static HFONT hFont; | |
static GSList *WindowList=NULL; | |
static GSList *GdkInputs=NULL; | |
+static GSList *GtkTimeouts=NULL; | |
static HWND TopLevel=NULL; | |
long AsyncSocketError=0; | |
t@@ -652,6 +662,22 @@ static void DispatchSocketEvent(SOCKET sock,long event) { | |
} | |
} | |
+static void DispatchTimeoutEvent(UINT id) { | |
+ GSList *list; | |
+ GtkTimeout *timeout; | |
+ for (list=GtkTimeouts;list;list=g_slist_next(list)) { | |
+ timeout=(GtkTimeout *)list->data; | |
+ if (timeout->id == id) { | |
+ if (timeout->function) { | |
+ if (!(*timeout->function)(timeout->data)) { | |
+ gtk_timeout_remove(id); | |
+ } | |
+ } | |
+ break; | |
+ } | |
+ } | |
+} | |
+ | |
LRESULT CALLBACK GtkPanedProc(HWND hwnd,UINT msg,UINT wParam,LONG lParam) { | |
PAINTSTRUCT ps; | |
HPEN oldpen,dkpen,ltpen; | |
t@@ -861,6 +887,9 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,UINT wPara… | |
DispatchSocketEvent((SOCKET)wParam,WSAGETSELECTEVENT(lParam)); | |
AsyncSocketError=0; | |
break; | |
+ case WM_TIMER: | |
+ DispatchTimeoutEvent((UINT)wParam); | |
+ return FALSE; | |
default: | |
return DefWindowProc(hwnd,msg,wParam,lParam); | |
} | |
t@@ -4230,6 +4259,52 @@ gint GtkMessageBox(GtkWidget *parent,const gchar *Text, | |
Text,Title,Options); | |
} | |
+guint gtk_timeout_add(guint32 interval,GtkFunction function,gpointer data) { | |
+ GtkTimeout *timeout; | |
+ GSList *list; | |
+ guint id=1; | |
+ | |
+/* Get an unused ID */ | |
+ list=GtkTimeouts; | |
+ while (list) { | |
+ timeout=(GtkTimeout *)list->data; | |
+ if (timeout->id == id) { | |
+ id++; list=GtkTimeouts; | |
+ } else { | |
+ list=g_slist_next(list); | |
+ } | |
+ } | |
+ | |
+ timeout=g_new(GtkTimeout,1); | |
+ timeout->interval = interval; | |
+ timeout->function = function; | |
+ timeout->data = data; | |
+ | |
+ timeout->id=SetTimer(TopLevel,id,interval,NULL); | |
+ if (timeout->id==0) { | |
+ g_warning("Failed to create timer!"); | |
+ } | |
+ | |
+ GtkTimeouts = g_slist_append(GtkTimeouts,timeout); | |
+ return timeout->id; | |
+} | |
+ | |
+void gtk_timeout_remove(guint timeout_handler_id) { | |
+ GSList *list; | |
+ GtkTimeout *timeout; | |
+ for (list=GtkTimeouts;list;list=g_slist_next(list)) { | |
+ timeout=(GtkTimeout *)list->data; | |
+ if (timeout->id == timeout_handler_id) { | |
+ if (KillTimer(TopLevel,timeout->id)==0) { | |
+ g_warning("Failed to kill timer!"); | |
+ } | |
+ GtkTimeouts=g_slist_remove(GtkTimeouts,timeout); | |
+ g_free(timeout); | |
+ break; | |
+ } | |
+ } | |
+} | |
+ | |
#else /* CYGWIN */ | |
guint SetAccelerator(GtkWidget *labelparent,gchar *Text, | |
GtkWidget *sendto,gchar *signal, | |
diff --git a/src/gtkport.h b/src/gtkport.h | |
t@@ -54,6 +54,7 @@ typedef enum { | |
GDK_INPUT_EXCEPTION = 1 << 2 | |
} GdkInputCondition; | |
+typedef gint (*GtkFunction)(gpointer data); | |
typedef void (*GdkInputFunction)(gpointer data,gint source, | |
GdkInputCondition condition); | |
typedef gchar* (*GtkTranslateFunc)(const gchar *path,gpointer func_data); | |
t@@ -663,6 +664,8 @@ GtkWidget *gtk_progress_bar_new(); | |
void gtk_progress_bar_set_orientation(GtkProgressBar *pbar, | |
GtkProgressBarOrientation orientation); | |
void gtk_progress_bar_update(GtkProgressBar *pbar,gfloat percentage); | |
+guint gtk_timeout_add(guint32 interval,GtkFunction function,gpointer data); | |
+void gtk_timeout_remove(guint timeout_handler_id); | |
extern long AsyncSocketError; | |