some fixes on carets
authorThomas Bluemel <thomas@reactsoft.com>
Sat, 20 Dec 2003 15:42:47 +0000 (15:42 +0000)
committerThomas Bluemel <thomas@reactsoft.com>
Sat, 20 Dec 2003 15:42:47 +0000 (15:42 +0000)
svn path=/trunk/; revision=7134

reactos/subsys/win32k/include/caret.h
reactos/subsys/win32k/include/msgqueue.h
reactos/subsys/win32k/main/dllmain.c
reactos/subsys/win32k/ntuser/caret.c
reactos/subsys/win32k/ntuser/misc.c
reactos/subsys/win32k/ntuser/msgqueue.c

index 13d9904..c9a83d8 100644 (file)
@@ -1,11 +1,10 @@
 #ifndef _WIN32K_CARET_H
 #define _WIN32K_CARET_H
 
-#include <ddk/ntddk.h>
-#include <napi/win32.h>
+#include <windows.h>
+#include <internal/ps.h>
 
 #define IDCARETTIMER (0xffff)
-#define ThrdCaretInfo(x) (PTHRDCARETINFO)((PW32THREAD)(x + 1))
 
 /* a copy of this structure is in lib/user32/include/user32.h */
 typedef struct _THRDCARETINFO
index aac43c5..c36825a 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <internal/ex.h>
 #include <windows.h>
+#include "caret.h"
 #include "hook.h"
 
 typedef struct _USER_MESSAGE
@@ -74,6 +75,9 @@ typedef struct _USER_MESSAGE_QUEUE
   HWND MenuOwner;
   /* Identifes the menu state */
   BYTE MenuState;
+  /* Caret information for this queue */
+  PTHRDCARETINFO CaretInfo;
+  
   /* Window hooks */
   PHOOKTABLE Hooks;
 
index aee281f..0c17e0d 100644 (file)
@@ -16,7 +16,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-/* $Id: dllmain.c,v 1.62 2003/12/13 22:38:29 weiden Exp $
+/* $Id: dllmain.c,v 1.63 2003/12/20 15:42:47 weiden Exp $
  *
  *  Entry Point for win32k.sys
  */
@@ -216,7 +216,7 @@ DllMain (
                            Win32kThreadCallback,
                            0,
                            0,
-                           sizeof(W32THREAD) + sizeof(THRDCARETINFO),
+                           sizeof(W32THREAD),
                            sizeof(W32PROCESS));
 
   WinPosSetupInternalPos();
