gsl-shell.git - gsl-shell

index : gsl-shell.git
gsl-shell
summary refs log tree commit diff
path: root/agg-plot
diff options
context:
space:
mode:
authorfrancesco-ST <francesco.abbate@st.com>2011年02月02日 18:13:11 +0100
committerfrancesco-ST <francesco.abbate@st.com>2011年02月02日 18:13:11 +0100
commit87feed1b8c36fd42a3750d01382a4978971416cc (patch)
tree90f68f0d96a64b3f8ea14fb59655c8154808a24f /agg-plot
parent00cb071098589dc5824509d7e7786fde16a00ff2 (diff)
downloadgsl-shell-87feed1b8c36fd42a3750d01382a4978971416cc.tar.gz
Added a centralized method to manage Lua compatibility build options.
The build is controlled by the variable LUA_COMPATIBLE in makeconfig. The possible values are 'no', 'yes' and 'strict'.
Diffstat (limited to 'agg-plot')
-rw-r--r--agg-plot/window-cpp.h 18
-rw-r--r--agg-plot/window.cpp 15
2 files changed, 30 insertions, 3 deletions
diff --git a/agg-plot/window-cpp.h b/agg-plot/window-cpp.h
index d0239d9a..400e9b99 100644
--- a/agg-plot/window-cpp.h
+++ b/agg-plot/window-cpp.h
@@ -89,3 +89,21 @@ public:
virtual void on_draw();
virtual void on_resize(int sx, int sy);
};
+
+#ifdef WINDOW_LIVE_CHECK
+class window_boxed : public window {
+ bool m_is_alive;
+
+public:
+ window_boxed(agg::rgba& bgcol) : window(bgcol), m_is_alive(true) {};
+ ~window_boxed() { m_is_alive = false; }
+
+ bool is_alive() const { return m_is_alive; };
+};
+#else
+class window_boxed : public window {
+public:
+ window_boxed(agg::rgba& bgcol) : window(bgcol) {};
+ bool is_alive() const { return true; };
+};
+#endif
diff --git a/agg-plot/window.cpp b/agg-plot/window.cpp
index f7cb9ed2..398efbdc 100644
--- a/agg-plot/window.cpp
+++ b/agg-plot/window.cpp
@@ -371,9 +371,15 @@ typedef void (window::*window_slot_method_type)(int slot_id);
int window_generic_oper (lua_State *L, window_slot_method_type method)
{
- window *win = object_check<window>(L, 1, GS_WINDOW);
+ window_boxed *win = object_check<window_boxed>(L, 1, GS_WINDOW);
int slot_id = luaL_checkinteger (L, 2);
+ // we check to be sure that the window was not garbage collected
+ // by Lua. In this case the destructor was called but the momory
+ // itself is not disposed. Since the is_alive method is non-virtual
+ // that shoud be always fine.
+ if (! win->is_alive()) return 0;
+
win->lock();
if (win->status == canvas_window::running)
{
@@ -389,9 +395,12 @@ int window_generic_oper_ext (lua_State *L,
void (window::*method)(int, param_type),
param_type param)
{
- window *win = object_check<window>(L, 1, GS_WINDOW);
+ window_boxed *win = object_check<window_boxed>(L, 1, GS_WINDOW);
int slot_id = luaL_checkinteger (L, 2);
+ // see comment is the function window_generic_oper
+ if (! win->is_alive()) return 0;
+
win->lock();
if (win->status == canvas_window::running)
{
@@ -431,7 +440,7 @@ void window::start (lua_State *L, gslshell::ret_status& st)
int
window_new (lua_State *L)
{
- window *win = push_new_object<window>(L, GS_WINDOW, colors::white);
+ window_boxed *win = push_new_object<window_boxed>(L, GS_WINDOW, colors::white);
const char *spec = lua_tostring (L, 1);
gslshell::ret_status st;
generated by cgit v1.2.3 (git 2.25.1) at 2025年09月18日 15:39:32 +0000

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