From 0f82e95afe041ab04dc0563f2fd0f482a8331734 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Wed, 10 May 2006 14:54:59 +0000 Subject: [PATCH] fix segv's for display config dialog SVN revision: 22518 --- src/bin/e_border.h | 4 ++-- src/bin/e_container.c | 44 +++++++++++++++++++++++++++------- src/bin/e_int_config_display.c | 6 ++++- 3 files changed, 42 insertions(+), 12 deletions(-) diff --git a/src/bin/e_border.h b/src/bin/e_border.h index efb974a9d..38f023b39 100644 --- a/src/bin/e_border.h +++ b/src/bin/e_border.h @@ -380,8 +380,8 @@ struct _E_Border } changes; struct { - unsigned char start : 1; - int x, y; + unsigned char start : 1; + int x, y; } drag; unsigned int layer; diff --git a/src/bin/e_container.c b/src/bin/e_container.c index 4f9c9257a..cedfb0c73 100644 --- a/src/bin/e_container.c +++ b/src/bin/e_container.c @@ -1198,15 +1198,41 @@ _e_container_resize_handle(E_Container *con) bd = l->data; - if (bd->w > bd->zone->w) - e_border_resize(bd, bd->zone->w, bd->h); - if ((bd->x + bd->w) > (bd->zone->x + bd->zone->w)) - e_border_move(bd, bd->zone->x + bd->zone->w - bd->w, bd->y); - - if (bd->h > bd->zone->h) - e_border_resize(bd, bd->w, bd->zone->h); - if ((bd->y + bd->h) > (bd->zone->y + bd->zone->h)) - e_border_move(bd, bd->x, bd->zone->y + bd->zone->h - bd->h); + if (bd->saved.w > bd->zone->w) + bd->saved.w = bd->zone->w; + if ((bd->saved.x + bd->saved.w) > (bd->zone->x + bd->zone->w)) + bd->saved.x = bd->zone->x + bd->zone->w - bd->saved.w; + + if (bd->saved.h > bd->zone->h) + bd->saved.h = bd->zone->h; + if ((bd->saved.y + bd->saved.h) > (bd->zone->y + bd->zone->h)) + bd->saved.y = bd->zone->y + bd->zone->h - bd->saved.h; + + if (bd->fullscreen) + { + e_border_unfullscreen(bd); + e_border_fullscreen(bd, e_config->fullscreen_policy); + } + else if (bd->maximized != E_MAXIMIZE_NONE) + { + E_Maximize max; + + max = bd->maximized; + e_border_unmaximize(bd); + e_border_maximize(bd, max); + } + else + { + if (bd->w > bd->zone->w) + e_border_resize(bd, bd->zone->w, bd->h); + if ((bd->x + bd->w) > (bd->zone->x + bd->zone->w)) + e_border_move(bd, bd->zone->x + bd->zone->w - bd->w, bd->y); + + if (bd->h > bd->zone->h) + e_border_resize(bd, bd->w, bd->zone->h); + if ((bd->y + bd->h) > (bd->zone->y + bd->zone->h)) + e_border_move(bd, bd->x, bd->zone->y + bd->zone->h - bd->h); + } } } #endif diff --git a/src/bin/e_int_config_display.c b/src/bin/e_int_config_display.c index c680c6651..08b4f4867 100644 --- a/src/bin/e_int_config_display.c +++ b/src/bin/e_int_config_display.c @@ -53,14 +53,17 @@ _surebox_dialog_cb_delete(E_Win *win) { E_Dialog *dia; SureBox *sb; + E_Config_Dialog *cfd; dia = win->data; sb = dia->data; sb->cfdata->surebox = NULL; + cfd = sb->cfdata->cfd; if (sb->timer) ecore_timer_del(sb->timer); sb->timer = NULL; free(sb); e_object_del(E_OBJECT(dia)); + e_object_unref(E_OBJECT(cfd)); } static void @@ -165,6 +168,7 @@ _surebox_new(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) e_win_centered_set(sb->dia->win, 1); e_win_sticky_set(sb->dia->win, 1); e_dialog_show(sb->dia); + e_object_ref(E_OBJECT(cfd)); } @@ -211,7 +215,7 @@ static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) { if (cfdata->surebox) - e_object_del(E_OBJECT(cfdata->surebox->dia)); + _surebox_dialog_cb_delete(cfdata->surebox->dia->win); free(cfdata); }