Compare commits

..
12 changed files with 113 additions and 313 deletions
+3 -2
View File
@@ -460,7 +460,7 @@ for examples:
## HISTORY ## HISTORY
21 years have pasted since MiniGUI was initially created at 27 years have pasted since MiniGUI was initially created at
the end of 1998, and now it becomes much reliable and stable. the end of 1998, and now it becomes much reliable and stable.
During the past years, many remarkable changes have taken place in During the past years, many remarkable changes have taken place in
the MiniGUI project. the MiniGUI project.
@@ -566,13 +566,14 @@ A brief history description of the development progress is listed as follow:
1. Jan., 2022: FMSoft released MiniGUI version 5.0.9. 1. Jan., 2022: FMSoft released MiniGUI version 5.0.9.
1. Sep., 2022: FMSoft released MiniGUI version 5.0.10. 1. Sep., 2022: FMSoft released MiniGUI version 5.0.10.
1. Aug., 2023: FMSoft released MiniGUI version 5.0.13. 1. Aug., 2023: FMSoft released MiniGUI version 5.0.13.
1. May., 2025: FMSoft released MiniGUI version 5.0.15.
## AUTHORS AND COPYING ## AUTHORS AND COPYING
The original author of MiniGUI is Vincent Wei, and now MiniGUI is maintained by FMSoft. The original author of MiniGUI is Vincent Wei, and now MiniGUI is maintained by FMSoft.
For more information, please refer to <http://www.fmsoft.cn>. For more information, please refer to <http://www.fmsoft.cn>.
Copyright (C) 2002 ~ 2023, Beijing FMSoft Technologies Co., Ltd. Copyright (C) 2002 ~ 2025, Beijing FMSoft Technologies Co., Ltd.
Copyright (C) 1998 ~ 2002, Vincent Wei Copyright (C) 1998 ~ 2002, Vincent Wei
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
+6 -5
View File
@@ -1,7 +1,7 @@
# Release Notes # Release Notes
- [Version 5.2.0](#version-520) - [Version 5.0.15](#version-5015)
+ [What's new in version 5.2.0](#whats-new-in-version-520) + [What's new in version 5.0.15](#whats-new-in-version-5015)
- [Version 5.0.13](#version-5013) - [Version 5.0.13](#version-5013)
+ [What's new in version 5.0.13](#whats-new-in-version-5013) + [What's new in version 5.0.13](#whats-new-in-version-5013)
- [Version 5.0.12](#version-5012) - [Version 5.0.12](#version-5012)
@@ -34,10 +34,11 @@
+ [Changes leading to incompatibility](#changes-leading-to-incompatibility) + [Changes leading to incompatibility](#changes-leading-to-incompatibility)
+ [Deprecated APIs](#deprecated-apis) + [Deprecated APIs](#deprecated-apis)
## Version 5.2.0 ## Version 5.0.15
On Nov. 30, 2023, FMSoft announces the availability of MiniGUI 5.2.0, On May 09, 2025, FMSoft announces the availability of MiniGUI 5.0.15,
which is an mainline release with some major enhancements: which is an enhancement release with some minor enhancements
of MiniGUI 5.0.x.
* ENHANCEMENTS: * ENHANCEMENTS:
- Optimize NEWGAL engines: `shadow`, `drm`, and `fbcon` for large resolution. - Optimize NEWGAL engines: `shadow`, `drm`, and `fbcon` for large resolution.
+2 -2
View File
@@ -1,6 +1,6 @@
Version 5.2.0 (2023/09/30) Version 5.0.15 (2025/05/09)
This is a minor enhancement and bugfix release of MiniGUI 5.2.x, the stable version. This is a minor enhancement and bugfix release of MiniGUI 5.0.x, the stable version.
Other packages for MiniGUI resource, tools, components, and samples: Other packages for MiniGUI resource, tools, components, and samples:
+3 -3
View File
@@ -1,6 +1,6 @@
dnl Process this file with autoconf to produce a configure script. dnl Process this file with autoconf to produce a configure script.
AC_PREREQ(2.60) AC_PREREQ(2.60)
AC_INIT(libminigui, 5.2.0) AC_INIT(libminigui, 5.0.15)
AC_CONFIG_SRCDIR(src/main/main.c) AC_CONFIG_SRCDIR(src/main/main.c)
dnl Set various version strings - taken gratefully from the SDL sources dnl Set various version strings - taken gratefully from the SDL sources
@@ -15,8 +15,8 @@ dnl Set various version strings - taken gratefully from the SDL sources
# set MINIGUI_BINARY_AGE and MINIGUI_INTERFACE_AGE to 0. # set MINIGUI_BINARY_AGE and MINIGUI_INTERFACE_AGE to 0.
# #
MINIGUI_MAJOR_VERSION=5 MINIGUI_MAJOR_VERSION=5
MINIGUI_MINOR_VERSION=2 MINIGUI_MINOR_VERSION=0
MINIGUI_MICRO_VERSION=0 MINIGUI_MICRO_VERSION=15
MINIGUI_INTERFACE_AGE=0 MINIGUI_INTERFACE_AGE=0
MINIGUI_BINARY_AGE=0 MINIGUI_BINARY_AGE=0
MINIGUI_VERSION=$MINIGUI_MAJOR_VERSION.$MINIGUI_MINOR_VERSION.$MINIGUI_MICRO_VERSION MINIGUI_VERSION=$MINIGUI_MAJOR_VERSION.$MINIGUI_MINOR_VERSION.$MINIGUI_MICRO_VERSION
+4 -35
View File
@@ -258,7 +258,7 @@ struct _MSGQUEUE
int loop_depth; // message loop depth, for dialog boxes int loop_depth; // message loop depth, for dialog boxes
int idle_counter; // the idle connter for MSG_IDLE int idle_counter; // the idle connter for MSG_IDLE
DWORD last_ticks_desktop; // the last tick count for desktop timer DWORD last_ticks; // the last tick count saved; since 5.0.14
/* Since 5.0.0, MiniGUI provides support for timers per message thread */ /* Since 5.0.0, MiniGUI provides support for timers per message thread */
int nr_timers; // the number of active timers int nr_timers; // the number of active timers
@@ -911,40 +911,9 @@ static inline MSGQUEUE* getMsgQueueIfMainWindowInThisThread (PMAINWIN pMainWin)
#endif /* defined _MGHAVE_VIRTUAL_WINDOW */ #endif /* defined _MGHAVE_VIRTUAL_WINDOW */
#if 0 /* deprecated code */ /* Since 5.0.14, remove arg use_sys_timer */
/* since 5.0.0, we always use QS_DESKTIMER for desktop timer */ BOOL mg_InitTimer (void);
/* since 5.0.0, we no longer use the timer thread */ void mg_TerminateTimer (void);
static inline void AlertDesktopTimerEvent (void)
{
if (__mg_dsk_msg_queue) {
__mg_dsk_msg_queue->expired_timer_mask = 1;
POST_MSGQ (__mg_dsk_msg_queue);
}
}
static inline void AlertDesktopTimerEvent (void)
{
__mg_dsk_msg_queue->dwState |= QS_DESKTIMER;
#ifdef _MGHAVE_VIRTUAL_WINDOW
if (getMsgQueueForThisThread() != __mg_dsk_msg_queue)
POST_MSGQ (__mg_dsk_msg_queue);
#endif /* defined _MGHAVE_VIRTUAL_WINDOW */
}
static inline void setMsgQueueTimerFlag (PMSGQUEUE pMsgQueue, int slot)
{
pMsgQueue->expired_timer_mask |= (0x01UL << slot);
POST_MSGQ (pMsgQueue);
}
static inline void removeMsgQueueTimerFlag (PMSGQUEUE pMsgQueue, int slot)
{
pMsgQueue->expired_timer_mask &= ~(0x01UL << slot);
}
#endif /* deprecated code */
BOOL mg_InitTimer (BOOL use_sys_timer);
void mg_TerminateTimer (BOOL use_sys_timer);
/*window element renderer manager interface*/ /*window element renderer manager interface*/
extern WINDOW_ELEMENT_RENDERER * __mg_def_renderer; extern WINDOW_ELEMENT_RENDERER * __mg_def_renderer;
+1 -1
View File
@@ -74,7 +74,7 @@ typedef struct _MSGQUEUE MSGQUEUE;
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
void __mg_update_tick_count (void* data); DWORD __mg_update_tick_count (MSGQUEUE* msg_queue);
int __mg_check_expired_timers (MSGQUEUE* msg_queue, DWORD inter); int __mg_check_expired_timers (MSGQUEUE* msg_queue, DWORD inter);
void __mg_remove_timers_by_msg_queue (MSGQUEUE* msg_queue); void __mg_remove_timers_by_msg_queue (MSGQUEUE* msg_queue);
void __mg_remove_timer (MSGQUEUE* msg_queue, int slot); void __mg_remove_timer (MSGQUEUE* msg_queue, int slot);
+24 -5
View File
@@ -55,6 +55,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <math.h> #include <math.h>
#include <time.h>
#include "common.h" #include "common.h"
@@ -141,12 +142,31 @@ BOOL mg_InitDesktop (void)
#include "debug.h" #include "debug.h"
static IDLEHANDLER std_idle_handler; /* According to a bug report, we use sem_timedwait() instead of
calling std_idle_handler for desktop thread.
Otherwise, the desktop might not handle the request from other GUI threads
as soon as possible. */
static BOOL idle_handler_for_desktop_thread (MSGQUEUE *msg_queue, BOOL wait) static BOOL idle_handler_for_desktop_thread (MSGQUEUE *msg_queue, BOOL wait)
{ {
__mg_update_tick_count (NULL); int retv, n = 0;
return std_idle_handler (msg_queue, wait);
__mg_update_tick_count (msg_queue);
if (wait) {
struct timespec ts;
if (clock_gettime (CLOCK_REALTIME, &ts) != -1) {
ts.tv_nsec += 10 * 1000 * 1000L; // 10ms
if (ts.tv_nsec >= 1000 * 1000 * 1000L) {
ts.tv_sec += 1;
ts.tv_nsec -= 1000 * 1000 * 1000L;
}
if (sem_timedwait (&msg_queue->wait, &ts) == 0)
return TRUE;
}
}
return n > 0;
} }
void* __kernel_desktop_main (void* data) void* __kernel_desktop_main (void* data)
@@ -162,7 +182,6 @@ void* __kernel_desktop_main (void* data)
/* For bug reported in Issue #116, under threads mode, the idle handler /* For bug reported in Issue #116, under threads mode, the idle handler
for the desktop thread should call __mg_update_tick_count () */ for the desktop thread should call __mg_update_tick_count () */
std_idle_handler = __mg_dsk_msg_queue->OnIdle;
__mg_dsk_msg_queue->OnIdle = idle_handler_for_desktop_thread; __mg_dsk_msg_queue->OnIdle = idle_handler_for_desktop_thread;
/* init desktop window */ /* init desktop window */
+8 -8
View File
@@ -562,6 +562,13 @@ int GUIAPI InitGUI (int args, const char *agr[])
_is_minigui_running = 1; _is_minigui_running = 1;
/* init timer for tick counter */
step++;
if (!mg_InitTimer()) {
_ERR_PRINTF ("KERNEL>InitGUI: failed to start time counter\n");
goto failure;
}
step++; step++;
if (!SystemThreads()) { if (!SystemThreads()) {
_ERR_PRINTF ("KERNEL>InitGUI: failed to init system threads!\n"); _ERR_PRINTF ("KERNEL>InitGUI: failed to init system threads!\n");
@@ -575,13 +582,6 @@ int GUIAPI InitGUI (int args, const char *agr[])
goto failure; goto failure;
} }
/* init timer for tick counter */
step++;
if (!mg_InitTimer (FALSE)) {
_ERR_PRINTF ("KERNEL>InitGUI: failed to start time counter\n");
goto failure;
}
SetKeyboardLayout ("default"); SetKeyboardLayout ("default");
SetCursor (GetSystemCursor (IDC_ARROW)); SetCursor (GetSystemCursor (IDC_ARROW));
@@ -602,7 +602,7 @@ failure1:
void GUIAPI TerminateGUI (int not_used) void GUIAPI TerminateGUI (int not_used)
{ {
mg_TerminateTimer (FALSE); mg_TerminateTimer ();
mg_FreeMsgQueueForThisThread (TRUE); mg_FreeMsgQueueForThisThread (TRUE);
+58 -142
View File
@@ -44,7 +44,7 @@
* <http://www.minigui.com/blog/minigui-licensing-policy/>. * <http://www.minigui.com/blog/minigui-licensing-policy/>.
*/ */
/* /*
** timer.c: The Timer module for MiniGUI-Threads. ** timer.c: The Timer module for MiniGUI.
** **
** Current maintainer: Wei Yongming. ** Current maintainer: Wei Yongming.
** **
@@ -79,82 +79,45 @@
DWORD __mg_tick_counter = 0; DWORD __mg_tick_counter = 0;
/* update timer count for desktop thread */ /* update timer count for message and desktop thread */
void __mg_update_tick_count (void *data) DWORD __mg_update_tick_count (MSGQUEUE* msg_queue)
{ {
DWORD ticks;
#if defined(_MGRM_PROCESSES) #if defined(_MGRM_PROCESSES)
if (mgIsServer) { if (mgIsServer) {
__mg_tick_counter = __mg_os_get_time_ticks (); ticks = __mg_os_get_time_ticks ();
SHAREDRES_TIMER_COUNTER = __mg_tick_counter; SHAREDRES_TIMER_COUNTER = ticks;
} }
else { else {
__mg_tick_counter = SHAREDRES_TIMER_COUNTER; ticks = SHAREDRES_TIMER_COUNTER;
} }
#else /* defined _MGRM_PROCESSES */ #else /* defined _MGRM_PROCESSES */
__mg_tick_counter = __mg_os_get_time_ticks (); ticks = __mg_os_get_time_ticks ();
#endif /* not defined _MGRM_PROCESSES */ #endif /* not defined _MGRM_PROCESSES */
/* Since 5.0.0, the desktop only handles caret blinking in MSG_TIMEOUT if (msg_queue && ticks != msg_queue->last_ticks) {
message, and the interval for the timer of desktop changes to 0.05s. */ /* Since 5.0.0, the desktop only handles caret blinking in MSG_TIMEOUT
if (__mg_tick_counter > message, and the interval for the timer of desktop changes to 0.05s.
__mg_dsk_msg_queue->last_ticks_desktop + DESKTOP_TIMER_INERTVAL) { */
__mg_dsk_msg_queue->dwState |= QS_DESKTIMER; if (msg_queue == __mg_dsk_msg_queue &&
ticks > __mg_dsk_msg_queue->old_tick_count +
DESKTOP_TIMER_INERTVAL) {
__mg_dsk_msg_queue->dwState |= QS_DESKTIMER;
#ifdef _MGRM_THREADS /* only wake up desktop for threads mode */ #ifdef _MGRM_THREADS /* only wake up desktop for threads mode */
POST_MSGQ (__mg_dsk_msg_queue); POST_MSGQ (__mg_dsk_msg_queue);
#endif #endif
__mg_dsk_msg_queue->last_ticks_desktop = __mg_tick_counter; __mg_dsk_msg_queue->old_tick_count = ticks;
}
msg_queue->last_ticks = ticks;
} }
#if 0 /* deprecated code */ __mg_tick_counter = ticks;
return ticks;
}
#if defined(_MGRM_PROCESSES) #if defined(_MGRM_PROCESSES)
if (mgIsServer) {
DWORD elapsed_ticks;
/* Since 5.0.0, we use elapsed time in ms to count the ticks */
elapsed_ticks = __mg_os_get_elapsed_ms ();
elapsed_ticks = (elapsed_ticks + 5) / 10;
__mg_tick_counter += elapsed_ticks;
SHAREDRES_TIMER_COUNTER = __mg_tick_counter;
}
else {
__mg_tick_counter = SHAREDRES_TIMER_COUNTER;
}
#else /* defined _MGRM_PROCESSES */
DWORD elapsed_ticks;
/* Since 5.0.0, we use elapsed time in ms to count the ticks */
elapsed_ticks = __mg_os_get_elapsed_ms ();
elapsed_ticks = (elapsed_ticks + 5) / 10;
__mg_tick_counter += elapsed_ticks;
#endif /* not defined _MGRM_PROCESSES */
/* Since 5.0.0, the desktop only handles caret blinking in MSG_TIMEOUT
message, and the interval for the timer of desktop changes to 0.05s. */
if (__mg_tick_counter >
__mg_dsk_msg_queue->last_ticks_desktop + DESKTOP_TIMER_INERTVAL) {
__mg_dsk_msg_queue->dwState |= QS_DESKTIMER;
#ifdef _MGRM_THREADS /* only wake up desktop for threads mode */
POST_MSGQ (__mg_dsk_msg_queue);
#endif
__mg_dsk_msg_queue->last_ticks_desktop = __mg_tick_counter;
}
#endif /* deprecated code */
}
#ifdef __NOUNIX__
static BOOL install_system_timer (void)
{
return TRUE;
}
static BOOL unintall_system_timer (void)
{
return TRUE;
}
#else /* defined __NOUNIX__ */
#include <signal.h> #include <signal.h>
#include <unistd.h> #include <unistd.h>
@@ -163,6 +126,12 @@ static BOOL unintall_system_timer (void)
static struct sigaction old_alarm_handler; static struct sigaction old_alarm_handler;
static struct itimerval old_timer; static struct itimerval old_timer;
static void timer_handler(int sig)
{
(void)sig;
__mg_update_tick_count(NULL);
}
static BOOL install_system_timer (void) static BOOL install_system_timer (void)
{ {
struct itimerval timerv; struct itimerval timerv;
@@ -171,20 +140,12 @@ static BOOL install_system_timer (void)
sigaction (SIGALRM, NULL, &old_alarm_handler); sigaction (SIGALRM, NULL, &old_alarm_handler);
siga = old_alarm_handler; siga = old_alarm_handler;
siga.sa_handler = (void(*)(int))__mg_update_tick_count; siga.sa_handler = timer_handler;
#ifndef _MGRM_STANDALONE
siga.sa_flags = 0; siga.sa_flags = 0;
#else
siga.sa_flags = SA_RESTART;
#endif
sigaction (SIGALRM, &siga, NULL); sigaction (SIGALRM, &siga, NULL);
timerv.it_interval.tv_sec = 0; timerv.it_interval.tv_sec = 0;
#if defined(__uClinux__) && defined(_MGRM_STANDALONE)
timerv.it_interval.tv_usec = 100000; /* 100 ms */
#else
timerv.it_interval.tv_usec = 10000; /* 10 ms */ timerv.it_interval.tv_usec = 10000; /* 10 ms */
#endif
timerv.it_value = timerv.it_interval; timerv.it_value = timerv.it_interval;
if (setitimer (ITIMER_REAL, &timerv, &old_timer) == -1) { if (setitimer (ITIMER_REAL, &timerv, &old_timer) == -1) {
@@ -209,26 +170,30 @@ static BOOL unintall_system_timer (void)
return TRUE; return TRUE;
} }
#endif /* defined(_MGRM_PROCESSES) */
#endif /* not defined __NOUNIX__ */ BOOL mg_InitTimer ()
BOOL mg_InitTimer (BOOL use_sys_timer)
{ {
__mg_tick_counter = 0; __mg_tick_counter = 0;
__mg_os_start_time(); __mg_os_start_time();
if (use_sys_timer) { #if defined(_MGRM_PROCESSES)
if (mgIsServer) {
install_system_timer (); install_system_timer ();
} }
#endif
return TRUE; return TRUE;
} }
void mg_TerminateTimer (BOOL use_sys_timer) void mg_TerminateTimer (void)
{ {
if (use_sys_timer) #if defined(_MGRM_PROCESSES)
if (mgIsServer) {
unintall_system_timer (); unintall_system_timer ();
}
#endif
} }
/************************* Functions run in message thread *******************/ /************************* Functions run in message thread *******************/
@@ -247,34 +212,19 @@ int __mg_check_expired_timers (MSGQUEUE* msg_queue, DWORD inter)
int i; int i;
TIMER** timer_slots = msg_queue->timer_slots; TIMER** timer_slots = msg_queue->timer_slots;
__mg_update_tick_count (msg_queue);
for (i = 0; i < DEF_NR_TIMERS; i++) { for (i = 0; i < DEF_NR_TIMERS; i++) {
if (timer_slots[i]) { if (timer_slots[i]) {
if (__mg_tick_counter >= timer_slots[i]->ticks_expected) { if (msg_queue->last_ticks >= timer_slots[i]->ticks_expected) {
/* setting timer flag is simple, we do not need to lock /* setting timer flag is simple, we do not need to lock
msgq, or else we may encounter dead lock here */ msgq, or else we may encounter dead lock here */
msg_queue->expired_timer_mask |= (0x01UL << i); msg_queue->expired_timer_mask |= (0x01UL << i);
POST_MSGQ (msg_queue); POST_MSGQ (msg_queue);
timer_slots[i]->ticks_expected += timer_slots[i]->interv; timer_slots[i]->ticks_expected += timer_slots[i]->interv;
timer_slots[i]->ticks_fired = __mg_tick_counter; timer_slots[i]->ticks_fired = msg_queue->last_ticks;
nr++; nr++;
} }
#if 0 /* deprecated code */
timer_slots[i]->count += inter;
if (timer_slots[i]->count >= timer_slots[i]->interv) {
#ifdef _MGRM_PROCESSES
timer_slots[i]->ticks_current = SHAREDRES_TIMER_COUNTER;
#else
timer_slots[i]->ticks_current = __mg_tick_counter;
#endif
/* setting timer flag is simple, we do not need to lock msgq,
or else we may encounter dead lock here */
msg_queue->expired_timer_mask |= (0x01UL << i);
POST_MSGQ (msg_queue);
timer_slots[i]->count -= timer_slots[i]->interv;
nr++;
}
#endif /* deprecated code */
} }
} }
} }
@@ -291,12 +241,7 @@ BOOL GUIAPI SetTimerEx (HWND hWnd, LINT id, DWORD interv,
int i; int i;
int slot = -1; int slot = -1;
TIMER** timer_slots; TIMER** timer_slots;
PMSGQUEUE pMsgQueue; PMSGQUEUE msg_queue;
#ifndef _MGRM_THREADS
/* Force to update tick count */
GetTickCount();
#endif
if (id == 0) { if (id == 0) {
_WRN_PRINTF ("bad identifier (%ld).\n", id); _WRN_PRINTF ("bad identifier (%ld).\n", id);
@@ -307,12 +252,14 @@ BOOL GUIAPI SetTimerEx (HWND hWnd, LINT id, DWORD interv,
interv = 1; interv = 1;
} }
timer_slots = getTimerSlotsForThisThread (&pMsgQueue); timer_slots = getTimerSlotsForThisThread (&msg_queue);
if (MG_UNLIKELY (timer_slots == NULL)) { if (MG_UNLIKELY (timer_slots == NULL)) {
_WRN_PRINTF ("called for non message thread\n"); _WRN_PRINTF ("called for non message thread\n");
goto badret; goto badret;
} }
__mg_update_tick_count (msg_queue);
/* Since 5.0.0: only check hWnd if timer_proc is NULL */ /* Since 5.0.0: only check hWnd if timer_proc is NULL */
if (MG_UNLIKELY (timer_proc == NULL && if (MG_UNLIKELY (timer_proc == NULL &&
!getMainWinIfWindowInThisThread (hWnd))) { !getMainWinIfWindowInThisThread (hWnd))) {
@@ -331,7 +278,7 @@ BOOL GUIAPI SetTimerEx (HWND hWnd, LINT id, DWORD interv,
/* Since 5.0.0: we reset timer parameters for duplicated call of /* Since 5.0.0: we reset timer parameters for duplicated call of
this function */ this function */
timer_slots[i]->interv = interv; timer_slots[i]->interv = interv;
timer_slots[i]->ticks_expected = __mg_tick_counter + interv; timer_slots[i]->ticks_expected = msg_queue->last_ticks + interv;
timer_slots[i]->ticks_fired = 0; timer_slots[i]->ticks_fired = 0;
timer_slots[i]->proc = timer_proc; timer_slots[i]->proc = timer_proc;
return TRUE; return TRUE;
@@ -348,14 +295,14 @@ BOOL GUIAPI SetTimerEx (HWND hWnd, LINT id, DWORD interv,
timer_slots[slot]->hWnd = hWnd; timer_slots[slot]->hWnd = hWnd;
timer_slots[slot]->id = id; timer_slots[slot]->id = id;
timer_slots[slot]->interv = interv; timer_slots[slot]->interv = interv;
timer_slots[slot]->ticks_expected = __mg_tick_counter + interv; timer_slots[slot]->ticks_expected = msg_queue->last_ticks + interv;
timer_slots[slot]->ticks_fired = 0; timer_slots[slot]->ticks_fired = 0;
timer_slots[slot]->proc = timer_proc; timer_slots[slot]->proc = timer_proc;
_DBG_PRINTF ("ticks_expected (%d): %lu, tick_counter: %lu\n", _DBG_PRINTF ("ticks_expected (%d): %lu, tick_counter: %lu\n",
slot, timer_slots[slot]->ticks_expected, __mg_tick_counter); slot, timer_slots[slot]->ticks_expected, msg_queue->last_ticks);
pMsgQueue->nr_timers++; msg_queue->nr_timers++;
return TRUE; return TRUE;
@@ -363,24 +310,6 @@ badret:
return FALSE; return FALSE;
} }
#if 0 /* deprected code */
#ifdef _MGRM_PROCESSES
static void reset_select_timeout (TIMER** timer_slots)
{
int i;
unsigned int interv = 0;
for (i = 0; i < DEF_NR_TIMERS; i++) {
if (timer_slots[i]) {
if (interv == 0 || timer_slots[i]->interv < interv)
interv = timer_slots[i]->interv;
}
}
__mg_set_select_timeout (USEC_10MS * interv);
}
#endif
#endif /* deprecated code */
void __mg_remove_timer (MSGQUEUE* msg_queue, int slot) void __mg_remove_timer (MSGQUEUE* msg_queue, int slot)
{ {
TIMER** timer_slots; TIMER** timer_slots;
@@ -470,13 +399,14 @@ BOOL GUIAPI ResetTimerEx (HWND hWnd, LINT id, DWORD interv,
if (MG_LIKELY (msg_queue)) { if (MG_LIKELY (msg_queue)) {
TIMER** timer_slots = msg_queue->timer_slots; TIMER** timer_slots = msg_queue->timer_slots;
__mg_update_tick_count (msg_queue);
for (i = 0; i < DEF_NR_TIMERS; i++) { for (i = 0; i < DEF_NR_TIMERS; i++) {
if (timer_slots[i] && if (timer_slots[i] &&
timer_slots[i]->hWnd == hWnd && timer_slots[i]->id == id) { timer_slots[i]->hWnd == hWnd && timer_slots[i]->id == id) {
/* Should clear old timer flags */ /* Should clear old timer flags */
msg_queue->expired_timer_mask &= ~(0x01UL << i); msg_queue->expired_timer_mask &= ~(0x01UL << i);
timer_slots[i]->interv = interv; timer_slots[i]->interv = interv;
timer_slots[i]->ticks_expected = __mg_tick_counter + interv; timer_slots[i]->ticks_expected = msg_queue->last_ticks + interv;
timer_slots[i]->ticks_fired = 0; timer_slots[i]->ticks_fired = 0;
if (timer_proc != (TIMERPROC)INV_PTR) if (timer_proc != (TIMERPROC)INV_PTR)
timer_slots[i]->proc = timer_proc; timer_slots[i]->proc = timer_proc;
@@ -548,20 +478,6 @@ BOOL GUIAPI HaveFreeTimer (void)
DWORD GUIAPI GetTickCount (void) DWORD GUIAPI GetTickCount (void)
{ {
#if defined(_MGRM_PROCESSES) return __mg_update_tick_count(getMsgQueueForThisThread ());
if (mgIsServer) {
__mg_tick_counter = __mg_os_get_time_ticks ();
SHAREDRES_TIMER_COUNTER = __mg_tick_counter;
}
else {
__mg_tick_counter = SHAREDRES_TIMER_COUNTER;
}
#elif defined(_MGRM_STANDALONE)
__mg_tick_counter = __mg_os_get_time_ticks ();
#else /* not defined _MGRM_PROCESSES and _MGRM_PROCESSES */
/* do nothing here because the desktop thread updates the tick count */
#endif /* not defined _MGRM_PROCESSES and _MGRM_PROCESSES */
return __mg_tick_counter;
} }
-84
View File
@@ -495,28 +495,6 @@ DWORD __mg_os_get_time_ticks (void)
return (current - startup_time_win32) / 10; return (current - startup_time_win32) / 10;
} }
#if 0 /* deprecated code */
DWORD __mg_os_get_elapsed_ms (void)
{
static DWORD last;
DWORD current = timeGetTime();
DWORD elapsed;
if (current >= last) {
elapsed = current - last;
return elapsed;
}
else {
/* overflowed */
elapsed = BITMASK_DWORD - last;
elapsed += current;
}
last = current;
return elapsed;
}
#endif /* deprecated code */
#elif defined (HAVE_CLOCK_GETTIME) #elif defined (HAVE_CLOCK_GETTIME)
static struct timespec timeval_startup; static struct timespec timeval_startup;
@@ -573,68 +551,6 @@ DWORD __mg_os_get_time_ticks (void)
return ds * 100 + dms; return ds * 100 + dms;
} }
#if 0 /* deprecated code */
DWORD __mg_os_get_elapsed_ms (void)
{
static struct timespec last;
DWORD ds, dms;
struct timespec current;
clock_gettime (CLOCK_MONOTONIC, &current);
ds = (current.tv_sec - last.tv_sec);
if (current.tv_sec == last.tv_sec) {
dms = (current.tv_nsec - last.tv_nsec) / 1000000L;
}
else if (current.tv_nsec >= last.tv_nsec) {
dms = (current.tv_nsec - last.tv_nsec) / 1000000L;
}
else {
assert (ds > 0);
ds--;
dms = 1000L - (last.tv_nsec - current.tv_nsec) / 1000000L;
}
last = current;
return ds * 1000 + dms;
}
#include <unistd.h>
#include <poll.h>
#include <sys/time.h>
static struct timeval timeval_startup;
void __mg_os_start_time(void)
{
gettimeofday(&timeval_startup, NULL);
}
DWORD __mg_os_get_time_ms(void)
{
DWORD ds, dms;
struct timeval current;
gettimeofday(&current, NULL);
ds = (current.tv_sec - timeval_startup.tv_sec);
if (current.tv_sec == timeval_startup.tv_sec) {
dms = (current.tv_usec - timeval_startup.tv_usec) / 1000L;
}
else if (current.tv_usec >= timeval_startup.tv_usec) {
dms = (current.tv_usec - timeval_startup.tv_usec) / 1000L;
}
else {
assert(ds > 0);
ds--;
dms = 1000L - (timeval_startup.tv_usec - current.tv_usec) / 1000L;
}
return ds * 1000 + dms;
}
#endif /* deprecated code */
#else /* defined HAVE_CLOCK_GETTIME */ #else /* defined HAVE_CLOCK_GETTIME */
#error "Please implement __mg_os_start_time and __mg_os_get_time_ticks for your OS" #error "Please implement __mg_os_start_time and __mg_os_get_time_ticks for your OS"
+2 -24
View File
@@ -84,20 +84,6 @@ extern DWORD __mg_tick_counter;
ON_NEW_DEL_CLIENT OnNewDelClient = NULL; ON_NEW_DEL_CLIENT OnNewDelClient = NULL;
#if 0
/* Since 5.0.0, use RegisterEventHookFunc to implement SetServerEventHook */
static SRVEVTHOOK srv_evt_hook = NULL;
SRVEVTHOOK GUIAPI SetServerEventHook (SRVEVTHOOK SrvEvtHook)
{
SRVEVTHOOK old_hook = srv_evt_hook;
srv_evt_hook = SrvEvtHook;
return old_hook;
}
#endif /* deprecated code; moved to window.c */
static void ParseEvent (PMSGQUEUE msg_que, int event) static void ParseEvent (PMSGQUEUE msg_que, int event)
{ {
LWEVENT lwe; LWEVENT lwe;
@@ -331,7 +317,7 @@ BOOL GUIAPI ServerStartup (int nr_globals,
__mg_dsk_msg_queue->maxfd = listenfd; __mg_dsk_msg_queue->maxfd = listenfd;
maxi = -1; maxi = -1;
mg_InitTimer (TRUE); mg_InitTimer ();
__mg_start_server_desktop (); __mg_start_server_desktop ();
@@ -363,7 +349,7 @@ void server_ServerCleanup (void)
__mg_nssurf_map_delete (); __mg_nssurf_map_delete ();
#endif #endif
mg_TerminateTimer (TRUE); mg_TerminateTimer ();
unlink (CS_PATH); unlink (CS_PATH);
} }
@@ -381,14 +367,6 @@ BOOL server_IdleHandler4Server (PMSGQUEUE msg_queue, BOOL wait)
EXTRA_INPUT_EVENT extra; // Since 4.0.0; for extra input events EXTRA_INPUT_EVENT extra; // Since 4.0.0; for extra input events
int nevts = 0; // Since 5.0.0; for timer and fd events int nevts = 0; // Since 5.0.0; for timer and fd events
#if 0 /* deprecated code */
/* since 5.0.0, use __mg_update_tick_count instead */
if (__mg_tick_counter != SHAREDRES_TIMER_COUNTER) {
__mg_tick_counter = SHAREDRES_TIMER_COUNTER;
AlertDesktopTimerEvent ();
}
#endif /* deprecated code */
/* rset gets modified each time around */ /* rset gets modified each time around */
rset = __mg_dsk_msg_queue->rfdset; rset = __mg_dsk_msg_queue->rfdset;
if (__mg_dsk_msg_queue->nr_wfds) { if (__mg_dsk_msg_queue->nr_wfds) {
+2 -2
View File
@@ -190,14 +190,14 @@ static void ParseEvent (PMSGQUEUE msg_que, int event)
BOOL GUIAPI salone_StandAloneStartup (void) BOOL GUIAPI salone_StandAloneStartup (void)
{ {
/* VW: do not use signal based interval timer; since 4.0 */ /* VW: do not use signal based interval timer; since 4.0 */
mg_InitTimer (FALSE); mg_InitTimer ();
return TRUE; return TRUE;
} }
void salone_StandAloneCleanup (void) void salone_StandAloneCleanup (void)
{ {
/* VW: do not use signal based interval timer; since 4.0 */ /* VW: do not use signal based interval timer; since 4.0 */
mg_TerminateTimer (FALSE); mg_TerminateTimer ();
} }
BOOL salone_IdleHandler4StandAlone (PMSGQUEUE msg_queue, BOOL wait) BOOL salone_IdleHandler4StandAlone (PMSGQUEUE msg_queue, BOOL wait)