Kernel/drvutil - Fixes to cursor handling
authorJohn Hodge <[email protected]>
Sat, 22 Oct 2011 09:41:05 +0000 (17:41 +0800)
committerJohn Hodge <[email protected]>
Sat, 22 Oct 2011 09:41:05 +0000 (17:41 +0800)
Kernel/drvutil.c
Kernel/include/api_drv_video.h
Modules/Display/VESA/main.c

index 8847ae2..6de004b 100644 (file)
@@ -32,22 +32,22 @@ tVideo_IOCtl_Bitmap gDrvUtil_TextModeCursor = {
        8, 16,
        0, 0,
        {
-                0, 0         , 0, 0, 0, 0, 0, 0,
-               -1, 0xFF000000, 0, 0, 0, 0, 0, 0,
-               -1, 0xFF000000, 0, 0, 0, 0, 0, 0,
-               -1, 0xFF000000, 0, 0, 0, 0, 0, 0,
-               -1, 0xFF000000, 0, 0, 0, 0, 0, 0,
-               -1, 0xFF000000, 0, 0, 0, 0, 0, 0,
-               -1, 0xFF000000, 0, 0, 0, 0, 0, 0,
-               -1, 0xFF000000, 0, 0, 0, 0, 0, 0,
-               -1, 0xFF000000, 0, 0, 0, 0, 0, 0,
-               -1, 0xFF000000, 0, 0, 0, 0, 0, 0,
-               -1, 0xFF000000, 0, 0, 0, 0, 0, 0,
-               -1, 0xFF000000, 0, 0, 0, 0, 0, 0,
-               -1, 0xFF000000, 0, 0, 0, 0, 0, 0,
-               -1, 0xFF000000, 0, 0, 0, 0, 0, 0,
-               -1, 0xFF000000, 0, 0, 0, 0, 0, 0,
-                0, 0         , 0, 0, 0, 0, 0, 0
+               0, 0, 0         , 0, 0, 0, 0, 0,
+               0,-1, 0xFF000000, 0, 0, 0, 0, 0,
+               0,-1, 0xFF000000, 0, 0, 0, 0, 0,
+               0,-1, 0xFF000000, 0, 0, 0, 0, 0,
+               0,-1, 0xFF000000, 0, 0, 0, 0, 0,
+               0,-1, 0xFF000000, 0, 0, 0, 0, 0,
+               0,-1, 0xFF000000, 0, 0, 0, 0, 0,
+               0,-1, 0xFF000000, 0, 0, 0, 0, 0,
+               0,-1, 0xFF000000, 0, 0, 0, 0, 0,
+               0,-1, 0xFF000000, 0, 0, 0, 0, 0,
+               0,-1, 0xFF000000, 0, 0, 0, 0, 0,
+               0,-1, 0xFF000000, 0, 0, 0, 0, 0,
+               0,-1, 0xFF000000, 0, 0, 0, 0, 0,
+               0,-1, 0xFF000000, 0, 0, 0, 0, 0,
+               0, 0, 0         , 0, 0, 0, 0, 0,
+               0, 0, 0         , 0, 0, 0, 0, 0
        }
 };
 
