ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/SDL/video_sdl.cpp
(Generate patch)

Comparing BasiliskII/src/SDL/video_sdl.cpp (file contents):
Revision 1.20 by gbeauche, 2005-06-14T22:35:42Z vs.
Revision 1.23 by gbeauche, 2006-03-28T07:01:19Z

# Line 135 | Line 135 | static SDL_Color sdl_palette[256];                                     /
135   static bool sdl_palette_changed = false;                        // Flag: Palette changed, redraw thread must set new colors
136   static const int sdl_eventmask = SDL_MOUSEBUTTONDOWNMASK | SDL_MOUSEBUTTONUPMASK | SDL_MOUSEMOTIONMASK | SDL_KEYUPMASK | SDL_KEYDOWNMASK | SDL_VIDEOEXPOSEMASK | SDL_QUITMASK;
137  
138 + // Mutex to protect SDL events
139 + static SDL_mutex *sdl_events_lock = NULL;
140 + #define LOCK_EVENTS SDL_LockMutex(sdl_events_lock)
141 + #define UNLOCK_EVENTS SDL_UnlockMutex(sdl_events_lock)
142 +
143   // Mutex to protect palette
144   static SDL_mutex *sdl_palette_lock = NULL;
145   #define LOCK_PALETTE SDL_LockMutex(sdl_palette_lock)
# Line 158 | Line 163 | extern void SysMountFirstFloppy(void);
163  
164  
165   /*
166 + *  SDL surface locking glue
167 + */
168 +
169 + #ifdef ENABLE_VOSF
170 + #define SDL_VIDEO_LOCK_VOSF_SURFACE(SURFACE) do {                               \
171 +        if ((SURFACE)->flags & (SDL_HWSURFACE | SDL_FULLSCREEN))        \
172 +                the_host_buffer = (uint8 *)(SURFACE)->pixels;                   \
173 + } while (0)
174 + #else
175 + #define SDL_VIDEO_LOCK_VOSF_SURFACE(SURFACE)
176 + #endif
177 +
178 + #define SDL_VIDEO_LOCK_SURFACE(SURFACE) do {    \
179 +        if (SDL_MUSTLOCK(SURFACE)) {                            \
180 +                SDL_LockSurface(SURFACE);                               \
181 +                SDL_VIDEO_LOCK_VOSF_SURFACE(SURFACE);   \
182 +        }                                                                                       \
183 + } while (0)
184 +
185 + #define SDL_VIDEO_UNLOCK_SURFACE(SURFACE) do {  \
186 +        if (SDL_MUSTLOCK(SURFACE))                                      \
187 +                SDL_UnlockSurface(SURFACE);                             \
188 + } while (0)
189 +
190 +
191 + /*
192   *  Framebuffer allocation routines
193   */
194  
195   static void *vm_acquire_framebuffer(uint32 size)
196   {
166 #ifdef SHEEPSHAVER
167 #ifdef DIRECT_ADDRESSING_HACK
168        const uint32 FRAME_BUFFER_BASE = 0x61000000;
169        uint8 *fb = Mac2HostAddr(FRAME_BUFFER_BASE);
170        if (vm_acquire_fixed(fb, size) < 0)
171                fb = VM_MAP_FAILED;
172        return fb;
173 #endif
174 #endif
197          return vm_acquire(size);
198   }
199  
# Line 182 | Line 204 | static inline void vm_release_framebuffe
204  
205  
206   /*
207 + *  Windows message handler
208 + */
209 +
210 + #ifdef WIN32
211 + #include <dbt.h>
212 + static WNDPROC sdl_window_proc = NULL;                          // Window proc used by SDL
213 +
214 + extern void SysMediaArrived(void);
215 + extern void SysMediaRemoved(void);
216 + extern HWND GetMainWindowHandle(void);
217 +
218 + static LRESULT CALLBACK windows_message_handler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
219 + {
220 +        switch (msg) {
221 +        case WM_DEVICECHANGE:
222 +                if (wParam == DBT_DEVICEREMOVECOMPLETE) {
223 +                        DEV_BROADCAST_HDR *p = (DEV_BROADCAST_HDR *)lParam;
224 +                        if (p->dbch_devicetype == DBT_DEVTYP_VOLUME)
225 +                                SysMediaRemoved();
226 +                }
227 +                else if (wParam == DBT_DEVICEARRIVAL) {
228 +                        DEV_BROADCAST_HDR *p = (DEV_BROADCAST_HDR *)lParam;
229 +                        if (p->dbch_devicetype == DBT_DEVTYP_VOLUME)
230 +                                SysMediaArrived();
231 +                }
232 +                return 0;
233 +
234 +        default:
235 +                if (sdl_window_proc)
236 +                        return CallWindowProc(sdl_window_proc, hwnd, msg, wParam, lParam);
237 +        }
238 +
239 +        return DefWindowProc(hwnd, msg, wParam, lParam);
240 + }
241 + #endif
242 +
243 +
244 + /*
245   *  SheepShaver glue
246   */
247  
# Line 1003 | Line 1063 | bool SDL_monitor_desc::video_open(void)
1063                  return false;
1064          }
1065  
1066 + #ifdef WIN32
1067 +        // Chain in a new message handler for WM_DEVICECHANGE
1068 +        HWND the_window = GetMainWindowHandle();
1069 +        sdl_window_proc = (WNDPROC)GetWindowLongPtr(the_window, GWLP_WNDPROC);
1070 +        SetWindowLongPtr(the_window, GWLP_WNDPROC, (LONG_PTR)windows_message_handler);
1071 + #endif
1072 +
1073          // Initialize VideoRefresh function
1074          VideoRefreshInit();
1075  
# Line 1040 | Line 1107 | bool VideoInit(bool classic)
1107   #endif
1108  
1109          // Create Mutexes
1110 +        if ((sdl_events_lock = SDL_CreateMutex()) == NULL)
1111 +                return false;
1112          if ((sdl_palette_lock = SDL_CreateMutex()) == NULL)
1113                  return false;
1114          if ((frame_buffer_lock = SDL_CreateMutex()) == NULL)
# Line 1235 | Line 1304 | void SDL_monitor_desc::video_close(void)
1304   {
1305          D(bug("video_close()\n"));
1306  
1307 + #ifdef WIN32
1308 +        // Remove message handler for WM_DEVICECHANGE
1309 +        HWND the_window = GetMainWindowHandle();
1310 +        SetWindowLongPtr(the_window, GWLP_WNDPROC, (LONG_PTR)sdl_window_proc);
1311 + #endif
1312 +
1313          // Stop redraw thread
1314   #ifndef USE_CPU_EMUL_SERVICES
1315          if (redraw_thread_active) {
# Line 1265 | Line 1340 | void VideoExit(void)
1340                  SDL_DestroyMutex(frame_buffer_lock);
1341          if (sdl_palette_lock)
1342                  SDL_DestroyMutex(sdl_palette_lock);
1343 +        if (sdl_events_lock)
1344 +                SDL_DestroyMutex(sdl_events_lock);
1345   }
1346  
1347  
# Line 1434 | Line 1511 | int16 video_mode_change(VidLocals *csSav
1511   void SDL_monitor_desc::switch_to_current_mode(void)
1512   {
1513          // Close and reopen display
1514 +        LOCK_EVENTS;
1515          video_close();
1516          video_open();
1517 +        UNLOCK_EVENTS;
1518  
1519          if (drv == NULL) {
1520                  ErrorAlert(STR_OPEN_WINDOW_ERR);
# Line 2057 | Line 2136 | static inline void do_video_refresh(void
2136          // Set new cursor image if it was changed
2137          if (cursor_changed && sdl_cursor) {
2138                  cursor_changed = false;
2139 +                LOCK_EVENTS;
2140                  SDL_FreeCursor(sdl_cursor);
2141                  sdl_cursor = SDL_CreateCursor(MacCursor + 4, MacCursor + 36, 16, 16, MacCursor[2], MacCursor[3]);
2142                  if (sdl_cursor)
2143                          SDL_SetCursor(sdl_cursor);
2144 +                UNLOCK_EVENTS;
2145          }
2146   #endif
2147  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines