{
((MotionEvent *)event)->x -= video.screen_xoffset;
((MotionEvent *)event)->y -= video.screen_yoffset;
+
+ gfx.mouse_x = ((MotionEvent *)event)->x;
+ gfx.mouse_y = ((MotionEvent *)event)->y;
}
// non-motion events are directly passed to event handler functions
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;
event->pressure);
#endif
+ runtime.uses_touch_device = TRUE;
+
if (game_status != GAME_MODE_PLAYING)
return;
CloseAllAndExit(0);
}
-#if defined(USE_DRAG_AND_DROP)
-static boolean HandleDropFileEvent(char *filename)
+static int HandleDropFileEvent(char *filename)
{
Error(ERR_DEBUG, "DROP FILE EVENT: '%s'", filename);
{
Error(ERR_WARN, "file '%s' not supported", filename);
- return FALSE;
+ return TREE_TYPE_UNDEFINED;
}
TreeInfo *tree_node = NULL;
{
Error(ERR_WARN, "zip file '%s' has invalid content!", filename);
- return FALSE;
+ return TREE_TYPE_UNDEFINED;
}
if (tree_type == TREE_TYPE_LEVEL_DIR &&
{
// error message already issued by "ExtractZipFileIntoDirectory()"
- return FALSE;
+ return TREE_TYPE_UNDEFINED;
}
// add extracted level or artwork set to tree info structure
// update menu screen (and possibly change current level set)
DrawScreenAfterAddingSet(top_dir, tree_type);
- return TRUE;
+ return tree_type;
}
static void HandleDropTextEvent(char *text)
Error(ERR_DEBUG, "DROP TEXT EVENT: '%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)
{
- static int files_succeeded = 0;
- static int files_failed = 0;
+ 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:
{
- files_succeeded = 0;
- files_failed = 0;
+ confirm_on_drop_complete = TRUE;
+ num_level_sets_succeeded = 0;
+ num_artwork_sets_succeeded = 0;
+ num_files_failed = 0;
break;
}
case SDL_DROPFILE:
{
- boolean success = HandleDropFileEvent(event->drop.file);
-
- if (success)
- files_succeeded++;
+ 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
- files_failed++;
+ 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_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(num_level_sets_succeeded,
+ num_artwork_sets_succeeded,
+ num_files_failed);
break;
}
if (event->drop.file != NULL)
SDL_free(event->drop.file);
}
-#endif
void HandleButton(int mx, int my, int button, int button_nr)
{
!virtual_button_pressed));
#endif
- if (HandleGlobalAnimClicks(mx, my, button))
+ if (HandleGlobalAnimClicks(mx, my, button, FALSE))
{
// do not handle this button event anymore
return; // force mouse event not to be handled at all
if (HandleGlobalAnimClicks(-1, -1, (key == KSYM_space ||
key == KSYM_Return ||
- key == KSYM_Escape)))
+ key == KSYM_Escape), TRUE))
{
// do not handle this key event anymore
if (key != KSYM_Escape) // always allow ESC key to be handled
int dy = (up ? -1 : down ? 1 : 0);
boolean use_delay_value_first = (joytest != joytest_last);
- if (HandleGlobalAnimClicks(-1, -1, newbutton))
+ if (HandleGlobalAnimClicks(-1, -1, newbutton, FALSE))
{
// do not handle this button event anymore
return;