static SDL_Window *sdl_window = NULL;
static SDL_Renderer *sdl_renderer = NULL;
static SDL_Texture *sdl_texture = NULL;
+
+#define USE_RENDERER TRUE
#endif
/* stuff needed to work around SDL/Windows fullscreen drawing bug */
static int fullscreen_yoffset;
static int video_xoffset;
static int video_yoffset;
+static boolean limit_screen_updates = FALSE;
+
/* functions from SGE library */
void sge_Line(SDL_Surface *, Sint16, Sint16, Sint16, Sint16, Uint32);
+void SDLLimitScreenUpdates(boolean enable)
+{
+ limit_screen_updates = enable;
+}
+
static void UpdateScreen(SDL_Rect *rect)
{
+ static unsigned int update_screen_delay = 0;
+ unsigned int update_screen_delay_value = 20; /* (milliseconds) */
+
#if 1
+ if (limit_screen_updates &&
+ !DelayReached(&update_screen_delay, update_screen_delay_value))
+ return;
+
+ LimitScreenUpdates(FALSE);
+#endif
+
+#if defined(TARGET_SDL2)
+#if USE_RENDERER
SDL_Surface *screen = backbuffer->surface;
+#if 1
+ if (rect)
+ {
+ int bytes_x = screen->pitch / video.width;
+ int bytes_y = screen->pitch;
+
+ if (video.fullscreen_enabled)
+ bytes_x = screen->pitch / fullscreen_width;
+
+ SDL_UpdateTexture(sdl_texture, rect,
+ screen->pixels + rect->x * bytes_x + rect->y * bytes_y,
+ screen->pitch);
+ }
+ else
+ {
+ SDL_UpdateTexture(sdl_texture, NULL, screen->pixels, screen->pitch);
+ }
+#else
SDL_UpdateTexture(sdl_texture, NULL, screen->pixels, screen->pitch);
+#endif
SDL_RenderClear(sdl_renderer);
SDL_RenderCopy(sdl_renderer, sdl_texture, NULL, NULL);
SDL_RenderPresent(sdl_renderer);
else
SDL_UpdateWindowSurface(sdl_window);
#endif
+
+#else // TARGET_SDL
+ if (rect)
+ SDL_UpdateRects(backbuffer->surface, 1, rect);
+ else
+ SDL_UpdateRect(backbuffer->surface, 0, 0, 0, 0);
+#endif
}
static void setFullscreenParameters(char *fullscreen_mode_string)
{
+#if defined(TARGET_SDL2)
+ fullscreen_width = video.width;
+ fullscreen_height = video.height;
+ fullscreen_xoffset = 0;
+ fullscreen_yoffset = 0;
+
+#else
+
struct ScreenModeInfo *fullscreen_mode;
int i;
break;
}
}
+#endif
}
static void SDLSetWindowIcon(char *basename)
void SDLInitVideoBuffer(DrawBuffer **backbuffer, DrawWindow **window,
boolean fullscreen)
{
+#if !defined(TARGET_SDL2)
static int screen_xy[][2] =
{
{ 640, 480 },
{ 1024, 768 },
{ -1, -1 }
};
- SDL_Rect **modes;
+#endif
+ SDL_Rect **modes = NULL;
+ boolean hardware_fullscreen_available = TRUE;
int i, j;
/* default: normal game window size */
fullscreen_xoffset = 0;
fullscreen_yoffset = 0;
+#if !defined(TARGET_SDL2)
+ /* determine required standard fullscreen mode for game screen size */
for (i = 0; screen_xy[i][0] != -1; i++)
{
if (screen_xy[i][0] >= video.width && screen_xy[i][1] >= video.height)
fullscreen_xoffset = (fullscreen_width - video.width) / 2;
fullscreen_yoffset = (fullscreen_height - video.height) / 2;
+#endif
#if 1
checked_free(video.fullscreen_modes);
video.fullscreen_mode_current = NULL;
#endif
-#if !defined(TARGET_SDL2)
+ video.window_scaling_percent = setup.window_scaling_percent;
+ video.window_scaling_quality = setup.window_scaling_quality;
+
+#if defined(TARGET_SDL2)
+ int num_displays = SDL_GetNumVideoDisplays();
+
+ if (num_displays > 0)
+ {
+ // currently only display modes of first display supported
+ int num_modes = SDL_GetNumDisplayModes(0);
+
+ if (num_modes > 0)
+ {
+ modes = checked_calloc((num_modes + 1) * sizeof(SDL_Rect *));
+
+ for (i = 0; i < num_modes; i++)
+ {
+ SDL_DisplayMode mode;
+
+ if (SDL_GetDisplayMode(0, i, &mode) < 0)
+ break;
+
+ modes[i] = checked_calloc(sizeof(SDL_Rect));
+
+ modes[i]->w = mode.w;
+ modes[i]->h = mode.h;
+ }
+ }
+ }
+#else
/* get available hardware supported fullscreen modes */
modes = SDL_ListModes(NULL, SDL_FULLSCREEN | SDL_HWSURFACE);
-#else
- // (for now, no display modes in SDL2 -- change this later)
- modes = NULL;
#endif
if (modes == NULL)
{
- /* no screen modes available => no fullscreen mode support */
- video.fullscreen_available = FALSE;
+ /* no hardware screen modes available => no fullscreen mode support */
+ // video.fullscreen_available = FALSE;
+ hardware_fullscreen_available = FALSE;
}
else if (modes == (SDL_Rect **)-1)
{
/* in this case, a certain number of screen modes is available */
int num_modes = 0;
- for(i = 0; modes[i] != NULL; i++)
+ for (i = 0; modes[i] != NULL; i++)
{
boolean found_mode = FALSE;
if (num_modes == 0)
{
/* no appropriate screen modes available => no fullscreen mode support */
- video.fullscreen_available = FALSE;
+ // video.fullscreen_available = FALSE;
+ hardware_fullscreen_available = FALSE;
}
}
+ video.fullscreen_available = hardware_fullscreen_available;
+
+#if USE_DESKTOP_FULLSCREEN
+ // in SDL 2.0, there is always support for desktop fullscreen mode
+ // (in SDL 1.2, there is only support for "real" fullscreen mode)
+ video.fullscreen_available = TRUE;
+#endif
+
+#if defined(TARGET_SDL2)
+ if (modes)
+ {
+ for (i = 0; modes[i] != NULL; i++)
+ checked_free(modes[i]);
+
+ checked_free(modes);
+ }
+#endif
+
#if 0
/* set window icon */
SDLSetWindowIcon(program.sdl_icon_filename);
#endif
}
+static SDL_Surface *SDLCreateScreen(DrawBuffer **backbuffer,
+ boolean fullscreen)
+{
+ SDL_Surface *new_surface = NULL;
+
+#if defined(TARGET_SDL2)
+ static boolean fullscreen_enabled = FALSE;
+ int surface_flags_window = SURFACE_FLAGS | SDL_WINDOW_RESIZABLE;
+#if USE_DESKTOP_FULLSCREEN
+ int surface_flags_fullscreen = SURFACE_FLAGS | SDL_WINDOW_FULLSCREEN_DESKTOP;
+#else
+ int surface_flags_fullscreen = SURFACE_FLAGS | SDL_WINDOW_FULLSCREEN;
+#endif
+
+#else
+ int surface_flags_window = SURFACE_FLAGS;
+ int surface_flags_fullscreen = SURFACE_FLAGS | SDL_FULLSCREEN;
+#endif
+
+ int width = (fullscreen ? fullscreen_width : video.width);
+ int height = (fullscreen ? fullscreen_height : video.height);
+ int surface_flags = (fullscreen ? surface_flags_fullscreen :
+ surface_flags_window);
+
+ // default window size is unscaled
+ video.window_width = video.width;
+ video.window_height = video.height;
+
+#if defined(TARGET_SDL2)
+
+ // store if initial screen mode on game start is fullscreen mode
+ if (sdl_window == NULL)
+ {
+#if 0
+ printf("::: GAME STARTS WITH FULLSCREEN %d\n", fullscreen);
+#endif
+
+ video.fullscreen_initial = fullscreen;
+ }
+
+#if USE_RENDERER
+ float window_scaling_factor = (float)setup.window_scaling_percent / 100;
+#if !USE_DESKTOP_FULLSCREEN
+ float screen_scaling_factor = (fullscreen ? 1 : window_scaling_factor);
+#endif
+
+ video.window_width = window_scaling_factor * width;
+ video.window_height = window_scaling_factor * height;
+
+#if 0
+ printf("::: use window scaling factor %f\n", screen_scaling_factor);
+#endif
+
+ if ((*backbuffer)->surface)
+ {
+ SDL_FreeSurface((*backbuffer)->surface);
+ (*backbuffer)->surface = NULL;
+ }
+
+ if (sdl_texture)
+ {
+ SDL_DestroyTexture(sdl_texture);
+ sdl_texture = NULL;
+ }
+
+ if (!(fullscreen && fullscreen_enabled))
+ {
+ if (sdl_renderer)
+ {
+ SDL_DestroyRenderer(sdl_renderer);
+ sdl_renderer = NULL;
+ }
+
+ if (sdl_window)
+ {
+ SDL_DestroyWindow(sdl_window);
+ sdl_window = NULL;
+ }
+ }
+
+#if 0
+ Error(ERR_INFO, "::: checking 'sdl_window' ...");
+
+ if (sdl_window == NULL)
+ Error(ERR_INFO, "::: calling SDL_CreateWindow() [%d, %d, %d] ...",
+ setup.fullscreen, fullscreen, fullscreen_enabled);
+#endif
+
+ if (sdl_window == NULL)
+ sdl_window = SDL_CreateWindow(program.window_title,
+ SDL_WINDOWPOS_CENTERED,
+ SDL_WINDOWPOS_CENTERED,
+#if USE_DESKTOP_FULLSCREEN
+ video.window_width,
+ video.window_height,
+#else
+ (int)(screen_scaling_factor * width),
+ (int)(screen_scaling_factor * height),
+#endif
+ surface_flags);
+
+ if (sdl_window != NULL)
+ {
+#if 0
+ /* if SDL_CreateRenderer() is called from within a VirtualBox Windows VM
+ *without* enabling 2D/3D acceleration and/or guest additions installed,
+ it will crash if flags are *not* set to SDL_RENDERER_SOFTWARE (because
+ it will try to use accelerated graphics and apparently fails miserably) */
+ if (sdl_renderer == NULL)
+ sdl_renderer = SDL_CreateRenderer(sdl_window, -1, SDL_RENDERER_SOFTWARE);
+#else
+ if (sdl_renderer == NULL)
+ sdl_renderer = SDL_CreateRenderer(sdl_window, -1, 0);
+#endif
+
+ if (sdl_renderer != NULL)
+ {
+ SDL_RenderSetLogicalSize(sdl_renderer, width, height);
+ // SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear");
+ SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, setup.window_scaling_quality);
+
+ sdl_texture = SDL_CreateTexture(sdl_renderer,
+ SDL_PIXELFORMAT_ARGB8888,
+ SDL_TEXTUREACCESS_STREAMING,
+ width, height);
+
+ if (sdl_texture != NULL)
+ {
+#if 1
+ // (do not use alpha channel)
+ new_surface = SDL_CreateRGBSurface(0, width, height, 32,
+ 0x00FF0000,
+ 0x0000FF00,
+ 0x000000FF,
+ 0x00000000);
+#else
+ // (this uses an alpha channel, which we don't want here)
+ new_surface = SDL_CreateRGBSurface(0, width, height, 32,
+ 0x00FF0000,
+ 0x0000FF00,
+ 0x000000FF,
+ 0xFF000000);
+#endif
+
+ if (new_surface == NULL)
+ Error(ERR_WARN, "SDL_CreateRGBSurface() failed: %s",
+ SDL_GetError());
+ }
+ else
+ {
+ Error(ERR_WARN, "SDL_CreateTexture() failed: %s", SDL_GetError());
+ }
+ }
+ else
+ {
+ Error(ERR_WARN, "SDL_CreateRenderer() failed: %s", SDL_GetError());
+ }
+ }
+ else
+ {
+ Error(ERR_WARN, "SDL_CreateWindow() failed: %s", SDL_GetError());
+ }
+
+#else
+
+ if (sdl_window)
+ SDL_DestroyWindow(sdl_window);
+
+ sdl_window = SDL_CreateWindow(program.window_title,
+ SDL_WINDOWPOS_CENTERED,
+ SDL_WINDOWPOS_CENTERED,
+ width, height,
+ surface_flags);
+
+ if (sdl_window != NULL)
+ new_surface = SDL_GetWindowSurface(sdl_window);
+#endif
+
+#else
+ new_surface = SDL_SetVideoMode(width, height, video.depth, surface_flags);
+#endif
+
+#if defined(TARGET_SDL2)
+ // store fullscreen state ("video.fullscreen_enabled" may not reflect this!)
+ if (new_surface != NULL)
+ fullscreen_enabled = fullscreen;
+#endif
+
+ return new_surface;
+}
+
boolean SDLSetVideoMode(DrawBuffer **backbuffer, boolean fullscreen)
{
boolean success = TRUE;
+#if 1
+#else
#if defined(TARGET_SDL2)
// int surface_flags_fullscreen = SURFACE_FLAGS | SDL_WINDOW_FULLSCREEN;
int surface_flags_fullscreen = SURFACE_FLAGS | SDL_WINDOW_FULLSCREEN_DESKTOP;
#else
int surface_flags_fullscreen = SURFACE_FLAGS | SDL_FULLSCREEN;
int surface_flags_window = SURFACE_FLAGS;
+#endif
#endif
SDL_Surface *new_surface = NULL;
+ SetWindowTitle();
+
if (*backbuffer == NULL)
*backbuffer = CreateBitmapStruct();
video_yoffset = fullscreen_yoffset;
/* switch display to fullscreen mode, if available */
+#if 1
+ new_surface = SDLCreateScreen(backbuffer, TRUE);
+#else
+
#if defined(TARGET_SDL2)
sdl_window = SDL_CreateWindow(program.window_title,
SDL_WINDOWPOS_CENTERED,
new_surface = SDL_GetWindowSurface(sdl_window);
// SDL_UpdateWindowSurface(sdl_window); // immediately map window
- UpdateScreen(NULL); // immediately map window
+ // UpdateScreen(NULL); // immediately map window
}
#else
new_surface = SDL_SetVideoMode(fullscreen_width, fullscreen_height,
video.depth, surface_flags_fullscreen);
+#endif
#endif
if (new_surface == NULL)
video_yoffset = 0;
/* switch display to window mode */
+#if 1
+ new_surface = SDLCreateScreen(backbuffer, FALSE);
+#else
+
#if defined(TARGET_SDL2)
-#if 1
- float scale_factor = 1;
+#if USE_RENDERER
+ float screen_scaling_factor = 1.2;
int test_fullscreen = 0;
int surface_flags = (test_fullscreen ? surface_flags_fullscreen :
surface_flags_window);
+ if ((*backbuffer)->surface)
+ SDL_FreeSurface((*backbuffer)->surface);
+
+ if (sdl_texture)
+ SDL_DestroyTexture(sdl_texture);
+
+ if (sdl_renderer)
+ SDL_DestroyRenderer(sdl_renderer);
+
+ if (sdl_window)
+ SDL_DestroyWindow(sdl_window);
+
sdl_window = SDL_CreateWindow(program.window_title,
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
- (int)(scale_factor * video.width),
- (int)(scale_factor * video.height),
+ (int)(screen_scaling_factor * video.width),
+ (int)(screen_scaling_factor * video.height),
surface_flags);
if (sdl_window != NULL)
if (sdl_texture != NULL)
{
+#if 1
+ // (do not use alpha channel)
+ new_surface = SDL_CreateRGBSurface(0, video.width, video.height, 32,
+ 0x00FF0000,
+ 0x0000FF00,
+ 0x000000FF,
+ 0x00000000);
+#else
+ // (this uses an alpha channel, which we don't want here)
new_surface = SDL_CreateRGBSurface(0, video.width, video.height, 32,
0x00FF0000,
0x0000FF00,
0x000000FF,
0xFF000000);
+#endif
if (new_surface == NULL)
Error(ERR_WARN, "SDL_CreateRGBSurface() failed: %s",
{
Error(ERR_WARN, "SDL_CreateWindow() failed: %s", SDL_GetError());
}
+
#else
+
+ if (sdl_window)
+ SDL_DestroyWindow(sdl_window);
+
sdl_window = SDL_CreateWindow(program.window_title,
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
new_surface = SDL_GetWindowSurface(sdl_window);
// SDL_UpdateWindowSurface(sdl_window); // immediately map window
- UpdateScreen(NULL); // immediately map window
+ // UpdateScreen(NULL); // immediately map window
}
#endif
#else
new_surface = SDL_SetVideoMode(video.width, video.height,
video.depth, surface_flags_window);
+#endif
#endif
if (new_surface == NULL)
(*backbuffer)->surface = new_surface;
video.fullscreen_enabled = FALSE;
+ video.window_scaling_percent = setup.window_scaling_percent;
+ video.window_scaling_quality = setup.window_scaling_quality;
success = TRUE;
}
}
+#if defined(TARGET_SDL2)
+ SDLRedrawWindow(); // map window
+ // UpdateScreen(NULL); // map window
+#endif
+
#if 1
SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE);
{
SDL_SysWMinfo wminfo;
HWND hwnd;
+ boolean wminfo_success = FALSE;
SDL_VERSION(&wminfo.version);
- SDL_GetWMInfo(&wminfo);
+#if defined(TARGET_SDL2)
+ if (sdl_window)
+ wminfo_success = SDL_GetWindowWMInfo(sdl_window, &wminfo);
+#else
+ wminfo_success = (SDL_GetWMInfo(&wminfo) == 1);
+#endif
- hwnd = wminfo.window;
+ if (wminfo_success)
+ {
+#if defined(TARGET_SDL2)
+ hwnd = wminfo.info.win.window;
+#else
+ hwnd = wminfo.window;
+#endif
- DragAcceptFiles(hwnd, TRUE);
+ DragAcceptFiles(hwnd, TRUE);
+ }
}
#endif
#endif
-
return success;
}
+void SDLSetWindowTitle()
+{
+#if defined(TARGET_SDL2)
+ SDL_SetWindowTitle(sdl_window, program.window_title);
+#else
+ SDL_WM_SetCaption(program.window_title, program.window_title);
+#endif
+}
+
+#if defined(TARGET_SDL2)
+void SDLSetWindowScaling(int window_scaling_percent)
+{
+ if (sdl_window == NULL)
+ return;
+
+ float window_scaling_factor = (float)window_scaling_percent / 100;
+ int new_window_width = (int)(window_scaling_factor * video.width);
+ int new_window_height = (int)(window_scaling_factor * video.height);
+
+#if 0
+ Error(ERR_DEBUG, "::: SDLSetWindowScaling(%d) ...", window_scaling_percent);
+#endif
+
+ SDL_SetWindowSize(sdl_window, new_window_width, new_window_height);
+
+ video.window_scaling_percent = window_scaling_percent;
+ video.window_width = new_window_width;
+ video.window_height = new_window_height;
+
+ SetWindowTitle();
+}
+
+void SDLSetWindowScalingQuality(char *window_scaling_quality)
+{
+ if (sdl_texture == NULL)
+ return;
+
+ SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, window_scaling_quality);
+
+ SDL_Texture *new_texture = SDL_CreateTexture(sdl_renderer,
+ SDL_PIXELFORMAT_ARGB8888,
+ SDL_TEXTUREACCESS_STREAMING,
+ video.width, video.height);
+
+ if (new_texture != NULL)
+ {
+ SDL_DestroyTexture(sdl_texture);
+
+ sdl_texture = new_texture;
+
+ SDLRedrawWindow();
+ }
+
+ video.window_scaling_quality = window_scaling_quality;
+}
+
+void SDLSetWindowFullscreen(boolean fullscreen)
+{
+ if (sdl_window == NULL)
+ return;
+
+#if USE_DESKTOP_FULLSCREEN
+ int flags = (fullscreen ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0);
+#else
+ int flags = (fullscreen ? SDL_WINDOW_FULLSCREEN : 0);
+#endif
+
+#if 0
+ Error(ERR_DEBUG, "::: SDL_SetWindowFullscreen(%d) ...", fullscreen);
+#endif
+
+ if (SDL_SetWindowFullscreen(sdl_window, flags) == 0)
+ video.fullscreen_enabled = fullscreen;
+
+#if 0
+ printf("::: SDLSetWindowFullscreen: %d, %d\n",
+ fullscreen, video.fullscreen_initial);
+#endif
+
+#if 1
+ // if game started in fullscreen mode, window will also get fullscreen size
+ if (!fullscreen && video.fullscreen_initial)
+ {
+ SDLSetWindowScaling(setup.window_scaling_percent);
+ SDL_SetWindowPosition(sdl_window,
+ SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED);
+
+ video.fullscreen_initial = FALSE;
+ }
+#endif
+}
+
+void SDLRedrawWindow()
+{
+ UpdateScreen(NULL);
+}
+#endif
+
void SDLCreateBitmapContent(Bitmap *new_bitmap, int width, int height,
int depth)
{
dst_rect.w = width;
dst_rect.h = height;
- if (src_bitmap != backbuffer || dst_bitmap != window)
+ // if (src_bitmap != backbuffer || dst_bitmap != window)
+ if (!(src_bitmap == backbuffer && dst_bitmap == window))
SDL_BlitSurface((mask_mode == BLIT_MASKED ?
src_bitmap->surface_masked : src_bitmap->surface),
&src_rect, real_dst_bitmap->surface, &dst_rect);
}
#else
if (dst_bitmap == window)
- SDL_UpdateRect(backbuffer->surface, dst_x, dst_y, width, height);
+ {
+ // SDL_UpdateRect(backbuffer->surface, dst_x, dst_y, width, height);
+ UpdateScreen(&dst_rect);
+ }
#endif
}
}
#else
if (dst_bitmap == window)
- SDL_UpdateRect(backbuffer->surface, x, y, width, height);
+ {
+ // SDL_UpdateRect(backbuffer->surface, x, y, width, height);
+ UpdateScreen(&rect);
+ }
#endif
}
SDL_Surface *surface_screen = backbuffer->surface;
SDL_Surface *surface_cross = (bitmap_cross ? bitmap_cross->surface : NULL);
SDL_Rect src_rect, dst_rect;
-#if defined(TARGET_SDL2)
SDL_Rect dst_rect2;
-#endif
int src_x = x, src_y = y;
int dst_x = x, dst_y = y;
unsigned int time_last, time_current;
dst_rect.w = width; /* (ignored) */
dst_rect.h = height; /* (ignored) */
-#if defined(TARGET_SDL2)
dst_rect2 = dst_rect;
-#endif
if (initialization_needed)
{
// SDL_UpdateWindowSurfaceRects(sdl_window, &dst_rect2, 1);
UpdateScreen(&dst_rect2);
#else
- SDL_UpdateRect(surface_screen, dst_x, dst_y, width, height);
+ // SDL_UpdateRect(surface_screen, dst_x, dst_y, width, height);
+ UpdateScreen(&dst_rect2);
#endif
}
}
// SDL_UpdateWindowSurfaceRects(sdl_window, &dst_rect, 1);
UpdateScreen(&dst_rect);
#else
- SDL_UpdateRect(surface_screen, dst_x, dst_y, width, height);
+ // SDL_UpdateRect(surface_screen, dst_x, dst_y, width, height);
+ UpdateScreen(&dst_rect);
#endif
#else
SDL_Flip(surface_screen);
SDL_SysWMEvent *syswmevent = (SDL_SysWMEvent *)event;
SDL_SysWMmsg *syswmmsg = (SDL_SysWMmsg *)(syswmevent->msg);
+#if defined(TARGET_SDL2)
+ if (syswmmsg->msg.win.msg == WM_DROPFILES)
+#else
if (syswmmsg->msg == WM_DROPFILES)
+#endif
{
+#if defined(TARGET_SDL2)
+ HDROP hdrop = (HDROP)syswmmsg->msg.win.wParam;
+#else
HDROP hdrop = (HDROP)syswmmsg->wParam;
+#endif
int i, num_files;
printf("::: SDL_SYSWMEVENT:\n");
printf("::: - '%s'\n", buffer);
}
+#if defined(TARGET_SDL2)
+ DragFinish((HDROP)syswmmsg->msg.win.wParam);
+#else
DragFinish((HDROP)syswmmsg->wParam);
+#endif
}
#endif
}