1 |
|
/* |
2 |
|
* video_sdl.cpp - Video/graphics emulation, SDL specific stuff |
3 |
|
* |
4 |
< |
* Basilisk II (C) 1997-2005 Christian Bauer |
4 |
> |
* Basilisk II (C) 1997-2008 Christian Bauer |
5 |
|
* |
6 |
|
* This program is free software; you can redistribute it and/or modify |
7 |
|
* it under the terms of the GNU General Public License as published by |
136 |
|
static volatile bool cursor_changed = false; // Flag: cursor changed, redraw_func must update the cursor |
137 |
|
static SDL_Color sdl_palette[256]; // Color palette to be used as CLUT and gamma table |
138 |
|
static bool sdl_palette_changed = false; // Flag: Palette changed, redraw thread must set new colors |
139 |
< |
static const int sdl_eventmask = SDL_MOUSEBUTTONDOWNMASK | SDL_MOUSEBUTTONUPMASK | SDL_MOUSEMOTIONMASK | SDL_KEYUPMASK | SDL_KEYDOWNMASK | SDL_VIDEOEXPOSEMASK | SDL_QUITMASK; |
139 |
> |
static const int sdl_eventmask = SDL_MOUSEEVENTMASK | SDL_KEYEVENTMASK | SDL_VIDEOEXPOSEMASK | SDL_QUITMASK | SDL_ACTIVEEVENTMASK; |
140 |
|
|
141 |
|
// Mutex to protect SDL events |
142 |
|
static SDL_mutex *sdl_events_lock = NULL; |
197 |
|
|
198 |
|
static void *vm_acquire_framebuffer(uint32 size) |
199 |
|
{ |
200 |
< |
return vm_acquire(size); |
200 |
> |
// always try to reallocate framebuffer at the same address |
201 |
> |
static void *fb = VM_MAP_FAILED; |
202 |
> |
if (fb != VM_MAP_FAILED) { |
203 |
> |
if (vm_acquire_fixed(fb, size) < 0) { |
204 |
> |
#ifndef SHEEPSHAVER |
205 |
> |
printf("FATAL: Could not reallocate framebuffer at previous address\n"); |
206 |
> |
#endif |
207 |
> |
fb = VM_MAP_FAILED; |
208 |
> |
} |
209 |
> |
} |
210 |
> |
if (fb == VM_MAP_FAILED) |
211 |
> |
fb = vm_acquire(size, VM_MAP_DEFAULT | VM_MAP_32BIT); |
212 |
> |
return fb; |
213 |
|
} |
214 |
|
|
215 |
|
static inline void vm_release_framebuffer(void *fb, uint32 size) |
731 |
|
* Windowed display driver |
732 |
|
*/ |
733 |
|
|
734 |
< |
static int SDL_display_opened = FALSE; |
734 |
> |
static bool SDL_display_opened = false; |
735 |
|
|
736 |
|
// Open display |
737 |
|
driver_window::driver_window(SDL_monitor_desc &m) |
747 |
|
// This is ugly: |
748 |
|
// If we're switching resolutions (ie, not setting it for the first time), |
749 |
|
// there's a bug in SDL where the SDL_Surface created will not be properly |
750 |
< |
// setup. The solution is to SDL_Quit() before calling SDL_SetVideoMode for |
751 |
< |
// the second time (SDL_SetVideoMode will call SDL_Init() and all will be |
752 |
< |
// well). Without this, the video becomes corrupted (at least on Mac OS X), |
753 |
< |
// after the resolution switch (for the second and subsequent times). |
754 |
< |
// EDIT: Ack, this breaks audio! |
755 |
< |
// if (SDL_display_opened) |
744 |
< |
// SDL_Quit(); |
750 |
> |
// setup. The solution is to SDL_QuitSubSystem(SDL_INIT_VIDEO) before calling |
751 |
> |
// SDL_SetVideoMode for the second time (SDL_SetVideoMode will call SDL_Init() |
752 |
> |
// and all will be well). Without this, the video becomes corrupted (at least |
753 |
> |
// on Mac OS X), after the resolution switch. |
754 |
> |
if (SDL_display_opened) |
755 |
> |
SDL_QuitSubSystem(SDL_INIT_VIDEO); |
756 |
|
|
757 |
|
// Create surface |
758 |
|
int depth = sdl_depth_of_video_depth(VIDEO_MODE_DEPTH); |
759 |
|
if ((s = SDL_SetVideoMode(width, height, depth, SDL_HWSURFACE)) == NULL) |
760 |
|
return; |
761 |
|
|
762 |
< |
SDL_display_opened = TRUE; |
762 |
> |
SDL_display_opened = true; |
763 |
|
|
764 |
|
#ifdef ENABLE_VOSF |
765 |
|
use_vosf = true; |
1543 |
|
#ifdef SHEEPSHAVER |
1544 |
|
bool video_can_change_cursor(void) |
1545 |
|
{ |
1546 |
< |
return (display_type == DISPLAY_WINDOW); |
1546 |
> |
static char driver[] = "Quartz?"; |
1547 |
> |
static int quartzok = -1; |
1548 |
> |
|
1549 |
> |
if (display_type != DISPLAY_WINDOW) |
1550 |
> |
return false; |
1551 |
> |
|
1552 |
> |
if (quartzok < 0) { |
1553 |
> |
if (SDL_VideoDriverName(driver, sizeof driver) == NULL || strncmp(driver, "Quartz", sizeof driver)) |
1554 |
> |
quartzok = true; |
1555 |
> |
else { |
1556 |
> |
// Quartz driver bug prevents cursor changing in SDL 1.2.11 and later |
1557 |
> |
const SDL_version *vp = SDL_Linked_Version(); |
1558 |
> |
quartzok = SDL_VERSIONNUM(vp->major, vp->minor, vp->patch) <= SDL_VERSIONNUM(1, 2, 10); |
1559 |
> |
} |
1560 |
> |
} |
1561 |
> |
|
1562 |
> |
return quartzok; |
1563 |
|
} |
1564 |
|
#endif |
1565 |
|
|
1874 |
|
ADBKeyDown(0x7f); // Power key |
1875 |
|
ADBKeyUp(0x7f); |
1876 |
|
break; |
1877 |
+ |
|
1878 |
+ |
// Application activate/deactivate; consume the event but otherwise ignore it |
1879 |
+ |
case SDL_ACTIVEEVENT: |
1880 |
+ |
break; |
1881 |
|
} |
1882 |
|
} |
1883 |
|
} |
2236 |
|
SDL_FreeCursor(sdl_cursor); |
2237 |
|
sdl_cursor = SDL_CreateCursor(MacCursor + 4, MacCursor + 36, 16, 16, MacCursor[2], MacCursor[3]); |
2238 |
|
if (sdl_cursor) { |
2239 |
+ |
SDL_ShowCursor(private_data == NULL || private_data->cursorVisible); |
2240 |
|
SDL_SetCursor(sdl_cursor); |
2241 |
|
#ifdef WIN32 |
2242 |
|
// XXX Windows apparently needs an extra mouse event to |