-rw-r--r-- | agg-plot/agg_platform_support_win32.cpp | 12 | ||||
-rw-r--r-- | agg-plot/canvas-window-cpp.h | 11 | ||||
-rw-r--r-- | agg-plot/canvas-window.cpp | 11 | ||||
-rw-r--r-- | agg-plot/canvas-window.h | 4 | ||||
-rw-r--r-- | gsl-shell.c | 3 | ||||
-rw-r--r-- | window-refs.c | 19 | ||||
-rw-r--r-- | window-refs.h | 1 |
diff --git a/agg-plot/agg_platform_support_win32.cpp b/agg-plot/agg_platform_support_win32.cpp index 3a8f52a9..e5234b01 100644 --- a/agg-plot/agg_platform_support_win32.cpp +++ b/agg-plot/agg_platform_support_win32.cpp @@ -58,6 +58,8 @@ namespace agg unsigned translate(unsigned keycode); + void close(); + pix_format_e m_format; pix_format_e m_sys_format; bool m_flip_y; @@ -231,6 +233,11 @@ namespace agg pthread_mutex_destroy (m_mutex); } + void platform_specific::close() + { + ::SendMessage(m_hwnd, WM_CLOSE, 0, 0); + } + //------------------------------------------------------------------------ void platform_specific::create_pmap(unsigned width, @@ -1218,3 +1225,8 @@ bool platform_support_is_mapped(agg::platform_support *app) { return app->m_specific->m_is_mapped; } + +void platform_support_close_window(agg::platform_support *app) +{ + app->m_specific->close(); +} diff --git a/agg-plot/canvas-window-cpp.h b/agg-plot/canvas-window-cpp.h index df9f02e2..d350e6bd 100644 --- a/agg-plot/canvas-window-cpp.h +++ b/agg-plot/canvas-window-cpp.h @@ -11,10 +11,11 @@ #include "canvas.h" #include "utils.h" -extern void platform_support_prepare (); -extern void platform_support_lock (agg::platform_support *app); -extern void platform_support_unlock (agg::platform_support *app); -extern bool platform_support_is_mapped (agg::platform_support *app); +extern void platform_support_prepare (); +extern void platform_support_lock (agg::platform_support *app); +extern void platform_support_unlock (agg::platform_support *app); +extern bool platform_support_is_mapped (agg::platform_support *app); +extern void platform_support_close_window (agg::platform_support *app); class canvas_window : public agg::platform_support { protected: @@ -57,6 +58,8 @@ public: void lock() { platform_support_lock(this); }; void unlock() { platform_support_unlock(this); }; + void close() { platform_support_close_window(this); }; + void start_new_thread (lua_State *L); bool draw(drawable *obj, agg::rgba8 *color, bool as_line) diff --git a/agg-plot/canvas-window.cpp b/agg-plot/canvas-window.cpp index 927a69e7..73cfb81b 100644 --- a/agg-plot/canvas-window.cpp +++ b/agg-plot/canvas-window.cpp @@ -69,6 +69,7 @@ static const struct luaL_Reg canvas_window_methods_protected[] = { {"clear", canvas_window_clear}, {"refresh", canvas_window_refresh}, {"setview", canvas_window_set_box_trans}, + {"close", canvas_window_close}, {NULL, NULL} }; @@ -144,9 +145,11 @@ canvas_thread_function (void *_win) { win->status = canvas_window::running; win->run(); + printf("window id %d terminate.\n", win->id); win->status = canvas_window::closed; GSL_SHELL_LOCK(); + printf("request reference remove window id %d\n", win->id); gsl_shell_unref_plot (win->id); GSL_SHELL_UNLOCK(); } @@ -239,6 +242,14 @@ canvas_window_refresh (lua_State *L) } int +canvas_window_close (lua_State *L) +{ + canvas_window *win = canvas_window::check (L, 1); + win->close(); + return 0; +} + +int canvas_window_index_protected (lua_State *L) { canvas_window *win = canvas_window::check(L, lua_upvalueindex(2)); diff --git a/agg-plot/canvas-window.h b/agg-plot/canvas-window.h index a3b7230a..ef71a002 100644 --- a/agg-plot/canvas-window.h +++ b/agg-plot/canvas-window.h @@ -8,8 +8,8 @@ __BEGIN_DECLS #include "lua.h" extern void canvas_window_register (lua_State *L); - -extern int canvas_window_index (lua_State *L); +extern int canvas_window_index (lua_State *L); +extern int canvas_window_close (lua_State *L); __END_DECLS diff --git a/gsl-shell.c b/gsl-shell.c index 5d17be9e..77c5260b 100644 --- a/gsl-shell.c +++ b/gsl-shell.c @@ -62,6 +62,7 @@ #include "gsl-shell.h" #include "lua-gsl.h" #include "lua-utils.h" +#include "window-refs.h" #define report error_report @@ -380,6 +381,8 @@ static void dotty (lua_State *L) { do_windows_unref (L); } + window_ref_close_all (L); + do_windows_unref (L); lua_settop(L, 0); /* clear stack */ diff --git a/window-refs.c b/window-refs.c index 4cbfa1d3..0d1c40cb 100644 --- a/window-refs.c +++ b/window-refs.c @@ -3,6 +3,7 @@ #include <lauxlib.h> #include "window-refs.h" +#include "canvas-window.h" static char const * const window_ref_table_name = "GSL.windows"; @@ -30,10 +31,26 @@ window_ref_add(lua_State *L, int index) } void -window_ref_remove(lua_State *L, int id) +window_ref_remove (lua_State *L, int id) { lua_getfield (L, LUA_REGISTRYINDEX, window_ref_table_name); lua_pushnil (L); lua_rawseti (L, -2, id); lua_pop (L, 1); } + +void +window_ref_close_all (lua_State *L) +{ + lua_getfield (L, LUA_REGISTRYINDEX, window_ref_table_name); + + lua_pushnil (L); /* first key */ + while (lua_next(L, -2) != 0) + { + lua_pushcfunction (L, canvas_window_close); + lua_insert (L, -2); + lua_call (L, 1, 0); + } + + lua_pop (L, 1); +} diff --git a/window-refs.h b/window-refs.h index 5a689c8d..2470f1f1 100644 --- a/window-refs.h +++ b/window-refs.h @@ -10,6 +10,7 @@ __BEGIN_DECLS extern void window_ref_prepare (lua_State *L); extern size_t window_ref_add (lua_State *L, int index); extern void window_ref_remove (lua_State *L, int id); +extern void window_ref_close_all (lua_State *L); __END_DECLS |