home · contact · privacy
Improved windows cleaning up: free win_meta, ncurses windows/pads.
authorChristian Heller <c.heller@plomlompom.de>
Sat, 31 Aug 2013 01:34:13 +0000 (03:34 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Sat, 31 Aug 2013 01:34:13 +0000 (03:34 +0200)
src/main.c
src/rexit.c
src/rexit.h
src/windows.c
src/windows.h

index 786e72e51f173349e90740e027515d1067430bf4..d63f587c23955913c843c6cd2760ef2472883b71 100644 (file)
@@ -203,11 +203,10 @@ int main(int argc, char *argv[])
     raw();
     init_keybindings(&world);
     set_cleanup_flag(CLEANUP_KEYBINDINGS);
-    struct WinMeta win_meta;
     char * err_winmem = "Trouble with init_win_meta() or draw_all_wins() in "
                         "main().";
-    exit_err(init_win_meta(screen, &win_meta), &world, err_winmem);
-    world.wins.meta = &win_meta;
+    exit_err(init_win_meta(screen, &world.wins.meta), &world, err_winmem);
+    set_cleanup_flag(CLEANUP_WIN_META);
     world.wins.keys = init_win_from_file(&world, "Keys", draw_keys_win);
     set_cleanup_flag(CLEANUP_WIN_KEYS);
     world.wins.info = init_win_from_file(&world, "Info", draw_info_win);
@@ -238,7 +237,7 @@ int main(int argc, char *argv[])
         }
         while (1)
         {
-            draw_all_wins(&win_meta);
+            draw_all_wins(world.wins.meta);
             key = getch();
             if (   EOF != action
                 && key == get_action_key(world.keybindings, "wait"))
@@ -264,7 +263,7 @@ int main(int argc, char *argv[])
         while (1)
         {
             save_game(&world);
-            draw_all_wins(&win_meta);
+            draw_all_wins(world.wins.meta);
             key = getch();
             if (0 != player.hitpoints && 0 == player_control(key, &world))
             {
index 2907705af45948398966b77b2cf141bea3ef676c..8b32d4ad760aa3dacb1308c7b9f0938ff553ee38 100644 (file)
@@ -65,6 +65,11 @@ static void cleanup(struct World * world)
     {
         free_win(world->wins.keys);
     }
+    if (cleanup_flags & CLEANUP_WIN_META)
+    {
+        delwin(world->wins.meta->padframe.curses_win);
+        free(world->wins.meta);
+    }
     if (cleanup_flags & CLEANUP_MAP_OBJECT_DEFS)
     {
         free_item_defs(world->item_def);
index f376e5ead2b063ada2a8cbcddc22622b6f510d58..a6b48f9244e3e9cb8e9921761c63fd4d168ee4dc 100644 (file)
@@ -31,7 +31,8 @@ enum cleanup_flag
     CLEANUP_WIN_INFO        = 0x0080,
     CLEANUP_WIN_LOG         = 0x0100,
     CLEANUP_WIN_MAP         = 0x0200,
-    CLEANUP_WIN_KEYS        = 0x0400
+    CLEANUP_WIN_KEYS        = 0x0400,
+    CLEANUP_WIN_META        = 0x0800
 };
 extern void set_cleanup_flag(enum cleanup_flag flag);
 
index f75544bd4753fa06d64f46382499a8b92f7fbfec..df67411da45ef6d7010b0dadea3e38c5a5f3b362 100644 (file)
@@ -362,8 +362,9 @@ static void shift_win_backward(struct WinMeta * wmeta)
 
 
 
-extern uint8_t init_win_meta(WINDOW * screen, struct WinMeta * wmeta)
+extern uint8_t init_win_meta(WINDOW * screen, struct WinMeta ** wmp)
 {
+    struct WinMeta * wmeta = malloc(sizeof(struct WinMeta));
     wmeta->_screen             = screen;
     uint32_t maxy_test         = getmaxy(screen);
     uint32_t maxx_test         = getmaxx(screen);
@@ -383,6 +384,7 @@ extern uint8_t init_win_meta(WINDOW * screen, struct WinMeta * wmeta)
     }
     wmeta->padframe.curses_win = pad_test;
     wmeta->active              = 0;
+    *wmp = wmeta;
     return 0;
 }
 
@@ -440,6 +442,10 @@ extern uint8_t init_win(struct WinMeta * wmeta, struct Win ** wp, char * title,
 
 extern void free_win(struct Win * win)
 {
+    if (0 != win->frame.curses_win)
+    {
+        delwin(win->frame.curses_win);
+    }
     free(win->_title);
     free(win);
 }
index a40835d9c591925b3d080b8747495c9b21a5c3ed..aedb30b12e44030d8e8b949ad9ac56521e13e6d1 100644 (file)
@@ -95,7 +95,7 @@ struct WinMeta
  * initialized 0, except for the virtual screen (height = that of the terminal
  * screen; width = 1) amd its frame sized to the size of the terminal screen.
  */
-extern uint8_t init_win_meta(WINDOW * screen, struct WinMeta * wmeta);
+extern uint8_t init_win_meta(WINDOW * screen, struct WinMeta ** wmeta);