fixed drag-and-drop support for SDL older than version 2.0.5
authorHolger Schemel <info@artsoft.org>
Wed, 20 Feb 2019 23:59:11 +0000 (00:59 +0100)
committerHolger Schemel <info@artsoft.org>
Wed, 20 Feb 2019 23:59:11 +0000 (00:59 +0100)
src/events.c
src/libgame/system.h

index 0fa609aa4b8146850fe1bb10c1fba0e3ca6156fd..5d95f6a95cf8acbcdea682bd40c91e0dd794ac97 100644 (file)
@@ -268,14 +268,12 @@ void HandleOtherEvents(Event *event)
       HandleJoystickEvent(event);
       break;
 
-#if defined(USE_DRAG_AND_DROP)
     case SDL_DROPBEGIN:
     case SDL_DROPCOMPLETE:
     case SDL_DROPFILE:
     case SDL_DROPTEXT:
       HandleDropEvent(event);
       break;
-#endif
 
     default:
       break;
@@ -1536,7 +1534,6 @@ void HandleClientMessageEvent(ClientMessageEvent *event)
     CloseAllAndExit(0);
 }
 
-#if defined(USE_DRAG_AND_DROP)
 static boolean HandleDropFileEvent(char *filename)
 {
   Error(ERR_DEBUG, "DROP FILE EVENT: '%s'", filename);
@@ -1600,8 +1597,24 @@ static void HandleDropTextEvent(char *text)
   Error(ERR_DEBUG, "DROP TEXT EVENT: '%s'", text);
 }
 
+static void HandleDropCompleteEvent(int files_succeeded, int files_failed)
+{
+  // only show request dialog if no other request dialog already active
+  if (game.request_active)
+    return;
+
+  if (files_succeeded > 0 && files_failed > 0)
+    Request("New level or artwork set(s) added, "
+           "but some dropped file(s) failed!", REQ_CONFIRM);
+  else if (files_succeeded > 0)
+    Request("New level or artwork set(s) added!", REQ_CONFIRM);
+  else if (files_failed > 0)
+    Request("Failed to process dropped file(s)!", REQ_CONFIRM);
+}
+
 void HandleDropEvent(Event *event)
 {
+  static boolean confirm_on_drop_complete = FALSE;
   static int files_succeeded = 0;
   static int files_failed = 0;
 
@@ -1609,6 +1622,7 @@ void HandleDropEvent(Event *event)
   {
     case SDL_DROPBEGIN:
     {
+      confirm_on_drop_complete = TRUE;
       files_succeeded = 0;
       files_failed = 0;
 
@@ -1624,6 +1638,18 @@ void HandleDropEvent(Event *event)
       else
        files_failed++;
 
+      // SDL_DROPBEGIN / SDL_DROPCOMPLETE did not exist in older SDL versions
+      if (!confirm_on_drop_complete)
+      {
+       // process all remaining events, including further SDL_DROPFILE events
+       ClearEventQueue();
+
+       HandleDropCompleteEvent(files_succeeded, files_failed);
+
+       files_succeeded = 0;
+       files_failed = 0;
+      }
+
       break;
     }
 
@@ -1636,17 +1662,7 @@ void HandleDropEvent(Event *event)
 
     case SDL_DROPCOMPLETE:
     {
-      // only show request dialog if no other request dialog already active
-      if (!game.request_active)
-      {
-       if (files_succeeded > 0 && files_failed > 0)
-         Request("New level or artwork set(s) added, "
-                 "but some dropped file(s) failed!", REQ_CONFIRM);
-       else if (files_succeeded > 0)
-         Request("New level or artwork set(s) added!", REQ_CONFIRM);
-       else if (files_failed > 0)
-         Request("Failed to process dropped file(s)!", REQ_CONFIRM);
-      }
+      HandleDropCompleteEvent(files_succeeded, files_failed);
 
       break;
     }
@@ -1655,7 +1671,6 @@ void HandleDropEvent(Event *event)
   if (event->drop.file != NULL)
     SDL_free(event->drop.file);
 }
-#endif
 
 void HandleButton(int mx, int my, int button, int button_nr)
 {
index 35accfe28eb0d15f9188a38828774405b3c1cdca..afb90b7a159a37014a35a43e6f7801876bb2ab9e 100644 (file)
 #endif
 
 // values for drag-and-drop support (some parts not added before SDL 2.0.5)
-#if SDL_VERSION_ATLEAST(2,0,5)
-#define USE_DRAG_AND_DROP
+#if !SDL_VERSION_ATLEAST(2,0,5)
+#define SDL_DROPTEXT                   (SDL_DROPFILE + 1)
+#define SDL_DROPBEGIN                  (SDL_DROPFILE + 2)
+#define SDL_DROPCOMPLETE               (SDL_DROPFILE + 3)
 #endif
 
 // default input keys