Commit 1ed6ea18 authored by Claes Sjofors's avatar Claes Sjofors

Glow and flow widgets destructor fix

parent 4d3f271d
...@@ -351,12 +351,11 @@ static void browwidgetgtk_destroy( GtkObject *object) ...@@ -351,12 +351,11 @@ static void browwidgetgtk_destroy( GtkObject *object)
BrowWidgetGtk *brow = (BrowWidgetGtk *)object; BrowWidgetGtk *brow = (BrowWidgetGtk *)object;
if ( !brow->destroyed) { if ( !brow->destroyed) {
brow->destroyed = 1;
if ( brow->scroll_timerid) if ( brow->scroll_timerid)
g_source_remove( brow->scroll_timerid); g_source_remove( brow->scroll_timerid);
if ( !brow->is_navigator) if ( !brow->is_navigator)
delete (FlowDrawGtk *)brow->draw_ctx; delete (FlowDrawGtk *)brow->draw_ctx;
brow->destroyed = 1;
} }
GTK_OBJECT_CLASS( browwidgetgtk_parent_class)->destroy( object); GTK_OBJECT_CLASS( browwidgetgtk_parent_class)->destroy( object);
......
...@@ -312,10 +312,15 @@ static GdkColor flow_allocate_color( FlowDrawGtk *draw_ctx, const char *named_co ...@@ -312,10 +312,15 @@ static GdkColor flow_allocate_color( FlowDrawGtk *draw_ctx, const char *named_co
FlowDrawGtk::~FlowDrawGtk() FlowDrawGtk::~FlowDrawGtk()
{ {
closing_down = 1;
basectx->set_nodraw(); basectx->set_nodraw();
delete basectx; delete basectx;
draw_free_gc( this); draw_free_gc( this);
gdk_colormap_free_colors( colormap, color_vect, color_vect_cnt); gdk_colormap_free_colors( colormap, color_vect, color_vect_cnt);
if ( timer_id)
g_source_remove( timer_id);
} }
int FlowDrawGtk::create_secondary_ctx( int FlowDrawGtk::create_secondary_ctx(
...@@ -387,7 +392,8 @@ FlowDrawGtk::FlowDrawGtk( ...@@ -387,7 +392,8 @@ FlowDrawGtk::FlowDrawGtk(
flow_eCtxType type) : flow_eCtxType type) :
toplevel(x_toplevel), nav_shell(0), toplevel(x_toplevel), nav_shell(0),
nav_toplevel(0), display(0), nav_toplevel(0), display(0),
window(0), nav_window(0), screen(0), timer_id(0), color_vect_cnt(0) window(0), nav_window(0), screen(0), timer_id(0), color_vect_cnt(0),
closing_down(0)
{ {
memset( gcs, 0, sizeof(gcs)); memset( gcs, 0, sizeof(gcs));
...@@ -449,6 +455,9 @@ int FlowDrawGtk::event_handler( FlowCtx *ctx, GdkEvent event) ...@@ -449,6 +455,9 @@ int FlowDrawGtk::event_handler( FlowCtx *ctx, GdkEvent event)
static int last_press_y = 0; static int last_press_y = 0;
int sts = 1; int sts = 1;
if ( closing_down)
return 1;
if ( event.any.window == window || event.type == GDK_KEY_PRESS) { if ( event.any.window == window || event.type == GDK_KEY_PRESS) {
switch ( event.type) { switch ( event.type) {
case GDK_KEY_PRESS : { case GDK_KEY_PRESS : {
......
...@@ -50,6 +50,7 @@ class FlowDrawGtk : public FlowDraw { ...@@ -50,6 +50,7 @@ class FlowDrawGtk : public FlowDraw {
guint timer_id; guint timer_id;
GdkColor color_vect[20]; GdkColor color_vect[20];
int color_vect_cnt; int color_vect_cnt;
int closing_down;
FlowDrawGtk( GtkWidget *toplevel, FlowDrawGtk( GtkWidget *toplevel,
void **flow_ctx, void **flow_ctx,
......
...@@ -344,12 +344,11 @@ static void flowwidgetgtk_destroy( GtkObject *object) ...@@ -344,12 +344,11 @@ static void flowwidgetgtk_destroy( GtkObject *object)
FlowWidgetGtk *flow = (FlowWidgetGtk *)object; FlowWidgetGtk *flow = (FlowWidgetGtk *)object;
if ( !flow->destroyed) { if ( !flow->destroyed) {
flow->destroyed = 1;
if ( flow->scroll_timerid) if ( flow->scroll_timerid)
g_source_remove( flow->scroll_timerid); g_source_remove( flow->scroll_timerid);
if ( !flow->is_navigator) if ( !flow->is_navigator)
delete (FlowDrawGtk *)flow->draw_ctx; delete (FlowDrawGtk *)flow->draw_ctx;
flow->destroyed = 1;
} }
GTK_OBJECT_CLASS( flowwidgetgtk_parent_class)->destroy( object); GTK_OBJECT_CLASS( flowwidgetgtk_parent_class)->destroy( object);
} }
......
...@@ -68,6 +68,7 @@ struct _CurveWidgetGtk { ...@@ -68,6 +68,7 @@ struct _CurveWidgetGtk {
gint scroll_timerid; gint scroll_timerid;
glow_sScroll scroll_data; glow_sScroll scroll_data;
int scroll_configure; int scroll_configure;
int destroyed;
}; };
struct _CurveWidgetGtkClass { struct _CurveWidgetGtkClass {
...@@ -261,8 +262,27 @@ static void curvewidgetgtk_grab_focus( GtkWidget *glow) ...@@ -261,8 +262,27 @@ static void curvewidgetgtk_grab_focus( GtkWidget *glow)
gdk_window_focus( glow->window, GDK_CURRENT_TIME); gdk_window_focus( glow->window, GDK_CURRENT_TIME);
} }
static void curvewidgetgtk_destroy( GtkObject *object)
{
CurveWidgetGtk *curvew = (CurveWidgetGtk *)object;
if ( !curvew->destroyed) {
curvew->destroyed = 1;
if ( curvew->scroll_timerid)
g_source_remove( curvew->scroll_timerid);
if ( curvew->is_navigator && curvew->curve_ctx)
((CurveCtx *)curvew->curve_ctx)->no_nav = 1;
else
delete (GlowDrawGtk *)curvew->draw_ctx;
}
GTK_OBJECT_CLASS( curvewidgetgtk_parent_class)->destroy( object);
}
static gboolean curvewidgetgtk_event( GtkWidget *glow, GdkEvent *event) static gboolean curvewidgetgtk_event( GtkWidget *glow, GdkEvent *event)
{ {
if ( ((CurveWidgetGtk *)glow)->destroyed)
return TRUE;
if ( !((CurveWidgetGtk *)glow)->curve_ctx) if ( !((CurveWidgetGtk *)glow)->curve_ctx)
// Navigator not yet created // Navigator not yet created
return TRUE; return TRUE;
...@@ -360,11 +380,15 @@ static void curvewidgetgtk_realize( GtkWidget *widget) ...@@ -360,11 +380,15 @@ static void curvewidgetgtk_realize( GtkWidget *widget)
static void curvewidgetgtk_class_init( CurveWidgetGtkClass *klass) static void curvewidgetgtk_class_init( CurveWidgetGtkClass *klass)
{ {
GtkWidgetClass *widget_class; GtkWidgetClass *widget_class;
GtkObjectClass *object_class;
widget_class = GTK_WIDGET_CLASS( klass); widget_class = GTK_WIDGET_CLASS( klass);
object_class = GTK_OBJECT_CLASS( klass);
widget_class->realize = curvewidgetgtk_realize; widget_class->realize = curvewidgetgtk_realize;
widget_class->expose_event = curvewidgetgtk_expose; widget_class->expose_event = curvewidgetgtk_expose;
widget_class->event = curvewidgetgtk_event; widget_class->event = curvewidgetgtk_event;
widget_class->grab_focus = curvewidgetgtk_grab_focus; widget_class->grab_focus = curvewidgetgtk_grab_focus;
object_class->destroy = curvewidgetgtk_destroy;
} }
static void curvewidgetgtk_init( CurveWidgetGtk *glow) static void curvewidgetgtk_init( CurveWidgetGtk *glow)
......
...@@ -484,7 +484,7 @@ static GdkColor glow_allocate_color( GlowDrawGtk *draw_ctx, int rgb_red, ...@@ -484,7 +484,7 @@ static GdkColor glow_allocate_color( GlowDrawGtk *draw_ctx, int rgb_red,
GlowDrawGtk::~GlowDrawGtk() GlowDrawGtk::~GlowDrawGtk()
{ {
cancel_event_timer( ctx); closing_down = 1;
ctx->set_nodraw(); ctx->set_nodraw();
if ( ctx->type() == glow_eCtxType_Grow) if ( ctx->type() == glow_eCtxType_Grow)
...@@ -504,6 +504,9 @@ GlowDrawGtk::~GlowDrawGtk() ...@@ -504,6 +504,9 @@ GlowDrawGtk::~GlowDrawGtk()
g_object_unref( nav_wind.buffer); g_object_unref( nav_wind.buffer);
if ( nav_wind.background_pixmap) if ( nav_wind.background_pixmap)
g_object_unref( nav_wind.background_pixmap); g_object_unref( nav_wind.background_pixmap);
if ( timer_id)
g_source_remove( timer_id);
} }
int GlowDrawGtk::init_nav( GtkWidget *nav_widget) int GlowDrawGtk::init_nav( GtkWidget *nav_widget)
...@@ -524,7 +527,7 @@ GlowDrawGtk::GlowDrawGtk( ...@@ -524,7 +527,7 @@ GlowDrawGtk::GlowDrawGtk(
int (*init_proc)(GtkWidget *w, GlowCtx *ctx, void *client_data), int (*init_proc)(GtkWidget *w, GlowCtx *ctx, void *client_data),
void *client_data, void *client_data,
glow_eCtxType type) glow_eCtxType type)
: ef(0), timer_id(0), click_sensitivity(0), color_vect_cnt(0) : ef(0), timer_id(0), click_sensitivity(0), color_vect_cnt(0), closing_down(0)
{ {
memset( gcs, 0, sizeof(gcs)); memset( gcs, 0, sizeof(gcs));
memset( font, 0, sizeof(font)); memset( font, 0, sizeof(font));
...@@ -580,6 +583,9 @@ int GlowDrawGtk::event_handler( GdkEvent event) ...@@ -580,6 +583,9 @@ int GlowDrawGtk::event_handler( GdkEvent event)
static int last_press_y = 0; static int last_press_y = 0;
int sts = 1; int sts = 1;
if ( closing_down)
return 1;
// cout << "Event : button_pressed " << button_pressed << " clicked " << // cout << "Event : button_pressed " << button_pressed << " clicked " <<
// button_clicked << " c&p " << button_clicked_and_pressed << endl; // button_clicked << " c&p " << button_clicked_and_pressed << endl;
......
...@@ -69,7 +69,6 @@ class GlowDrawGtk : public GlowDraw { ...@@ -69,7 +69,6 @@ class GlowDrawGtk : public GlowDraw {
GdkGC *gc_erase; GdkGC *gc_erase;
GdkGC *gc_inverse; GdkGC *gc_inverse;
GdkGC *gcs[glow_eDrawType__][DRAW_TYPE_SIZE]; GdkGC *gcs[glow_eDrawType__][DRAW_TYPE_SIZE];
// XFontStruct *font_struct[glow_eDrawFont__][DRAW_FONT_SIZE];
GdkFont *font[glow_eFont__][glow_eDrawFont__][DRAW_FONT_SIZE]; GdkFont *font[glow_eFont__][glow_eDrawFont__][DRAW_FONT_SIZE];
GdkCursor *cursors[glow_eDrawCursor__]; GdkCursor *cursors[glow_eDrawCursor__];
int ef; int ef;
...@@ -80,6 +79,7 @@ class GlowDrawGtk : public GlowDraw { ...@@ -80,6 +79,7 @@ class GlowDrawGtk : public GlowDraw {
int click_sensitivity; int click_sensitivity;
GdkColor color_vect[320]; GdkColor color_vect[320];
int color_vect_cnt; int color_vect_cnt;
int closing_down;
int event_handler( GdkEvent event); int event_handler( GdkEvent event);
virtual void enable_event( glow_eEvent event, virtual void enable_event( glow_eEvent event,
......
...@@ -271,13 +271,13 @@ static void growwidgetgtk_destroy( GtkObject *object) ...@@ -271,13 +271,13 @@ static void growwidgetgtk_destroy( GtkObject *object)
GrowWidgetGtk *grow = (GrowWidgetGtk *)object; GrowWidgetGtk *grow = (GrowWidgetGtk *)object;
if ( !grow->destroyed) { if ( !grow->destroyed) {
grow->destroyed = 1;
if ( grow->scroll_timerid) if ( grow->scroll_timerid)
g_source_remove( grow->scroll_timerid); g_source_remove( grow->scroll_timerid);
if ( grow->is_navigator && grow->grow_ctx) if ( grow->is_navigator && grow->grow_ctx)
((GrowCtx *)grow->grow_ctx)->no_nav = 1; ((GrowCtx *)grow->grow_ctx)->no_nav = 1;
else else
delete (GlowDrawGtk *)grow->draw_ctx; delete (GlowDrawGtk *)grow->draw_ctx;
grow->destroyed = 1;
} }
GTK_OBJECT_CLASS( growwidgetgtk_parent_class)->destroy( object); GTK_OBJECT_CLASS( growwidgetgtk_parent_class)->destroy( object);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment