+ // error message already issued by "ExtractZipFileIntoDirectory()"
+
+ return TREE_TYPE_UNDEFINED;
+ }
+
+ // add extracted level or artwork set to tree info structure
+ AddTreeSetToTreeInfo(tree_node, directory, top_dir, tree_type);
+
+ // force restart after adding level collection
+ if (getTreeInfoFromIdentifier(TREE_FIRST_NODE(tree_type), top_dir) == NULL)
+ {
+ Request("Program must be restarted after adding a new level collection!",
+ REQ_CONFIRM);
+
+ CloseAllAndExit(0);
+ }
+
+ // update menu screen (and possibly change current level set)
+ DrawScreenAfterAddingSet(top_dir, tree_type);
+
+ return tree_type;
+}
+
+static void HandleDropTextEvent(char *text)
+{
+ Debug("event:droptext", "text == '%s'", text);
+}
+
+static void HandleDropCompleteEvent(int num_level_sets_succeeded,
+ int num_artwork_sets_succeeded,
+ int num_files_failed)
+{
+ // only show request dialog if no other request dialog already active
+ if (game.request_active)
+ return;
+
+ // this case can happen with drag-and-drop with older SDL versions
+ if (num_level_sets_succeeded == 0 &&
+ num_artwork_sets_succeeded == 0 &&
+ num_files_failed == 0)
+ return;
+
+ char message[100];
+
+ if (num_level_sets_succeeded > 0 || num_artwork_sets_succeeded > 0)
+ {
+ char message_part1[50];
+
+ sprintf(message_part1, "New %s set%s added",
+ (num_artwork_sets_succeeded == 0 ? "level" :
+ num_level_sets_succeeded == 0 ? "artwork" : "level and artwork"),
+ (num_level_sets_succeeded +
+ num_artwork_sets_succeeded > 1 ? "s" : ""));
+
+ if (num_files_failed > 0)
+ sprintf(message, "%s, but %d dropped file%s failed!",
+ message_part1, num_files_failed, num_files_failed > 1 ? "s" : "");
+ else
+ sprintf(message, "%s!", message_part1);
+ }
+ else if (num_files_failed > 0)
+ {
+ sprintf(message, "Failed to process dropped file%s!",
+ num_files_failed > 1 ? "s" : "");
+ }
+
+ Request(message, REQ_CONFIRM);
+}
+
+void HandleDropEvent(Event *event)
+{
+ Debug("event:drop", (event->type == SDL_DROPBEGIN ? "SDL_DROPBEGIN" :
+ event->type == SDL_DROPFILE ? "SDL_DROPFILE" :
+ event->type == SDL_DROPTEXT ? "SDL_DROPTEXT" :
+ event->type == SDL_DROPCOMPLETE ? "SDL_DROPCOMPLETE" :
+ "(unknown drop event type)"));
+
+ static boolean confirm_on_drop_complete = FALSE;
+ static int num_level_sets_succeeded = 0;
+ static int num_artwork_sets_succeeded = 0;
+ static int num_files_failed = 0;
+
+ switch (event->type)
+ {
+ case SDL_DROPBEGIN:
+ {
+ confirm_on_drop_complete = TRUE;
+ num_level_sets_succeeded = 0;
+ num_artwork_sets_succeeded = 0;
+ num_files_failed = 0;
+
+ break;
+ }
+
+ case SDL_DROPFILE:
+ {
+ int tree_type = HandleDropFileEvent(event->drop.file);
+
+ if (tree_type == TREE_TYPE_LEVEL_DIR)
+ num_level_sets_succeeded++;
+ else if (tree_type == TREE_TYPE_GRAPHICS_DIR ||
+ tree_type == TREE_TYPE_SOUNDS_DIR ||
+ tree_type == TREE_TYPE_MUSIC_DIR)
+ num_artwork_sets_succeeded++;
+ else
+ num_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(num_level_sets_succeeded,
+ num_artwork_sets_succeeded,
+ num_files_failed);
+
+ num_level_sets_succeeded = 0;
+ num_artwork_sets_succeeded = 0;
+ num_files_failed = 0;
+ }
+
+ break;
+ }
+
+ case SDL_DROPTEXT:
+ {
+ HandleDropTextEvent(event->drop.file);
+
+ break;
+ }
+
+ case SDL_DROPCOMPLETE:
+ {
+ HandleDropCompleteEvent(num_level_sets_succeeded,
+ num_artwork_sets_succeeded,
+ num_files_failed);
+
+ break;
+ }
+ }
+
+ if (event->drop.file != NULL)
+ SDL_free(event->drop.file);
+}
+
+void HandleUserEvent(UserEvent *event)
+{
+ switch (event->code)
+ {
+ case USEREVENT_ANIM_DELAY_ACTION:
+ case USEREVENT_ANIM_EVENT_ACTION:
+ // execute action functions until matching action was found
+ if (DoKeysymAction(event->value1) ||
+ DoGadgetAction(event->value1) ||
+ DoScreenAction(event->value1))
+ return;
+ break;
+
+ default:
+ break;
+ }
+}
+
+void HandleButton(int mx, int my, int button, int button_nr)
+{
+ static int old_mx = 0, old_my = 0;
+ boolean button_hold = FALSE;
+ boolean handle_gadgets = TRUE;
+ int game_status_last = game_status;
+
+ if (button_nr < 0)
+ {
+ mx = old_mx;
+ my = old_my;
+ button_nr = -button_nr;
+ button_hold = TRUE;
+ }
+ else
+ {
+ old_mx = mx;
+ old_my = my;