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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000  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_gsmouse.c,v 1.3 2002/04/22 21:38:05 wmay Exp $";
  21. #endif
  22. #include <stdlib.h>
  23. #include <stdio.h>
  24. #include <sys/ioctl.h>
  25. #include "SDL_error.h"
  26. #include "SDL_mouse.h"
  27. #include "SDL_events_c.h"
  28. #include "SDL_cursor_c.h"
  29. #include "SDL_gsvideo.h"
  30. #include "SDL_gsmouse_c.h"
  31. /* The implementation dependent data for the window manager cursor */
  32. struct WMcursor {
  33. int unused;
  34. };
  35. /* There isn't any implementation dependent data */
  36. void GS_FreeWMCursor(_THIS, WMcursor *cursor)
  37. {
  38. return;
  39. }
  40. /* There isn't any implementation dependent data */
  41. WMcursor *GS_CreateWMCursor(_THIS,
  42. Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y)
  43. {
  44. return((WMcursor *)0x01);
  45. }
  46. static void GS_MoveCursor(_THIS, SDL_Cursor *cursor, int x, int y)
  47. {
  48. SDL_Surface *screen;
  49. struct ps2_image image;
  50. SDL_Rect area;
  51. int mouse_y1, mouse_y2;
  52. void *saved_pixels;
  53. int screen_updated;
  54. /* Lock so we don't interrupt an update with mouse motion */
  55. SDL_LockCursor();
  56. /* Make sure any pending DMA has completed */
  57. if ( dma_pending ) {
  58. ioctl(console_fd, PS2IOC_SENDQCT, 1);
  59. dma_pending = 0;
  60. }
  61. /* Remove the cursor image from the DMA area */
  62. screen = this->screen;
  63. saved_pixels = screen->pixels;
  64. screen->pixels = mapped_mem + screen->offset;
  65. screen_updated = 0;
  66. if ( cursor_drawn ) {
  67. SDL_EraseCursorNoLock(screen);
  68. cursor_drawn = 0;
  69. screen_updated = 1;
  70. }
  71. /* Save the current mouse area */
  72. SDL_MouseRect(&area);
  73. mouse_y1 = area.y;
  74. mouse_y2 = area.y+area.h;
  75. /* Only draw the new cursor if there was one passed in */
  76. if ( cursor ) {
  77. /* Set the new location */
  78. cursor->area.x = (x - cursor->hot_x);
  79. cursor->area.y = (y - cursor->hot_y);
  80. /* Draw the cursor at the new location */
  81. if ( (SDL_cursorstate & CURSOR_VISIBLE) && screen->pixels ) {
  82. SDL_DrawCursorNoLock(screen);
  83. cursor_drawn = 1;
  84. screen_updated = 1;
  85. }
  86. }
  87. screen->pixels = saved_pixels;
  88. /* Update the affected area of the screen */
  89. if ( screen_updated ) {
  90. SDL_MouseRect(&area);
  91. if ( area.y < mouse_y1 ) {
  92. mouse_y1 = area.y;
  93. }
  94. if ( (area.y+area.h) > mouse_y2 ) {
  95. mouse_y2 = area.y+area.h;
  96. }
  97. image = screen_image;
  98. image.y += screen->offset / screen->pitch + mouse_y1;
  99. image.h = mouse_y2 - mouse_y1;
  100. image.ptr = mapped_mem +
  101.             (image.y - screen_image.y) * screen->pitch;
  102. ioctl(console_fd, PS2IOC_LOADIMAGE, &image);
  103. /* Need to scale offscreen image to TV output */
  104. if ( image.y > 0 ) {
  105. scaleimage_nonblock(console_fd,
  106.                     tex_tags_mem, scale_tags_mem);
  107. }
  108. }
  109. /* We're finished */
  110. SDL_UnlockCursor();
  111. }
  112. void GS_MoveWMCursor(_THIS, int x, int y)
  113. {
  114. GS_MoveCursor(this, SDL_cursor, x, y);
  115. }
  116. int GS_ShowWMCursor(_THIS, WMcursor *wmcursor)
  117. {
  118. SDL_Cursor *cursor;
  119. int x, y;
  120. /* Draw the cursor at the appropriate location */
  121. SDL_GetMouseState(&x, &y);
  122. if ( wmcursor ) {
  123. cursor = SDL_cursor;
  124. } else {
  125. cursor = NULL;
  126. }
  127. GS_MoveCursor(this, cursor, x, y);
  128. return(1);
  129. }