gsl-shell.git - gsl-shell

index : gsl-shell.git
gsl-shell
summary refs log tree commit diff
diff options
context:
space:
mode:
Diffstat
-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
7 files changed, 54 insertions, 7 deletions
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
generated by cgit v1.2.3 (git 2.25.1) at 2025年09月17日 18:08:20 +0000

AltStyle によって変換されたページ (->オリジナル) /