index 5660404..3537989 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: caret.c,v 1.8 2003/11/23 11:39:48 navaraf Exp $
+/* $Id: caret.c,v 1.9 2003/12/20 15:42:47 weiden Exp $
  *
  * COPYRIGHT:        See COPYING in the top level directory
  * PROJECT:          ReactOS kernel
@@ -43,9 +43,18 @@ IntHideCaret(PTHRDCARETINFO CaretInfo)
 BOOL FASTCALL
 IntDestroyCaret(PW32THREAD Win32Thread)
 {
-  PTHRDCARETINFO CaretInfo = ThrdCaretInfo(Win32Thread);
-  IntHideCaret(CaretInfo);
-  RtlZeroMemory(CaretInfo, sizeof(THRDCARETINFO));
+  PUSER_MESSAGE_QUEUE ThreadQueue;
+  ThreadQueue = (PUSER_MESSAGE_QUEUE)Win32Thread->MessageQueue;
+  
+  if(!ThreadQueue || !ThreadQueue->CaretInfo)
+    return FALSE;
+  
+  IntHideCaret(ThreadQueue->CaretInfo);
+  ThreadQueue->CaretInfo->Bitmap = (HBITMAP)0;
+  ThreadQueue->CaretInfo->hWnd = (HWND)0;
+  ThreadQueue->CaretInfo->Size.cx = ThreadQueue->CaretInfo->Size.cy = 0;
+  ThreadQueue->CaretInfo->Showing = 0;
+  ThreadQueue->CaretInfo->Visible = 0;
   return TRUE;
 }
 
@@ -80,7 +89,6 @@ IntSetCaretBlinkTime(UINT uMSeconds)
   return TRUE;
 }
 
-#define CARET_VALUE_BUFFER_SIZE 32
 UINT FASTCALL
 IntQueryCaretBlinkRate(VOID)
 {
@@ -185,18 +193,19 @@ IntGetCaretBlinkTime(VOID)
 BOOL FASTCALL
 IntSetCaretPos(int X, int Y)
 {
-  PTHRDCARETINFO CaretInfo = ThrdCaretInfo(PsGetCurrentThread()->Win32Thread);
+  PUSER_MESSAGE_QUEUE ThreadQueue;
+  ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue;
   
-  if(CaretInfo->hWnd)
+  if(ThreadQueue->CaretInfo->hWnd)
   {
-    if(CaretInfo->Pos.x != X || CaretInfo->Pos.y != Y)
+    if(ThreadQueue->CaretInfo->Pos.x != X || ThreadQueue->CaretInfo->Pos.y != Y)
     {
-      IntHideCaret(CaretInfo);
-      CaretInfo->Showing = 0;
-      CaretInfo->Pos.x = X;
-      CaretInfo->Pos.y = Y;
-      IntCallWindowProc(NULL, CaretInfo->hWnd, WM_SYSTIMER, IDCARETTIMER, 0);
-      IntSetTimer(CaretInfo->hWnd, IDCARETTIMER, IntGetCaretBlinkTime(), NULL, TRUE);
+      IntHideCaret(ThreadQueue->CaretInfo);
+      ThreadQueue->CaretInfo->Showing = 0;
+      ThreadQueue->CaretInfo->Pos.x = X;
+      ThreadQueue->CaretInfo->Pos.y = Y;
+      IntCallWindowProc(NULL, ThreadQueue->CaretInfo->hWnd, WM_SYSTIMER, IDCARETTIMER, 0);
+      IntSetTimer(ThreadQueue->CaretInfo->hWnd, IDCARETTIMER, IntGetCaretBlinkTime(), NULL, TRUE);
     }
     return TRUE;
   }
@@ -207,12 +216,13 @@ IntSetCaretPos(int X, int Y)
 BOOL FASTCALL
 IntSwitchCaretShowing(PVOID Info)
 {
-  PTHRDCARETINFO CaretInfo = ThrdCaretInfo(PsGetCurrentThread()->Win32Thread);
+  PUSER_MESSAGE_QUEUE ThreadQueue;
+  ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue;
   
-  if(CaretInfo->hWnd)
+  if(ThreadQueue->CaretInfo->hWnd)
   {
-    CaretInfo->Showing = (CaretInfo->Showing ? 0 : 1);
-    MmCopyToCaller(Info, CaretInfo, sizeof(THRDCARETINFO));
+    ThreadQueue->CaretInfo->Showing = (ThreadQueue->CaretInfo->Showing ? 0 : 1);
+    MmCopyToCaller(Info, ThreadQueue->CaretInfo, sizeof(THRDCARETINFO));
     return TRUE;
   }
   
@@ -222,12 +232,14 @@ IntSwitchCaretShowing(PVOID Info)
 VOID FASTCALL
 IntDrawCaret(HWND hWnd)
 {
-  PTHRDCARETINFO CaretInfo = ThrdCaretInfo(PsGetCurrentThread()->Win32Thread);
+  PUSER_MESSAGE_QUEUE ThreadQueue;
+  ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue;
   
-  if(CaretInfo->hWnd && CaretInfo->Visible && CaretInfo->Showing)
+  if(ThreadQueue->CaretInfo->hWnd && ThreadQueue->CaretInfo->Visible && 
+     ThreadQueue->CaretInfo->Showing)
   {
-    IntCallWindowProc(NULL, CaretInfo->hWnd, WM_SYSTIMER, IDCARETTIMER, 0);
-    CaretInfo->Showing = 1;
+    IntCallWindowProc(NULL, ThreadQueue->CaretInfo->hWnd, WM_SYSTIMER, IDCARETTIMER, 0);
+    ThreadQueue->CaretInfo->Showing = 1;
   }
 }
 
@@ -242,7 +254,7 @@ NtUserCreateCaret(
   int nHeight)
 {
   PWINDOW_OBJECT WindowObject;
-  PTHRDCARETINFO CaretInfo;
+  PUSER_MESSAGE_QUEUE ThreadQueue;
   
   WindowObject = IntGetWindowObject(hWnd);
   if(!WindowObject)
@@ -260,25 +272,24 @@ NtUserCreateCaret(
   
   IntRemoveTimer(hWnd, IDCARETTIMER, PsGetCurrentThreadId(), TRUE);
   
-  CaretInfo = ThrdCaretInfo(WindowObject->OwnerThread->Win32Thread);
+  ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue;
   
-  IntHideCaret(CaretInfo);
+  IntHideCaret(ThreadQueue->CaretInfo);
   
-  CaretInfo->hWnd = hWnd;
+  ThreadQueue->CaretInfo->hWnd = hWnd;
   if(hBitmap)
   {
-    CaretInfo->Bitmap = hBitmap;
-    CaretInfo->Size.cx = CaretInfo->Size.cy = 0;
+    ThreadQueue->CaretInfo->Bitmap = hBitmap;
+    ThreadQueue->CaretInfo->Size.cx = ThreadQueue->CaretInfo->Size.cy = 0;
   }
   else
   {
-    CaretInfo->Bitmap = (HBITMAP)0;
-    CaretInfo->Size.cx = nWidth;
-    CaretInfo->Size.cy = nHeight;
+    ThreadQueue->CaretInfo->Bitmap = (HBITMAP)0;
+    ThreadQueue->CaretInfo->Size.cx = nWidth;
+    ThreadQueue->CaretInfo->Size.cy = nHeight;
   }
-  CaretInfo->Pos.x = CaretInfo->Pos.y = 0;
-  CaretInfo->Visible = 0;
-  CaretInfo->Showing = 0;
+  ThreadQueue->CaretInfo->Visible = 0;
+  ThreadQueue->CaretInfo->Showing = 0;
   
   IntReleaseWindowObject(WindowObject);  
   return TRUE;
@@ -296,12 +307,12 @@ STDCALL
 NtUserGetCaretPos(
   LPPOINT lpPoint)
 {
-  PTHRDCARETINFO CaretInfo;
+  PUSER_MESSAGE_QUEUE ThreadQueue;
   NTSTATUS Status;
   
-  CaretInfo = ThrdCaretInfo(PsGetCurrentThread()->Win32Thread);
+  ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue;
   
-  Status = MmCopyToCaller(lpPoint, &(CaretInfo->Pos), sizeof(POINT));
+  Status = MmCopyToCaller(lpPoint, &(ThreadQueue->CaretInfo->Pos), sizeof(POINT));
   if(!NT_SUCCESS(Status))
   {
     SetLastNtError(Status);
@@ -317,7 +328,7 @@ NtUserHideCaret(
   HWND hWnd)
 {
   PWINDOW_OBJECT WindowObject;
-  PTHRDCARETINFO CaretInfo;
+  PUSER_MESSAGE_QUEUE ThreadQueue;
   
   WindowObject = IntGetWindowObject(hWnd);
   if(!WindowObject)
@@ -333,22 +344,22 @@ NtUserHideCaret(
     return FALSE;
   }
   
-  CaretInfo = ThrdCaretInfo(PsGetCurrentThread()->Win32Thread);
+  ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue;
   
-  if(CaretInfo->hWnd != hWnd)
+  if(ThreadQueue->CaretInfo->hWnd != hWnd)
   {
     IntReleaseWindowObject(WindowObject);
     SetLastWin32Error(ERROR_ACCESS_DENIED);
     return FALSE;
   }
   
-  if(CaretInfo->Visible)
+  if(ThreadQueue->CaretInfo->Visible)
   {
     IntRemoveTimer(hWnd, IDCARETTIMER, PsGetCurrentThreadId(), TRUE);
     
-    IntHideCaret(CaretInfo);
-    CaretInfo->Visible = 0;
-    CaretInfo->Showing = 0;
+    IntHideCaret(ThreadQueue->CaretInfo);
+    ThreadQueue->CaretInfo->Visible = 0;
+    ThreadQueue->CaretInfo->Showing = 0;
   }
   
   IntReleaseWindowObject(WindowObject);
@@ -361,7 +372,7 @@ NtUserShowCaret(
   HWND hWnd)
 {
   PWINDOW_OBJECT WindowObject;
-  PTHRDCARETINFO CaretInfo;
+  PUSER_MESSAGE_QUEUE ThreadQueue;
   
   WindowObject = IntGetWindowObject(hWnd);
   if(!WindowObject)
@@ -377,21 +388,21 @@ NtUserShowCaret(
     return FALSE;
   }
   
-  CaretInfo = ThrdCaretInfo(PsGetCurrentThread()->Win32Thread);
+  ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue;
   
-  if(CaretInfo->hWnd != hWnd)
+  if(ThreadQueue->CaretInfo->hWnd != hWnd)
   {
     IntReleaseWindowObject(WindowObject);
     SetLastWin32Error(ERROR_ACCESS_DENIED);
     return FALSE;
   }
   
-  if(!CaretInfo->Visible)
+  if(!ThreadQueue->CaretInfo->Visible)
   {
-    CaretInfo->Visible = 1;
-    if(!CaretInfo->Showing)
+    ThreadQueue->CaretInfo->Visible = 1;
+    if(!ThreadQueue->CaretInfo->Showing)
     {
-      IntCallWindowProc(NULL, CaretInfo->hWnd, WM_SYSTIMER, IDCARETTIMER, 0);
+      IntCallWindowProc(NULL, ThreadQueue->CaretInfo->hWnd, WM_SYSTIMER, IDCARETTIMER, 0);
     }
     IntSetTimer(hWnd, IDCARETTIMER, IntGetCaretBlinkTime(), NULL, TRUE);
   }
index f96e610..9bef45c 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: misc.c,v 1.35 2003/12/19 19:30:05 weiden Exp $
+/* $Id: misc.c,v 1.36 2003/12/20 15:42:47 weiden Exp $
  *
  * COPYRIGHT:        See COPYING in the top level directory
  * PROJECT:          ReactOS kernel
@@ -588,8 +588,8 @@ NtUserGetGUIThreadInfo(
     return FALSE;
   }
   
-  CaretInfo = ThrdCaretInfo(Thread->Win32Thread);
   MsgQueue = (PUSER_MESSAGE_QUEUE)Desktop->ActiveMessageQueue;
+  CaretInfo = MsgQueue->CaretInfo;
   
   SafeGui.flags = (CaretInfo->Visible ? GUI_CARETBLINKING : 0);
   if(MsgQueue->MenuOwner)
index 6332306..e5d7fac 100644 (file)
@@ -16,7 +16,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-/* $Id: msgqueue.c,v 1.51 2003/12/19 19:30:05 weiden Exp $
+/* $Id: msgqueue.c,v 1.52 2003/12/20 15:42:47 weiden Exp $
  *
  * COPYRIGHT:        See COPYING in the top level directory
  * PROJECT:          ReactOS kernel
@@ -42,6 +42,7 @@
 #include <include/input.h>
 #include <include/cursoricon.h>
 #include <include/focus.h>
+#include <include/caret.h>
 
 #define NDEBUG
 #include <win32k/debug1.h>
@@ -810,6 +811,7 @@ VOID FASTCALL
 MsqInitializeMessageQueue(struct _ETHREAD *Thread, PUSER_MESSAGE_QUEUE MessageQueue)
 {
   MessageQueue->Thread = Thread;
+  MessageQueue->CaretInfo = (PTHRDCARETINFO)(MessageQueue + 1);
   InitializeListHead(&MessageQueue->PostedMessagesListHead);
   InitializeListHead(&MessageQueue->SentMessagesListHead);
   InitializeListHead(&MessageQueue->HardwareMessagesListHead);
@@ -846,7 +848,7 @@ MsqCreateMessageQueue(struct _ETHREAD *Thread)
   PUSER_MESSAGE_QUEUE MessageQueue;
 
   MessageQueue = (PUSER_MESSAGE_QUEUE)ExAllocatePool(PagedPool,
-                                  sizeof(USER_MESSAGE_QUEUE));
+                                  sizeof(USER_MESSAGE_QUEUE) + sizeof(THRDCARETINFO));
   if (!MessageQueue)
     {
       return NULL;