@@ -131,8 +131,15 @@ int DrvUtil_Video_2DStream(void *Ent, void *Buffer, int Length,
 int DrvUtil_Video_WriteLFB(tDrvUtil_Video_BufInfo *FBInfo, size_t Offset, size_t Length, void *Buffer)
 {
        Uint8   *dest;
+        int    csr_x, csr_y;
        ENTER("pFBInfo xOffset xLength pBuffer",
                Mode, FBInfo, Offset, Length, Buffer);
+
+       csr_x = FBInfo->CursorX;
+       csr_y = FBInfo->CursorY;
+
+       DrvUtil_Video_RemoveCursor(FBInfo);
+
        switch( FBInfo->BufferFormat )
        {
        case VIDEO_BUFFMT_TEXT:
@@ -225,11 +232,14 @@ int DrvUtil_Video_WriteLFB(tDrvUtil_Video_BufInfo *FBInfo, size_t Offset, size_t
                LEAVE('i', -1);
                return -1;
        }
+
+       DrvUtil_Video_DrawCursor(FBInfo, csr_x, csr_y);
+
        LEAVE('x', Length);
        return Length;
 }
 
-void DrvUtil_Video_SetCursor(tDrvUtil_Video_BufInfo *Buf, tVideo_IOCtl_Bitmap *Bitmap)
+int DrvUtil_Video_SetCursor(tDrvUtil_Video_BufInfo *Buf, tVideo_IOCtl_Bitmap *Bitmap)
 {
         int    csrX = Buf->CursorX, csrY = Buf->CursorY;
        size_t  size;
@@ -253,29 +263,34 @@ void DrvUtil_Video_SetCursor(tDrvUtil_Video_BufInfo *Buf, tVideo_IOCtl_Bitmap *B
        {
                Buf->CursorX = -1;
                Buf->CursorY = -1;
-               return ;
+               return 0;
+       }
+
+       // Sanity check the bitmap
+       if( !CheckMem(Bitmap, sizeof(*Bitmap)) || !CheckMem(Bitmap->Data, Bitmap->W*Bitmap->H*sizeof(Uint32)) )
+       {
+               Log_Warning("DrvUtil", "DrvUtil_Video_SetCursor: Bitmap (%p) is in invalid memory", Bitmap);
+               errno = -EINVAL;
+               return -1;
        }
 
-       if( Bitmap != &gDrvUtil_TextModeCursor )
+       // Don't take a copy of the DrvUtil provided cursor
+       if( Bitmap == &gDrvUtil_TextModeCursor )
+       {
+               Buf->CursorBitmap = Bitmap;
+       }
+       else
        {
-               // Check the new bitmap is valid
                size = sizeof(tVideo_IOCtl_Bitmap) + Bitmap->W*Bitmap->H*4;
-               if( !CheckMem(Bitmap, size) ) {
-                       Log_Warning("DrvUtil", "DrvUtil_Video_SetCursor: Bitmap (%p) is in invalid memory", Bitmap);
-                       return;
-               }
                
                // Take a copy
                Buf->CursorBitmap = malloc( size );
                memcpy(Buf->CursorBitmap, Bitmap, size);
        }
-       else
-       {
-               Buf->CursorBitmap = &gDrvUtil_TextModeCursor;
-       }
        
        // Restore cursor position
        DrvUtil_Video_DrawCursor(Buf, csrX, csrY);
+       return 0;
 }
 
 void DrvUtil_Video_DrawCursor(tDrvUtil_Video_BufInfo *Buf, int X, int Y)
index ab7dcdb..f2d1a2d 100644 (file)
@@ -460,7 +460,7 @@ extern int  DrvUtil_Video_WriteLFB(tDrvUtil_Video_BufInfo *FBInfo, size_t Offset,
  * \param Buf  Framebuffer descriptor\r
  * \param Bitmap       New cursor bitmap\r
  */\r
-extern void    DrvUtil_Video_SetCursor(tDrvUtil_Video_BufInfo *Buf, tVideo_IOCtl_Bitmap *Bitmap);\r
+extern int     DrvUtil_Video_SetCursor(tDrvUtil_Video_BufInfo *Buf, tVideo_IOCtl_Bitmap *Bitmap);\r
 /**\r
  * \brief Render the cursor at (\a X, \a Y)\r
  * \param Buf  Framebuffer descriptor, see type for details\r
index 8b227ea..b543c23 100644 (file)
@@ -206,6 +206,10 @@ int Vesa_IOCtl(tVFS_Node *Node, int ID, void *Data)
                giVesaCursorY = ((tVideo_IOCtl_Pos*)Data)->y;\r
                Vesa_int_ShowCursor();\r
                return 0;\r
+       \r
+       case VIDEO_IOCTL_SETCURSORBITMAP:\r
+               DrvUtil_Video_SetCursor( &gVesa_BufInfo, Data );\r
+               return 0;\r
        }\r
        return 0;\r
 }\r

UCC git Repository :: git.ucc.asn.au