From 433d5d6cc5cd5f64ccc1e169d3eb538422a1e3ab Mon Sep 17 00:00:00 2001 From: Vincent Wei Date: Mon, 23 Mar 2020 22:08:47 +0800 Subject: [PATCH] try to optimze cursor refresh (not finished) --- src/kernel/cursor-procs.c | 83 +++++++++++++++++---------------------- src/server/server.c | 8 ++-- 2 files changed, 42 insertions(+), 49 deletions(-) diff --git a/src/kernel/cursor-procs.c b/src/kernel/cursor-procs.c index d797507f..d5a311b4 100644 --- a/src/kernel/cursor-procs.c +++ b/src/kernel/cursor-procs.c @@ -80,7 +80,6 @@ #include "drawsemop.h" #include "readbmp.h" -static int oldx = -1, oldy; static RECT cliprc = {0, 0, 0, 0}; #ifdef _MGHAVE_CURSOR @@ -903,6 +902,7 @@ HCURSOR GUIAPI GetDefaultCursor (void) /* The return value indicates whether mouse has moved. */ /* TRUE for moved. */ /* NOTE that only server can call this function. */ +/* Since 5.0.0, this function only changes the cursor position */ BOOL kernel_RefreshCursor (int* x, int* y, int* button) { int curx, cury; @@ -912,51 +912,14 @@ BOOL kernel_RefreshCursor (int* x, int* y, int* button) return FALSE; IAL_GetMouseXY (x, y); - SHAREDRES_MOUSEX = curx = *x; - SHAREDRES_MOUSEY = cury = *y; + curx = *x; + cury = *y; if (button) SHAREDRES_BUTTON = *button = IAL_GetMouseButton (); - if (oldx != curx || oldy != cury) { - -#ifdef _MGHAVE_CURSOR -#ifdef _MGSCHEMA_SHAREDFB - LOCK_CURSOR_SEM (); - CSR_CURSORX = curx; - CSR_CURSORY = cury; - if (CSR_SHOW_COUNT >= 0 && CSR_CURRENT) { - if (get_hidecursor_sem_val ()) { - reset_hidecursor_sem (); - } - else { - hidecursor (); - } - - showcursor (); - GAL_SyncUpdate (__gal_screen); - } - - // GAL_SyncUpdate (__gal_screen); - UNLOCK_CURSOR_SEM (); -#else /* _MGSCHEMA_SHAREDFB */ - CSR_CURSORX = curx; - CSR_CURSORY = cury; - if (CSR_SHOW_COUNT >= 0 && CSR_CURRENT) { - if (csr_bmp.bmBits) { - hidecursor (); - showcursor (); - GAL_SyncUpdate (__gal_screen); - } - else { - PCURSOR pcsr = (PCURSOR)CSR_CURRENT; - GAL_MoveCursor (pcsr->surface, curx, cury); - } - } -#endif /* _MGSCHEMA_COMPOSITING */ -#endif /* _MGHAVE_CURSOR */ - - oldx = curx; - oldy = cury; + if (SHAREDRES_MOUSEX != curx || SHAREDRES_MOUSEY != cury) { + SHAREDRES_MOUSEX = curx; + SHAREDRES_MOUSEY = cury; moved = TRUE; } @@ -965,21 +928,49 @@ BOOL kernel_RefreshCursor (int* x, int* y, int* button) #ifdef _MGHAVE_CURSOR -#ifdef _MGSCHEMA_SHAREDFB -/* show cursor hidden by client GDI function */ +/* Change cursor position and show cursor hidden by client GDI function */ void kernel_ReShowCursor (void) { +#ifdef _MGSCHEMA_SHAREDFB LOCK_CURSOR_SEM (); + if (CSR_SHOW_COUNT >= 0 && CSR_CURRENT) { if (get_hidecursor_sem_val ()) { reset_hidecursor_sem (); showcursor (); GAL_SyncUpdate (__gal_screen); } + else if (CSR_CURSORX != SHAREDRES_MOUSEX || + CSR_CURSORY != SHAREDRES_MOUSEY) { + CSR_CURSORX = SHAREDRES_MOUSEX; + CSR_CURSORY = SHAREDRES_MOUSEY; + hidecursor (); + showcursor (); + GAL_SyncUpdate (__gal_screen); + } } + UNLOCK_CURSOR_SEM (); +#else /* _MGSCHEMA_SHAREDFB */ + if (CSR_SHOW_COUNT >= 0 && CSR_CURRENT && + (CSR_CURSORX != SHAREDRES_MOUSEX || + CSR_CURSORY != SHAREDRES_MOUSEY)) { + + CSR_CURSORX = SHAREDRES_MOUSEX; + CSR_CURSORY = SHAREDRES_MOUSEY; + if (csr_bmp.bmBits) { + hidecursor (); + showcursor (); + GAL_SyncUpdate (__gal_screen); + } + else { + PCURSOR pcsr = (PCURSOR)CSR_CURRENT; + GAL_MoveCursor (pcsr->surface, CSR_CURSORX, CSR_CURSORY); + } + + } +#endif /* _MGSCHEMA_COMPOSITING */ } -#endif /* defined _MGSCHEMA_SHAREDFB */ /* Always call with "setdef = FALSE" for clients at server side. */ HCURSOR GUIAPI SetCursorEx (HCURSOR hcsr, BOOL setdef) diff --git a/src/server/server.c b/src/server/server.c index 300e8b4d..ec96c1d6 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -385,9 +385,11 @@ BOOL server_IdleHandler4Server (PMSGQUEUE msg_queue, BOOL wait) esetptr = &eset; } -#if defined (_MGHAVE_CURSOR) && defined (_MGSCHEMA_SHAREDFB) - /* if the cursor has been hide by GDI function of clients - * this call will re-show the cursor */ +#ifdef _MGHAVE_CURSOR + /* This call change the cursor position actually. + * Under sharedfb schema, if the cursor has been hide by GDI function of + * clients, this call will re-show the cursor. + */ kernel_ReShowCursor (); #endif