summaryrefslogtreecommitdiff
path: root/windows
diff options
context:
space:
mode:
Diffstat (limited to 'windows')
-rw-r--r--windows/download.c21
-rw-r--r--windows/gui.c5
-rw-r--r--windows/schedule.c96
-rw-r--r--windows/schedule.h16
4 files changed, 82 insertions, 56 deletions
diff --git a/windows/download.c b/windows/download.c
index 8bdff3aac..fe2a09237 100644
--- a/windows/download.c
+++ b/windows/download.c
@@ -27,14 +27,15 @@
#include "content/fetch.h"
#include "desktop/gui.h"
#include "desktop/download.h"
-#include "utils/schedule.h"
#include "utils/log.h"
#include "utils/messages.h"
#include "utils/url.h"
#include "utils/utils.h"
+
#include "windows/download.h"
#include "windows/gui.h"
#include "windows/resourceid.h"
+#include "windows/schedule.h"
static bool downloading = false;
static struct gui_download_window *download1;
@@ -182,7 +183,7 @@ void nsws_download_update_label(void *p)
{
struct gui_download_window *w = p;
if (w->hwnd == NULL) {
- schedule_remove(nsws_download_update_label, p);
+ win32_schedule(-1, nsws_download_update_label, p);
return;
}
HWND sub = GetDlgItem(w->hwnd, IDC_DOWNLOAD_LABEL);
@@ -222,21 +223,23 @@ void nsws_download_update_label(void *p)
w->time_left = NULL;
}
SendMessage(sub, WM_SETTEXT, (WPARAM)0, (LPARAM)label);
- if (w->progress < 10000)
- schedule(50, nsws_download_update_label, p);
+ if (w->progress < 10000) {
+ win32_schedule(500, nsws_download_update_label, p);
+ }
}
void nsws_download_update_progress(void *p)
{
struct gui_download_window *w = p;
if (w->hwnd == NULL) {
- schedule_remove(nsws_download_update_progress, p);
+ win32_schedule(-1, nsws_download_update_progress, p);
return;
}
HWND sub = GetDlgItem(w->hwnd, IDC_DOWNLOAD_PROGRESS);
SendMessage(sub, PBM_SETPOS, (WPARAM)(w->progress / 100), 0);
- if (w->progress < 10000)
- schedule(50, nsws_download_update_progress, p);
+ if (w->progress < 10000) {
+ win32_schedule(500, nsws_download_update_progress, p);
+ }
}
void nsws_download_clear_data(struct gui_download_window *w)
@@ -255,8 +258,8 @@ void nsws_download_clear_data(struct gui_download_window *w)
free(w->total_size);
if (w->file != NULL)
fclose(w->file);
- schedule_remove(nsws_download_update_progress, (void *)w);
- schedule_remove(nsws_download_update_label, (void *)w);
+ win32_schedule(-1, nsws_download_update_progress, (void *)w);
+ win32_schedule(-1, nsws_download_update_label, (void *)w);
}
diff --git a/windows/gui.c b/windows/gui.c
index 92ff400ba..8270c13ff 100644
--- a/windows/gui.c
+++ b/windows/gui.c
@@ -78,7 +78,7 @@ void gui_window_set_scroll(struct gui_window *w, int sx, int sy);
static bool gui_window_get_scroll(struct gui_window *w, int *sx, int *sy);
-static void gui_poll(bool active)
+static void win32_poll(bool active)
{
MSG Msg; /* message from system */
BOOL bRet; /* message fetch result */
@@ -1888,7 +1888,8 @@ struct gui_fetch_table *win32_fetch_table = &fetch_table;
static struct gui_browser_table browser_table = {
- .poll = gui_poll,
+ .poll = win32_poll,
+ .schedule = win32_schedule,
};
struct gui_browser_table *win32_browser_table = &browser_table;
diff --git a/windows/schedule.c b/windows/schedule.c
index 3181c55e8..f819918ba 100644
--- a/windows/schedule.c
+++ b/windows/schedule.c
@@ -19,12 +19,17 @@
#include <sys/time.h>
#include <time.h>
-#include "utils/schedule.h"
#include "windows/schedule.h"
#include "utils/log.h"
#include "utils/utils.h"
+#ifdef DEBUG_SCHEDULER
+#define SRLOG(x) LOG(x)
+#else
+#define SRLOG(x)
+#endif
+
/* linked list of scheduled callbacks */
static struct nscallback *schedule_list = NULL;
@@ -41,39 +46,6 @@ struct nscallback
/**
- * Schedule a callback.
- *
- * \param tival interval before the callback should be made / cs
- * \param callback callback function
- * \param p user parameter, passed to callback function
- *
- * The callback function will be called as soon as possible after t cs have
- * passed.
- */
-void schedule(int cs_ival, void (*callback)(void *p), void *p)
-{
- struct nscallback *nscb;
- struct timeval tv;
-
- tv.tv_sec = cs_ival / 100; /* cs to seconds */
- tv.tv_usec = (cs_ival % 100) * 10000; /* remainder to microseconds */
-
- nscb = calloc(1, sizeof(struct nscallback));
-
- LOG(("adding callback %p for %p(%p) at %d cs", nscb, callback, p, cs_ival));
-
- gettimeofday(&nscb->tv, NULL);
- timeradd(&nscb->tv, &tv, &nscb->tv);
-
- nscb->callback = callback;
- nscb->p = p;
-
- /* add to list front */
- nscb->next = schedule_list;
- schedule_list = nscb;
-}
-
-/**
* Unschedule a callback.
*
* \param callback callback function
@@ -82,16 +54,18 @@ void schedule(int cs_ival, void (*callback)(void *p), void *p)
* All scheduled callbacks matching both callback and p are removed.
*/
-void schedule_remove(void (*callback)(void *p), void *p)
+static nserror schedule_remove(void (*callback)(void *p), void *p)
{
struct nscallback *cur_nscb;
struct nscallback *prev_nscb;
struct nscallback *unlnk_nscb;
- if (schedule_list == NULL)
- return;
+ /* check there is something on the list to remove */
+ if (schedule_list == NULL) {
+ return NSERROR_OK;
+ }
- LOG(("removing %p, %p", callback, p));
+ SRLOG(("removing %p, %p", callback, p));
cur_nscb = schedule_list;
prev_nscb = NULL;
@@ -101,7 +75,7 @@ void schedule_remove(void (*callback)(void *p), void *p)
(cur_nscb->p == p)) {
/* item to remove */
- LOG(("callback entry %p removing %p(%p)",
+ SRLOG(("callback entry %p removing %p(%p)",
cur_nscb, cur_nscb->callback, cur_nscb->p));
/* remove callback */
@@ -120,8 +94,44 @@ void schedule_remove(void (*callback)(void *p), void *p)
cur_nscb = prev_nscb->next;
}
}
+ return NSERROR_OK;
}
+/* exported interface documented in windows/schedule.h */
+nserror win32_schedule(int ival, void (*callback)(void *p), void *p)
+{
+ struct nscallback *nscb;
+ struct timeval tv;
+ nserror ret;
+
+ ret = schedule_remove(callback, p);
+ if ((ival < 0) || (ret != NSERROR_OK)) {
+ return ret;
+ }
+
+ tv.tv_sec = ival / 1000; /* miliseconds to seconds */
+ tv.tv_usec = (cs_ival % 1000) * 1000; /* remainder to microseconds */
+
+ nscb = calloc(1, sizeof(struct nscallback));
+ if (nscb == NULL) {
+ return NSERROR_NOMEM;
+ }
+
+ SRLOG(("adding callback %p for %p(%p) at %d cs",
+ nscb, callback, p, ival));
+
+ gettimeofday(&nscb->tv, NULL);
+ timeradd(&nscb->tv, &tv, &nscb->tv);
+
+ nscb->callback = callback;
+ nscb->p = p;
+
+ /* add to list front */
+ nscb->next = schedule_list;
+ schedule_list = nscb;
+
+ return NSERROR_OK;
+}
/* exported interface documented in schedule.h */
int
@@ -157,7 +167,7 @@ schedule_run(void)
prev_nscb->next = unlnk_nscb->next;
}
- LOG(("callback entry %p running %p(%p)",
+ SRLOG(("callback entry %p running %p(%p)",
unlnk_nscb, unlnk_nscb->callback, unlnk_nscb->p));
/* call callback */
unlnk_nscb->callback(unlnk_nscb->p);
@@ -190,9 +200,9 @@ schedule_run(void)
/* make returned time relative to now */
timersub(&nexttime, &tv, &rettime);
-#if defined(DEBUG_SCHEDULER)
- LOG(("returning time to next event as %ldms",(rettime.tv_sec * 1000) + (rettime.tv_usec / 1000)));
-#endif
+ SRLOG(("returning time to next event as %ldms",
+ (rettime.tv_sec * 1000) + (rettime.tv_usec / 1000)));
+
/* return next event time in milliseconds (24days max wait) */
return (rettime.tv_sec * 1000) + (rettime.tv_usec / 1000);
}
diff --git a/windows/schedule.h b/windows/schedule.h
index e6a5d10d0..6d47b2db6 100644
--- a/windows/schedule.h
+++ b/windows/schedule.h
@@ -16,8 +16,20 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef FRAMEBUFFER_SCHEDULE_H
-#define FRAMEBUFFER_SCHEDULE_H
+#ifndef WINDOWS_SCHEDULE_H
+#define WINDOWS_SCHEDULE_H
+
+/**
+ * Schedule a callback.
+ *
+ * \param ival interval before the callback should be made in ms
+ * \param callback callback function
+ * \param p user parameter, passed to callback function
+ *
+ * The callback function will be called as soon as possible after t ms have
+ * passed.
+ */
+nserror win32_schedule(int ival, void (*callback)(void *p), void *p);
/**
* Process scheduled callbacks up to current time.