SDL_macmouse.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:3k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15.     Sam Lantinga
  16.     slouken@libsdl.org
  17. */
  18. #ifdef SAVE_RCSID
  19. static char rcsid =
  20.  "@(#) $Id: SDL_macmouse.c,v 1.4 2002/04/22 21:38:05 wmay Exp $";
  21. #endif
  22. #include <stdlib.h>
  23. #include <stdio.h>
  24. #if TARGET_API_MAC_CARBON
  25. #include <Carbon.h>
  26. #else
  27. #include <Quickdraw.h>
  28. #endif
  29. /* Routines that are not supported by the Carbon API... */
  30. #if !TARGET_API_MAC_CARBON
  31. #include <CursorDevices.h>
  32. #endif
  33. #include "SDL_error.h"
  34. #include "SDL_mouse.h"
  35. #include "SDL_macmouse_c.h"
  36. /* The implementation dependent data for the window manager cursor */
  37. struct WMcursor {
  38. Cursor curs;
  39. };
  40. void Mac_FreeWMCursor(_THIS, WMcursor *cursor)
  41. {
  42. free(cursor);
  43. }
  44. WMcursor *Mac_CreateWMCursor(_THIS,
  45. Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y)
  46. {
  47. WMcursor *cursor;
  48. int row, bytes;
  49. /* Allocate the cursor memory */
  50. cursor = (WMcursor *)malloc(sizeof(WMcursor));
  51. if ( cursor == NULL ) {
  52. SDL_OutOfMemory();
  53. return(NULL);
  54. }
  55. memset(cursor, 0, sizeof(*cursor));
  56.     
  57.     if (w > 16)
  58.         w = 16;
  59.     
  60.     if (h > 16)
  61.         h = 16;
  62.     
  63. bytes = (w+7)/8;
  64. for ( row=0; row<h; ++row ) {
  65. memcpy(&cursor->curs.data[row], data, bytes);
  66. data += bytes;
  67. }
  68. for ( row=0; row<h; ++row ) {
  69. memcpy(&cursor->curs.mask[row], mask, bytes);
  70. mask += bytes;
  71. }
  72. cursor->curs.hotSpot.h = hot_x;
  73. cursor->curs.hotSpot.v = hot_y;
  74. /* That was easy. :) */
  75. return(cursor);
  76. }
  77. int Mac_cursor_showing = 1;
  78. int Mac_ShowWMCursor(_THIS, WMcursor *cursor)
  79. {
  80. if ( cursor == NULL ) {
  81. if ( Mac_cursor_showing ) {
  82. HideCursor();
  83. Mac_cursor_showing = 0;
  84. }
  85. } else {
  86. SetCursor(&cursor->curs);
  87. if ( ! Mac_cursor_showing ) {
  88. ShowCursor();
  89. Mac_cursor_showing = 1;
  90. }
  91. }
  92. return(1);
  93. }
  94. void Mac_WarpWMCursor(_THIS, Uint16 x, Uint16 y)
  95. {
  96. #if !TARGET_API_MAC_CARBON
  97. CursorDevice *cursordevice;
  98. cursordevice = nil;
  99. CursorDeviceNextDevice(&cursordevice);
  100. if ( cursordevice != nil ) {
  101. WindowPtr saveport;
  102. Point where;
  103. GetPort(&saveport);
  104. SetPort(SDL_Window);
  105. where.h = x;
  106. where.v = y;
  107. LocalToGlobal(&where);
  108. SetPort(saveport);
  109. CursorDeviceMoveTo(cursordevice, where.h, where.v);
  110. }
  111. #endif /* !TARGET_API_MAC_CARBON */
  112. }