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

流媒体/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_gemmouse.c,v 1.1 2002/04/22 21:38:05 wmay Exp $";
  21. #endif
  22. /*
  23.  * GEM Mouse manager
  24.  *
  25.  * Patrice Mandin
  26.  */
  27. #include <stdlib.h>
  28. #include <gem.h>
  29. #include "SDL_error.h"
  30. #include "SDL_mouse.h"
  31. #include "SDL_events_c.h"
  32. #include "SDL_cursor_c.h"
  33. #include "SDL_gemmouse_c.h"
  34. /* Defines */
  35. #define MAXCURWIDTH 16
  36. #define MAXCURHEIGHT 16
  37. /* The implementation dependent data for the window manager cursor */
  38. struct WMcursor {
  39. MFORM *mform_p;
  40. };
  41. void GEM_FreeWMCursor(_THIS, WMcursor *cursor)
  42. {
  43. if (cursor == NULL)
  44. return;
  45. graf_mouse(ARROW, NULL);
  46. if (cursor->mform_p != NULL)
  47. free(cursor->mform_p);
  48. free(cursor);
  49. }
  50. WMcursor *GEM_CreateWMCursor(_THIS,
  51. Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y)
  52. {
  53. WMcursor *cursor;
  54. MFORM *new_mform;
  55. int i;
  56. /* Check the size */
  57. if ( (w > MAXCURWIDTH) || (h > MAXCURHEIGHT) ) {
  58. SDL_SetError("Only cursors of dimension (%dx%d) are allowed",
  59. MAXCURWIDTH, MAXCURHEIGHT);
  60. return(NULL);
  61. }
  62. /* Allocate the cursor memory */
  63. cursor = (WMcursor *)malloc(sizeof(WMcursor));
  64. if ( cursor == NULL ) {
  65. SDL_OutOfMemory();
  66. return(NULL);
  67. }
  68. /* Allocate mform */
  69. new_mform = (MFORM *)malloc(sizeof(MFORM));
  70. if (new_mform == NULL) {
  71. free(cursor);
  72. SDL_OutOfMemory();
  73. return(NULL);
  74. }
  75. cursor->mform_p = new_mform;
  76. new_mform->mf_xhot = hot_x;
  77. new_mform->mf_yhot = hot_y;
  78. new_mform->mf_nplanes = 1;
  79. new_mform->mf_fg = 0;
  80. new_mform->mf_bg = 1;
  81. for (i=0;i<MAXCURHEIGHT;i++)
  82. {
  83. new_mform->mf_mask[i]=0;
  84. new_mform->mf_data[i]=0;
  85. }
  86. if (w<=8) {
  87. for (i=0;i<h;i++)
  88. {
  89. new_mform->mf_mask[i]= mask[i]<<8;
  90. new_mform->mf_data[i]= data[i]<<8;
  91. }
  92. } else {
  93. for (i=0;i<h;i++)
  94. {
  95. new_mform->mf_mask[i]= mask[i<<1]<<8 | mask[(i<<1)+1];
  96. new_mform->mf_data[i]= data[i<<1]<<8 | data[(i<<1)+1];
  97. }
  98. }
  99. return cursor;
  100. }
  101. int GEM_ShowWMCursor(_THIS, WMcursor *cursor)
  102. {
  103. if (cursor == NULL) {
  104. graf_mouse(M_OFF, NULL);
  105. } else if (cursor->mform_p) {
  106. graf_mouse(USER_DEF, cursor->mform_p);
  107. }
  108. return 1;
  109. }
  110. #if 0
  111. void GEM_WarpWMCursor(_THIS, Uint16 x, Uint16 y)
  112. {
  113. /* This seems to work only on AES 3.4 (Falcon) */
  114. EVNTREC warpevent;
  115. warpevent.ap_event = APPEVNT_MOUSE; 
  116. warpevent.ap_value = (x << 16) | y;
  117. appl_tplay(&warpevent, 1, 1000);
  118. }
  119. #endif
  120. void GEM_CheckMouseMode(_THIS)
  121. {
  122. /* If the mouse is hidden and input is grabbed, we use relative mode */
  123. if ( !(SDL_cursorstate & CURSOR_VISIBLE) &&
  124. (this->input_grab != SDL_GRAB_OFF) &&
  125.              (SDL_GetAppState() & SDL_APPACTIVE) ) {
  126. GEM_mouse_relative = SDL_TRUE;
  127. } else {
  128. GEM_mouse_relative = SDL_FALSE;
  129. }
  130. }