From 68f5a95f2ed7d50aa4a2b886662fce1f0a97fb97 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Thu, 16 Aug 2001 08:45:37 +0000 Subject: [PATCH] strdup wrapped... and err.. looking for a mem leak.. anyone got insure++ ? SVN revision: 5174 --- src/Makefile.am | 2 +- src/actions.c | 13 +++++++------ src/background.c | 5 +++-- src/border.c | 17 ++++++++++++----- src/config.c | 10 ---------- src/desktops.c | 2 +- src/e.h | 10 ++++++++++ src/icccm.c | 3 ++- src/util.c | 36 +++++++++++++++++++++++++++--------- src/util.h | 8 ++++++++ src/view.c | 28 ++++++++++++++++++++-------- src/view.h | 1 + 12 files changed, 92 insertions(+), 43 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index a5e8550e1..3b8d53306 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -31,5 +31,5 @@ enlightenment_SOURCES = \ view.h view.c \ e.h -enlightenment_LDADD = @evas_libs@ @edb_libs@ @ebits_libs@ @ecore_libs@ @efsd_libs@ -lm -lc $(INTLLIBS) +enlightenment_LDADD = @evas_libs@ @edb_libs@ @ebits_libs@ @ecore_libs@ @efsd_libs@ -lm -lc -ldl $(INTLLIBS) diff --git a/src/actions.c b/src/actions.c index 2a32d9843..c799c9fee 100644 --- a/src/actions.c +++ b/src/actions.c @@ -6,6 +6,7 @@ #include "icccm.h" #include "keys.h" #include "view.h" +#include "util.h" static Evas_List action_protos = NULL; static Evas_List current_actions = NULL; @@ -191,12 +192,12 @@ _e_action_find(char *action, int act, int button, char *key, Ev_Key_Modifiers mo OBJ_INIT(aa, _e_action_free); - aa->name = strdup(a->name); - aa->action = strdup(a->action); - if (a->params) aa->params = strdup(a->params); + e_strdup(aa->name, a->name); + e_strdup(aa->action, a->action); + e_strdup(aa->params, a->params); aa->event = a->event; aa->button = a->button; - if (a->key) aa->key = strdup(a->key); + e_strdup(aa->key, a->key); aa->modifiers = a->modifiers; aa->action_proto = ap; aa->object = o; @@ -396,7 +397,7 @@ e_action_add_proto(char *action, OBJ_INIT(ap, NULL); - ap->action = strdup(action); + e_strdup(ap->action, action); ap->func_start = func_start; ap->func_stop = func_stop; ap->func_go = func_go; @@ -435,7 +436,7 @@ e_action_add_timer(void *o, char *name) at = NEW(E_Active_Action_Timer, 1); at->object = o; - at->name = strdup(name); + e_strdup(at->name, name); current_timers = evas_list_append(current_timers, at); } diff --git a/src/background.c b/src/background.c index 1f37bded2..d7b4eb1b6 100644 --- a/src/background.c +++ b/src/background.c @@ -1,4 +1,5 @@ #include "background.h" +#include "util.h" void e_background_free(E_Background *bg) @@ -56,7 +57,7 @@ e_background_load(char *file) e_db_int_get(db, "/layers/count", &num); bg = e_background_new(); - bg->file = strdup(file); + e_strdup(bg->file, file); for (i = 0; i < num; i++) { E_Background_Layer *bl; @@ -71,7 +72,7 @@ e_background_load(char *file) sprintf(buf, "/layers/%i/color_class", i); bl->color_class = e_db_str_get(db, buf); if (bl->inlined) { - sprintf(buf, "%s:/layers/%i/image", file, i); bl->file = strdup(buf); + sprintf(buf, "%s:/layers/%i/image", file, i); e_strdup(bl->file, buf); } else { diff --git a/src/border.c b/src/border.c index 06c2a0c8a..5bd2b68cc 100644 --- a/src/border.c +++ b/src/border.c @@ -1039,7 +1039,7 @@ e_border_apply_border(E_Border *b) /* if it's not changed - abort and dont do anything */ if ((b->border_file) && (!strcmp(buf, b->border_file))) return; IF_FREE(b->border_file); - b->border_file = strdup(buf); + e_strdup(b->border_file, buf); e_border_set_bits(b, buf); @@ -1138,8 +1138,10 @@ e_border_adopt(Window win, int use_client_pos) { E_Border *b; int bw; + static int bd_count = 0; /* create the struct */ + printf("new bd %i\n", bd_count++); b = e_border_new(); /* set the right event on the client */ e_window_set_events(win, @@ -1368,7 +1370,7 @@ e_border_new(void) font_dir); b->win.b = evas_get_window(b->evas.b); e_add_child(b->win.main, b->win.b); - + b->obj.title.l = evas_add_text(b->evas.l, "borzoib", 8, ""); b->obj.title.r = evas_add_text(b->evas.r, "borzoib", 8, ""); b->obj.title.t = evas_add_text(b->evas.t, "borzoib", 8, ""); @@ -1417,6 +1419,7 @@ e_border_new(void) e_window_raise(b->win.t); e_window_raise(b->win.b); */ + evases = evas_list_append(evases, b->evas.l); evases = evas_list_append(evases, b->evas.r); evases = evas_list_append(evases, b->evas.t); @@ -1433,7 +1436,7 @@ e_border_new(void) e_window_show(b->win.b); e_border_attach_mouse_grabs(b); - + borders = evas_list_prepend(borders, b); return b; @@ -1462,6 +1465,11 @@ e_border_free(E_Border *b) e_window_destroy(b->win.main); borders = evas_list_remove(borders, b); + IF_FREE(b->client.title); + IF_FREE(b->client.name); + IF_FREE(b->client.class); + IF_FREE(b->border_file); + if (b->grabs) { for (l = b->grabs; l; l = l->next) @@ -1471,7 +1479,7 @@ e_border_free(E_Border *b) evas_list_free(b->grabs); } - free(b); + FREE(b); } void @@ -1663,7 +1671,6 @@ e_border_set_bits(E_Border *b, char *file) b->bits.r = ebits_load(file); b->bits.t = ebits_load(file); b->bits.b = ebits_load(file); - b->bits.new = 1; b->changed = 1; diff --git a/src/config.c b/src/config.c index 0e35b3a6c..ff0ec66b7 100644 --- a/src/config.c +++ b/src/config.c @@ -98,16 +98,6 @@ e_config_init(void) if (!e_file_exists(buf)) e_file_cp(PACKAGE_DATA_DIR"/data/config/behavior/default/apps_menu.db", buf); sprintf(buf, "%sappearance/borders/border.bits.db", e_config_user_dir()); - /* do it for data... ut not all of it for now.. i'm considering if */ - /* this is a godo idea. config data - YES. but raw theme data? */ - if (!e_file_exists(buf)) - e_file_cp(PACKAGE_DATA_DIR"/data/config/appearance/default/borders/border.bits.db", buf); - sprintf(buf, "%sappearance/borders/border2.bits.db", e_config_user_dir()); - if (!e_file_exists(buf)) - e_file_cp(PACKAGE_DATA_DIR"/data/config/appearance/default/borders/border2.bits.db", buf); - sprintf(buf, "%sappearance/borders/borderless.bits.db", e_config_user_dir()); - if (!e_file_exists(buf)) - e_file_cp(PACKAGE_DATA_DIR"/data/config/appearance/default/borders/borderless.bits.db", buf); #endif } diff --git a/src/desktops.c b/src/desktops.c index e4594e1fb..b31677c00 100644 --- a/src/desktops.c +++ b/src/desktops.c @@ -183,7 +183,7 @@ e_desktops_init_file_display(E_Desktop *desk) /* fixme: later */ /* uncomment this and comment out the next line for some tress testing */ /* desk->view->dir = strdup("/dev"); */ - desk->view->dir = strdup(e_file_home()); + e_strdup(desk->view->dir, e_file_home()); e_view_realize(desk->view); if (desk->view->options.back_pixmap) diff --git a/src/e.h b/src/e.h index aba435589..02ee97566 100644 --- a/src/e.h +++ b/src/e.h @@ -25,6 +25,16 @@ #include #include +#if 0 +#include +#define BT \ +{ \ +void *__BT_array[250]; \ +int __BT_n = backtrace(__BT_array,250); \ +backtrace_symbols_fd(__BT_array, __BT_n, fileno(stdout)); \ +} +#endif + /* macros for allowing sections of code to be runtime profiled */ #define E_PROF 1 #ifdef E_PROF diff --git a/src/icccm.c b/src/icccm.c index 3b1037dd9..1cdb1af05 100644 --- a/src/icccm.c +++ b/src/icccm.c @@ -1,6 +1,7 @@ #include "e.h" #include "border.h" #include "icccm.h" +#include "util.h" /* Motif window hints */ #define MWM_HINTS_FUNCTIONS (1L << 0) @@ -314,7 +315,7 @@ e_icccm_get_title(Window win, E_Border *b) } b->client.title = NULL; if (title) b->client.title = title; - else b->client.title = strdup("No Title"); + else e_strdup(b->client.title, "No Title"); } void diff --git a/src/util.c b/src/util.c index d058583a7..7539c86c5 100644 --- a/src/util.c +++ b/src/util.c @@ -83,33 +83,46 @@ char * e_file_real(char *file) { char buf[4096]; + char *f; if (!realpath(file, buf)) return strdup(""); - return strdup(buf); + e_strdup(f, buf); + return f; } char * e_file_get_file(char *file) { char *p; - /* char buf[4096]; */ + char *f; p = strrchr(file, '/'); - if (!p) return strdup(file); - return strdup(&(p[1])); + if (!p) + { + e_strdup(f, file); + return f; + } + e_strdup(f, &(p[1])); + return f; } char * e_file_get_dir(char *file) { char *p; + char *f; char buf[4096]; strcpy(buf, file); p = strrchr(buf, '/'); - if (!p) return strdup(file); + if (!p) + { + e_strdup(f, file); + return f; + } *p = 0; - return strdup(buf); + e_strdup(f, buf); + return f; } void * @@ -162,11 +175,13 @@ char * e_file_link(char *link) { char buf[4096]; + char *f; int count; if ((count = readlink(link, buf, sizeof(buf))) < 0) return NULL; buf[count] = 0; - return strdup(buf); + e_strdup(f, buf); + return f; } Evas_List @@ -185,18 +200,21 @@ e_file_list_dir(char *dir) (strcmp(dp->d_name, ".."))) { Evas_List l; + char *f; /* insertion sort */ for (l = list; l; l = l->next) { if (strcmp(l->data, dp->d_name) > 0) { - list = evas_list_prepend_relative(list, strdup(dp->d_name), l->data); + e_strdup(f, dp->d_name); + list = evas_list_prepend_relative(list, f, l->data); break; } } /* nowhwre to go? just append it */ - if (!l) list = evas_list_append(list, strdup(dp->d_name)); + e_strdup(f, dp->d_name); + if (!l) list = evas_list_append(list, f); } } closedir(dirp); diff --git a/src/util.h b/src/util.h index ee51f67cd..3fa04e402 100644 --- a/src/util.h +++ b/src/util.h @@ -19,4 +19,12 @@ int e_file_can_exec(struct stat *st); char *e_file_link(char *link); Evas_List e_file_list_dir(char *dir); +#define e_strdup(__dest, __var) \ +{ \ +if (!__var) __dest = NULL; \ +else { \ +__dest = malloc(strlen(__var) + 1); \ +if (__dest) strcpy(__dest, __var); \ +} } + #endif diff --git a/src/view.c b/src/view.c index 69bd78412..cf96cb517 100644 --- a/src/view.c +++ b/src/view.c @@ -341,6 +341,10 @@ e_bg_up_cb(void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) } } } + else if (_b == 2) + { + exit(0); + } else if (_b == 3) { static E_Build_Menu *buildmenu = NULL; @@ -1142,8 +1146,9 @@ e_configure(Eevent * ev) } } printf("size %ix%i\n", e->w, e->h); - if ((e->w != v->size.w) || (e->h != v->size.h)) + if ((e->w != v->size.w) || (e->h != v->size.h) || (v->size.force)) { + v->size.force = 0; printf("... a new size!\n"); v->size.w = e->w; v->size.h = e->h; @@ -1773,7 +1778,8 @@ e_view_arrange(E_View *v) E_Icon *ic; ic = l->data; - if ((x != v->spacing.window.l) && ((x + ic->geom.w) > v->size.w)) + if ((x != v->spacing.window.l) && + ((x + ic->geom.w) > v->size.w - v->spacing.window.r)) { x = v->spacing.window.l; y += ic->geom.h + v->spacing.icon.b; @@ -2542,9 +2548,12 @@ e_view_handle_fs(EfsdEvent *ev) { if (efsd_metadata_get_int(ev, &(v->size.w))) - e_window_resize(v->win.base, - v->size.w, - v->size.h); + { + e_window_resize(v->win.base, + v->size.w, + v->size.h); + v->size.force = 1; + } } } ok = 1; @@ -2558,9 +2567,12 @@ e_view_handle_fs(EfsdEvent *ev) { if (efsd_metadata_get_int(ev, &(v->size.h))) - e_window_resize(v->win.base, - v->size.w, - v->size.h); + { + e_window_resize(v->win.base, + v->size.w, + v->size.h); + v->size.force = 1; + } } } ok = 1; diff --git a/src/view.h b/src/view.h index 2e37870f1..d4e146905 100644 --- a/src/view.h +++ b/src/view.h @@ -29,6 +29,7 @@ struct _E_View Pixmap pmap; struct { int w, h; + int force; } size; struct { int x, y;