pnozz_cursor.c revision d046d9f8
1/* 2 * SBus Weitek P9100 hardware cursor support 3 * 4 * Copyright (C) 2005 Michael Lorenz 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and associated documentation files (the "Software"), to deal 8 * in the Software without restriction, including without limitation the rights 9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 * copies of the Software, and to permit persons to whom the Software is 11 * furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in 14 * all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * MICHAEL LORENZ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 20 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 */ 23/* $NetBSD: pnozz_cursor.c,v 1.2 2011/05/25 23:36:39 macallan Exp $ */ 24 25#include <fcntl.h> 26#include <sys/time.h> 27#include <sys/types.h> 28#include <sys/ioctl.h> 29#include <dev/sun/fbio.h> 30#include <dev/wscons/wsconsio.h> 31 32#include "pnozz.h" 33 34static void PnozzLoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src); 35static void PnozzSetCursorPosition(ScrnInfoPtr pScrn, int x, int y); 36static void PnozzSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg); 37 38static void 39PnozzLoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src) 40{ 41 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 42 43 pPnozz->Cursor.set = FB_CUR_SETSHAPE; 44 pPnozz->Cursor.image = src; 45 pPnozz->Cursor.mask = src + 0x200; 46 47 if (ioctl(pPnozz->psdp->fd, FBIOSCURSOR, &pPnozz->Cursor) == -1) 48 xf86Msg(X_ERROR, "FB_CUR_SETSHAPE failed\n"); 49} 50 51void 52PnozzShowCursor(ScrnInfoPtr pScrn) 53{ 54 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 55 56 if (pPnozz->Cursor.enable == 0) { 57 pPnozz->Cursor.enable = 1; 58 pPnozz->Cursor.set = FB_CUR_SETCUR; 59 if (ioctl(pPnozz->psdp->fd, FBIOSCURSOR, &pPnozz->Cursor) == -1) 60 xf86Msg(X_ERROR, "FB_CUR_SETCUR failed\n"); 61 } 62} 63 64void 65PnozzHideCursor(ScrnInfoPtr pScrn) 66{ 67 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 68 69 if (pPnozz->Cursor.enable == 1) { 70 pPnozz->Cursor.enable = 0; 71 pPnozz->Cursor.set = FB_CUR_SETCUR; 72 if (ioctl(pPnozz->psdp->fd, FBIOSCURSOR, &pPnozz->Cursor) == -1) 73 xf86Msg(X_ERROR, "FB_CUR_SETCUR failed\n"); 74 } 75} 76 77static void 78PnozzSetCursorPosition(ScrnInfoPtr pScrn, int x, int y) 79{ 80 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 81 82 pPnozz->Cursor.pos.x = x + 63; 83 pPnozz->Cursor.pos.y = y + 63; 84 pPnozz->Cursor.set = FB_CUR_SETPOS; 85 if (ioctl(pPnozz->psdp->fd, FBIOSCURSOR, &pPnozz->Cursor) == -1) 86 xf86Msg(X_ERROR, "FB_CUR_SETPOS failed\n"); 87} 88 89static void 90PnozzSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg) 91{ 92 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 93 94 pPnozz->Cursor.set = FB_CUR_SETCMAP; 95 pPnozz->Cursor.cmap.red[0] = (bg & 0xff0000) >> 16; 96 pPnozz->Cursor.cmap.green[0] = (bg & 0xff00) >> 8; 97 pPnozz->Cursor.cmap.blue[0] = bg & 0xff; 98 pPnozz->Cursor.cmap.red[1] = (fg & 0xff0000) >> 16; 99 pPnozz->Cursor.cmap.green[1] = (fg & 0xff00) >> 8; 100 pPnozz->Cursor.cmap.blue[1] = fg & 0xff; 101 if (ioctl(pPnozz->psdp->fd, FBIOSCURSOR, &pPnozz->Cursor) == -1) 102 xf86Msg(X_ERROR, "FB_CUR_SETCMAP failed\n"); 103} 104 105Bool 106PnozzHWCursorInit(ScreenPtr pScreen) 107{ 108 ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; 109 PnozzPtr pPnozz; 110 xf86CursorInfoPtr infoPtr; 111 112 pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 113 114 pPnozz->Cursor.mask = NULL; 115 pPnozz->Cursor.image = NULL; 116 if (ioctl(pPnozz->psdp->fd, FBIOGCURSOR, &pPnozz->Cursor) == -1) { 117 xf86Msg(X_ERROR, "Hardware cursor isn't available\n"); 118 return FALSE; 119 } 120 121 infoPtr = xf86CreateCursorInfoRec(); 122 if(!infoPtr) return FALSE; 123 124 pPnozz->CursorInfoRec = infoPtr; 125 126 infoPtr->MaxWidth = 64; 127 infoPtr->MaxHeight = 64; 128 129 pPnozz->Cursor.hot.x = 63; 130 pPnozz->Cursor.hot.y = 63; 131 pPnozz->Cursor.set = FB_CUR_SETHOT; 132 ioctl(pPnozz->psdp->fd, FBIOSCURSOR, &pPnozz->Cursor); 133 134 pPnozz->Cursor.cmap.red = pPnozz->pal; 135 pPnozz->Cursor.cmap.green = pPnozz->pal + 3; 136 pPnozz->Cursor.cmap.blue = pPnozz->pal + 6; 137 138 infoPtr->Flags = HARDWARE_CURSOR_AND_SOURCE_WITH_MASK | 139 HARDWARE_CURSOR_TRUECOLOR_AT_8BPP /*| 140 HARDWARE_CURSOR_BIT_ORDER_MSBFIRST | HARDWARE_CURSOR_NIBBLE_SWAPPED*/; 141 142 infoPtr->SetCursorColors = PnozzSetCursorColors; 143 infoPtr->SetCursorPosition = PnozzSetCursorPosition; 144 infoPtr->LoadCursorImage = PnozzLoadCursorImage; 145 infoPtr->HideCursor = PnozzHideCursor; 146 infoPtr->ShowCursor = PnozzShowCursor; 147 infoPtr->UseHWCursor = NULL; 148 149 return xf86InitCursor(pScreen, infoPtr); 150} 151