update for HEAD-2003091401
[reactos.git] / lib / user32 / windows / cursor.c
index 71c88e1..db64b8b 100644 (file)
 
 #include <windows.h>
 #include <user32.h>
+#include <string.h>
 #include <debug.h>
 
+/* INTERNAL ******************************************************************/
+
+/* This callback routine is called directly after switching to gui mode */
+NTSTATUS STDCALL
+User32SetupDefaultCursors(PVOID Arguments, ULONG ArgumentLength)
+{
+  LRESULT Result = TRUE;
+  /* FIXME load system cursor scheme */
+  
+  return(ZwCallbackReturn(&Result, sizeof(LRESULT), STATUS_SUCCESS));
+}
+
 /* FUNCTIONS *****************************************************************/
 
-WINBOOL STDCALL
-CreateCaret(HWND hWnd,
-           HBITMAP hBitmap,
-           int nWidth,
-           int nHeight)
+
+/*
+ * @unimplemented
+ */
+HCURSOR STDCALL
+CopyCursor(HCURSOR pcur)
 {
-  return FALSE;
+  UNIMPLEMENTED;
+  return (HCURSOR)0;
 }
 
+
+/*
+ * @unimplemented
+ */
 HCURSOR STDCALL
 CreateCursor(HINSTANCE hInst,
             int xHotSpot,
@@ -52,64 +71,97 @@ CreateCursor(HINSTANCE hInst,
             CONST VOID *pvANDPlane,
             CONST VOID *pvXORPlane)
 {
-  
+
+  UNIMPLEMENTED;
   return (HCURSOR)0;
 }
 
-WINBOOL STDCALL
-DestroyCaret(VOID)
-{
-  return FALSE;
-}
 
+/*
+ * @unimplemented
+ */
 WINBOOL STDCALL
 DestroyCursor(HCURSOR hCursor)
 {
+  UNIMPLEMENTED;
   return FALSE;
 }
 
-UINT STDCALL
-GetCaretBlinkTime(VOID)
-{
-  return 0;
-}
-
-WINBOOL STDCALL
-GetCaretPos(LPPOINT lpPoint)
-{
-  return FALSE;
-}
 
+/*
+ * @implemented
+ */
 WINBOOL STDCALL
 GetClipCursor(LPRECT lpRect)
 {
-  return FALSE;
+  RECT rc;
+  WINBOOL res;
+  
+  if(!lpRect)
+  {
+    SetLastError(ERROR_NOACCESS);
+    return FALSE;
+  }
+  
+  RtlCopyMemory(&rc, lpRect, sizeof(RECT));
+  res = NtUserGetClipCursor(&rc);
+  RtlCopyMemory(lpRect, &rc, sizeof(RECT));
+  
+  return res;
 }
 
+
+/*
+ * @unimplemented
+ */
 HCURSOR STDCALL
 GetCursor(VOID)
 {
+  UNIMPLEMENTED;
   return (HCURSOR)0;
 }
 
+
+/*
+ * @unimplemented
+ */
 WINBOOL STDCALL
 GetCursorInfo(PCURSORINFO pci)
 {
+  UNIMPLEMENTED;
   return FALSE;
 }
 
+
+/*
+ * @implemented
+ */
 WINBOOL STDCALL
 GetCursorPos(LPPOINT lpPoint)
 {
-  return FALSE;
+  POINT pos;
+  WINBOOL res;
+  /* Windows doesn't check if lpPoint == NULL, we do */
+  if(!lpPoint)
+  {
+    SetLastError(ERROR_INVALID_PARAMETER);
+    return FALSE;
+  }
+  
+  res = (WINBOOL)NtUserCallTwoParam((DWORD)&pos, (DWORD)FALSE, 
+                                    TWOPARAM_ROUTINE_CURSORPOSITION);
+  if(res)
+  {
+    lpPoint->x = pos.x;
+    lpPoint->y = pos.y;
+  }
+  return res;
 }
 
-WINBOOL STDCALL
-HideCaret(HWND hWnd)
-{
-  return FALSE;
-}
 
+/*
+ * @implemented
+ */
 HCURSOR STDCALL
 LoadCursorA(HINSTANCE hInstance,
            LPCSTR lpCursorName)
@@ -118,6 +170,10 @@ LoadCursorA(HINSTANCE hInstance,
                    LR_DEFAULTSIZE));
 }
 
+
+/*
+ * @implemented
+ */
 HCURSOR STDCALL
 LoadCursorFromFileA(LPCSTR lpFileName)
 {
@@ -130,6 +186,10 @@ LoadCursorFromFileA(LPCSTR lpFileName)
   return(Result);
 }
 
+
+/*
+ * @implemented
+ */
 HCURSOR STDCALL
 LoadCursorFromFileW(LPCWSTR lpFileName)
 {
@@ -137,6 +197,10 @@ LoadCursorFromFileW(LPCWSTR lpFileName)
                    LR_LOADFROMFILE | LR_DEFAULTSIZE));
 }
 
+
+/*
+ * @implemented
+ */
 HCURSOR STDCALL
 LoadCursorW(HINSTANCE hInstance,
            LPCWSTR lpCursorName)
@@ -145,47 +209,77 @@ LoadCursorW(HINSTANCE hInstance,
                    LR_DEFAULTSIZE));
 }
 
-WINBOOL STDCALL
-SetCaretBlinkTime(UINT uMSeconds)
-{
-  return FALSE;
-}
 
-WINBOOL STDCALL 
-SetCaretPos(int X,
-           int Y)
+/*
+ * @implemented
+ */
+WINBOOL
+STDCALL
+ClipCursor(
+  CONST RECT *lpRect)
 {
-  return FALSE;
+  RECT rc;
+  if(lpRect)
+  {
+    RtlCopyMemory(&rc, lpRect, sizeof(RECT));
+    return NtUserClipCursor(&rc);
+  }
+  else
+    return NtUserClipCursor(NULL);
 }
 
+
+/*
+ * @unimplemented
+ */
 HCURSOR STDCALL
 SetCursor(HCURSOR hCursor)
 {
+  UNIMPLEMENTED;
   return (HCURSOR)0;
 }
 
+
+/*
+ * @implemented
+ */
 WINBOOL STDCALL
 SetCursorPos(int X,
             int Y)
 {
-  return FALSE;
+  POINT pos;
+  pos.x = (LONG)X;
+  pos.y = (LONG)Y;
+  return (WINBOOL)NtUserCallTwoParam((DWORD)&pos, (DWORD)TRUE, 
+                                     TWOPARAM_ROUTINE_CURSORPOSITION);
 }
 
+
+/*
+ * @unimplemented
+ */
 WINBOOL STDCALL
 SetSystemCursor(HCURSOR hcur,
                DWORD id)
 {
+  UNIMPLEMENTED;
   return FALSE;
 }
 
-WINBOOL STDCALL
-ShowCaret(HWND hWnd)
-{
-  return FALSE;
-}
 
+/*
+ * @unimplemented
+ */
 int STDCALL
 ShowCursor(WINBOOL bShow)
 {
+  UNIMPLEMENTED;
+  return 0;
+}
+
+HCURSOR
+CursorIconToCursor(HICON hIcon, BOOL SemiTransparent)
+{
+  UNIMPLEMENTED;
   return 0;
 }