X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fevents.c;h=bc6e2eb083604889ca75802a0ab1c139df8bd418;hp=8c8ae5a910f25ee6fb41a11d0661dad4bd062e0a;hb=7270af24b41bc33fbb89a97227a7696e343eacbb;hpb=363a87ea9e17020bfb820f9f19a9c68a07fec120 diff --git a/src/events.c b/src/events.c index 8c8ae5a9..bc6e2eb0 100644 --- a/src/events.c +++ b/src/events.c @@ -268,8 +268,11 @@ void HandleOtherEvents(Event *event) HandleJoystickEvent(event); break; - case SDL_SYSWMEVENT: - HandleWindowManagerEvent(event); + case SDL_DROPBEGIN: + case SDL_DROPCOMPLETE: + case SDL_DROPFILE: + case SDL_DROPTEXT: + HandleDropEvent(event); break; default: @@ -1522,9 +1525,123 @@ void HandleClientMessageEvent(ClientMessageEvent *event) CloseAllAndExit(0); } -void HandleWindowManagerEvent(Event *event) +static boolean HandleDropFileEvent(char *filename) { - SDLHandleWindowManagerEvent(event); + Error(ERR_DEBUG, "DROP FILE EVENT: '%s'", filename); + + // check and extract dropped zip files into correct user data directory + if (!strSuffixLower(filename, ".zip")) + { + Error(ERR_WARN, "file '%s' not supported", filename); + + return FALSE; + } + + TreeInfo *tree_node = NULL; + int tree_type = GetZipFileTreeType(filename); + char *directory = TREE_USERDIR(tree_type); + + if (directory == NULL) + { + Error(ERR_WARN, "zip file '%s' has invalid content!", filename); + + return FALSE; + } + + if (tree_type == TREE_TYPE_LEVEL_DIR && + game_status == GAME_MODE_LEVELS && + leveldir_current->node_parent != NULL) + { + // extract new level set next to currently selected level set + tree_node = leveldir_current; + + // get parent directory of currently selected level set directory + directory = getLevelDirFromTreeInfo(leveldir_current->node_parent); + + // use private level directory instead of top-level package level directory + if (strPrefix(directory, options.level_directory) && + strEqual(leveldir_current->node_parent->fullpath, ".")) + directory = getUserLevelDir(NULL); + } + + // extract level or artwork set from zip file to target directory + char *top_dir = ExtractZipFileIntoDirectory(filename, directory, tree_type); + + if (top_dir == NULL) + { + // error message already issued by "ExtractZipFileIntoDirectory()" + + return FALSE; + } + + // add extracted level or artwork set to tree info structure + AddTreeSetToTreeInfo(tree_node, directory, top_dir, tree_type); + + // update menu screen (and possibly change current level set) + DrawScreenAfterAddingSet(top_dir, tree_type); + + return TRUE; +} + +static void HandleDropTextEvent(char *text) +{ + Error(ERR_DEBUG, "DROP TEXT EVENT: '%s'", text); +} + +void HandleDropEvent(Event *event) +{ + static int files_succeeded = 0; + static int files_failed = 0; + + switch (event->type) + { + case SDL_DROPBEGIN: + { + files_succeeded = 0; + files_failed = 0; + + break; + } + + case SDL_DROPFILE: + { + boolean success = HandleDropFileEvent(event->drop.file); + + if (success) + files_succeeded++; + else + files_failed++; + + break; + } + + case SDL_DROPTEXT: + { + HandleDropTextEvent(event->drop.file); + + 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); + } + + break; + } + } + + if (event->drop.file != NULL) + SDL_free(event->drop.file); } void HandleButton(int mx, int my, int button, int button_nr) @@ -1849,9 +1966,9 @@ boolean HandleKeysDebug(Key key, int key_status) return TRUE; } } +#endif return FALSE; -#endif } void HandleKey(Key key, int key_status) @@ -2360,6 +2477,16 @@ void HandleJoystick(void) return; } + if (newbutton && (game_status == GAME_MODE_PSEUDO_TYPENAME || + anyTextGadgetActive())) + { + // leave name input in main menu or text input gadget + HandleKey(KSYM_Escape, KEY_PRESSED); + HandleKey(KSYM_Escape, KEY_RELEASED); + + return; + } + if (level.game_engine_type == GAME_ENGINE_TYPE_MM) { if (game_status == GAME_MODE_PLAYING)