fixed potential crash bug if personal user level set cannot be found
[rocksndiamonds.git] / src / editor.c
index 8175781421f3343dedb2b4023e599eb7ef5f943f..33f0d5b45388a07df884ebc7e2f419a05b680eb3 100644 (file)
@@ -7715,6 +7715,17 @@ static boolean PrepareSavingIntoPersonalLevelSet(void)
   leveldir_current =
     getTreeInfoFromIdentifier(leveldir_first, getLoginName());
 
+  // this may happen if "setup.internal.create_user_levelset" is FALSE
+  // or if file "levelinfo.conf" is missing in personal user level set
+  if (leveldir_current == NULL)
+  {
+    Request("Cannot find personal level set?!", REQ_CONFIRM);
+
+    leveldir_current = leveldir_former;
+
+    return FALSE;
+  }
+
   // find unused level number
   for (new_level_nr = leveldir_current->first_level; ; new_level_nr++)
   {
@@ -8325,6 +8336,9 @@ static void CopyCustomElementPropertiesToGame(int element)
   // copy change events also to special level editor variable
   custom_element = element_info[element];
   custom_element_change = *element_info[element].change;
+
+  // needed here to restore runtime value "element_info[element].gfx_element"
+  InitElementPropertiesGfxElement();
 }
 
 static void CopyGroupElementPropertiesToGame(int element)
@@ -8338,6 +8352,9 @@ static void CopyGroupElementPropertiesToGame(int element)
 
   element_info[element] = custom_element;
   *element_info[element].group = group_element_info;
+
+  // needed here to restore runtime value "element_info[element].gfx_element"
+  InitElementPropertiesGfxElement();
 }
 
 static void CopyClassicElementPropertiesToGame(int element)
@@ -12355,6 +12372,16 @@ void CopyBrushToClipboard_Small(void)
   CopyBrushExt(0, 0, 0, 0, 0, CB_BRUSH_TO_CLIPBOARD_SMALL);
 }
 
+void UndoLevelEditorOperation(void)
+{
+  ClickOnGadget(level_editor_gadget[GADGET_ID_UNDO], -1);
+}
+
+void RedoLevelEditorOperation(void)
+{
+  ClickOnGadget(level_editor_gadget[GADGET_ID_UNDO], 3);
+}
+
 static void FloodFill(int from_x, int from_y, int fill_element)
 {
   FloodFillLevel(from_x, from_y, fill_element, Feld, lev_fieldx, lev_fieldy);
@@ -13820,7 +13847,9 @@ static void HandleControlButtons(struct GadgetInfo *gi)
       break;
 
     case GADGET_ID_UNDO:
-      if (button == 1 && GetKeyModState() & (KMOD_Shift|KMOD_Control))
+      if (button < 0)  // keep button value (even if modifier keys are pressed)
+       button = -button;
+      else if (button == 1 && GetKeyModState() & (KMOD_Shift | KMOD_Control))
        button = 3;
 
       if (button == 1 && undo_buffer_steps == 0)