Please discard that patch. this is a much cleaner one.



On 11/9/05, Chady Kassouf <[EMAIL PROTECTED]> wrote:
Hello,

Following the new changes for the scrollbars, here's an updated eThemes that uses the new scrollframe.
plus, the theme buttons are now thumbnails that are cached in the fileman cache (I had to borrow some of the code)

enjoy.

--
Chady 'Leviathan' Kassouf
http://chady.net/




--
Chady 'Leviathan' Kassouf
http://chady.net/
Index: E_Preview.h
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e_utils/src/bin/ethemes/E_Preview.h,v
retrieving revision 1.1
diff -u -r1.1 E_Preview.h
--- E_Preview.h	12 Oct 2005 14:56:41 -0000	1.1
+++ E_Preview.h	10 Nov 2005 12:06:48 -0000
@@ -23,5 +23,36 @@
 void e_preview_theme_set(Evas_Object *object, const char * theme);
 
 
+int e_preview_is_theme(Evas * evas, const char * theme);
+
+/**
+ * initialize thumb generation.
+ */
+int e_preview_thumb_init(void);
+
+/**
+ * Get the full path of the thumbnail
+ */
+char * e_preview_thumb_file_get(const char * theme);
+
+/**
+ * Check the validity of the thumbnail
+ * @theme - the name of the theme file.
+ */
+int e_preview_thumb_check(const char * theme);
+
+/**
+ * Create a thumbnail for the current theme
+ * @theme - the name of the theme file.
+ */
+int e_preview_thumb_generate(const char * theme);
+
+/**
+ * Set an evas object's data to the thumbnail's image
+ * @theme - the name of the theme file
+ * @obj - the evas image object
+ */
+int e_preview_thumb_image(const char * theme, Evas_Object * obj);
+
 #endif
 
Index: Makefile.am
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e_utils/src/bin/ethemes/Makefile.am,v
retrieving revision 1.3
diff -u -r1.3 Makefile.am
--- Makefile.am	23 Oct 2005 11:51:18 -0000	1.3
+++ Makefile.am	10 Nov 2005 12:06:48 -0000
@@ -9,6 +9,7 @@
 	@ECORE_CFLAGS@ \
 	@EVAS_CFLAGS@ \
 	@ESMART_CFLAGS@ \
+	@[EMAIL PROTECTED]
 	@EDJE_CFLAGS@ \
 	@ENLIGHTENMENT_CFLAGS@
 
@@ -26,6 +27,7 @@
 	@EDJE_LIBS@ \
 	@ESMART_LIBS@ \
 	-lesmart_container \
+	@EET_LIBS@ \
 	@ENLIGHTENMENT_LIBS@
 
 EXTRA_DIST = \
Index: e_preview.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e_utils/src/bin/ethemes/e_preview.c,v
retrieving revision 1.2
diff -u -r1.2 e_preview.c
--- e_preview.c	24 Oct 2005 10:51:19 -0000	1.2
+++ e_preview.c	10 Nov 2005 12:06:51 -0000
@@ -4,12 +4,13 @@
 #include <limits.h>
 #include <Edje.h>
 #include <Evas.h>
+#include <Ecore_Evas.h>
+#include <Eet.h>
 #include <E_Lib.h>
 #include <sys/stat.h>
 
 #include "E_Preview.h"
 
-
 typedef struct _e_preview E_Preview; 
 struct _e_preview {
 
@@ -34,19 +35,13 @@
 static void _e_preview_redraw(Evas_Object *);
 static void _e_preview_add(Evas_Object *);
 static void _e_preview_del(Evas_Object *);
-static void _e_preview_layer_set(Evas_Object *, int);
-static void _e_preview_raise(Evas_Object *);
-static void _e_preview_lower(Evas_Object *);
-static void _e_preview_stack_above(Evas_Object *, Evas_Object *);
-static void _e_preview_stack_below(Evas_Object *, Evas_Object *);
 static void _e_preview_move(Evas_Object *, Evas_Coord, Evas_Coord);
 static void _e_preview_resize(Evas_Object *, Evas_Coord, Evas_Coord);
 static void _e_preview_show(Evas_Object *);
 static void _e_preview_hide(Evas_Object *);
-static void _e_preview_color_set(Evas_Object *, int, int, int, int);
 static void _e_preview_clip_set(Evas_Object *, Evas_Object *);
-static void _e_preview_clip_unset(Evas_Object *);
 
+static char * _e_thumb_file_id(char *file);
 
 
 Evas_Object * e_preview_new(Evas *evas) {
@@ -86,18 +81,14 @@
 			"e_preview",
 			_e_preview_add,
 			_e_preview_del,
-			_e_preview_layer_set,
-			_e_preview_raise,
-			_e_preview_lower,
-			_e_preview_stack_above,
-			_e_preview_stack_below,
+			NULL, NULL, NULL, NULL, NULL,
 			_e_preview_move,
 			_e_preview_resize,
 			_e_preview_show,
 			_e_preview_hide,
-			_e_preview_color_set,
+			NULL, 
 			_e_preview_clip_set,
-			_e_preview_clip_unset,
+			NULL,
 			NULL
 			);
 	return smart;
@@ -151,77 +142,6 @@
 	}
 }
 
-static void _e_preview_layer_set(Evas_Object *o, int l) {
-	E_Preview * data;
-
-	if ((data = evas_object_smart_data_get(o))) {
-		evas_object_layer_set(data->wallpaper, l);
-		evas_object_layer_set(data->window, l);
-		evas_object_layer_set(data->clock, l);
-		evas_object_layer_set(data->start, l);
-		evas_object_layer_set(data->pager[0], l);
-		evas_object_layer_set(data->pager[1], l);
-		evas_object_layer_set(data->pager[2], l);
-	}
-}
-
-static void _e_preview_raise(Evas_Object *o) {
-	E_Preview * data;
-
-	if ((data = evas_object_smart_data_get(o))) {
-		evas_object_raise(data->wallpaper);
-		evas_object_raise(data->window);
-		evas_object_raise(data->clock);
-		evas_object_raise(data->start);
-		evas_object_raise(data->pager[0]);
-		evas_object_raise(data->pager[1]);
-		evas_object_raise(data->pager[2]);
-	}
-}
-
-static void _e_preview_lower(Evas_Object *o) {
-	E_Preview * data;
-
-	if ((data = evas_object_smart_data_get(o))) {
-		evas_object_lower(data->wallpaper);
-		evas_object_lower(data->window);
-		evas_object_lower(data->clock);
-		evas_object_lower(data->start);
-		evas_object_lower(data->pager[0]);
-		evas_object_lower(data->pager[1]);
-		evas_object_lower(data->pager[2]);
-	}
-}
-
-static void _e_preview_stack_above(Evas_Object *o, Evas_Object * above) {
-	E_Preview * data;
-
-	if ((data = evas_object_smart_data_get(o))) {
-		evas_object_stack_above(data->wallpaper, above);
-		evas_object_stack_above(data->window, above);
-		evas_object_stack_above(data->clock, above);
-		evas_object_stack_above(data->start, above);
-		evas_object_stack_above(data->pager[0], above);
-		evas_object_stack_above(data->pager[1], above);
-		evas_object_stack_above(data->pager[2], above);
-	}
-}
-	
-static void _e_preview_stack_below(Evas_Object *o, Evas_Object * below) {
-	E_Preview * data;
-
-	if ((data = evas_object_smart_data_get(o))) {
-		evas_object_stack_below(data->wallpaper, below);
-		evas_object_stack_below(data->window, below);
-		evas_object_stack_below(data->clock, below);
-		evas_object_stack_below(data->start, below);
-		evas_object_stack_below(data->pager[0], below);
-		evas_object_stack_below(data->pager[1], below);
-		evas_object_stack_below(data->pager[2], below);
-	}
-}
-
-
 static void _e_preview_move(Evas_Object *o, Evas_Coord x, Evas_Coord y) {
 	E_Preview *data;
 
@@ -273,6 +193,21 @@
 	}
 }
 
+int e_preview_is_theme(Evas * evas, const char * theme) {
+
+	char * file = malloc(sizeof(char) * PATH_MAX);
+	snprintf(file, PATH_MAX, "%s/.e/e/themes/%s", getenv("HOME"), theme);
+
+	Evas_Object * o = NULL;
+	o = edje_object_add(evas);
+	edje_object_file_set(o, file, "widgets/border/default/border");
+	if (edje_object_part_exists(o, "widgets/border/default/border")) 
+		return 1;
+
+	return 0;
+			 
+}
+
 void e_preview_theme_set(Evas_Object *object, const char * theme) {
 
 	E_Preview *data;
@@ -418,22 +353,146 @@
 	}
 }
 
+int e_preview_thumb_image(const char * thumb, Evas_Object * obj) {
+
+
+	Eet_File * ef;
+	ef = eet_open(thumb, EET_FILE_MODE_READ);
+	if (ef) {
+		int * pixels;
+		pixels = (int *) eet_data_image_read(ef, "/thumbnail/data", 
+				NULL, NULL, NULL, NULL, NULL, NULL);
+		evas_object_image_data_set(obj, pixels);
+		eet_close(ef);
+	}
+
+	return 1;
+
+}
+
+int e_preview_thumb_init(void) {
+
+	char  path[PATH_MAX];
+	snprintf(path, sizeof(path), "%s/.e/e/fileman/thumbnails", getenv("HOME"));
+	if (!ecore_file_exists(path))
+		ecore_file_mkpath(path);
+	else
+		return 0;
+	
+	return 1;
+
+}
+
+int e_preview_thumb_check(const char * theme) {
+
+	struct stat themestatus;
+	struct stat thumbstatus;
+	char themefile[PATH_MAX];
+	snprintf(themefile, PATH_MAX, "%s/.e/e/themes/%s", getenv("HOME"), theme);
+
+	char * thumb = e_preview_thumb_file_get(theme);
+
+	if (stat(themefile, &themestatus) == 0)
+		if (stat(thumb, &thumbstatus) == 0) {
+			if (themestatus.st_mtime > thumbstatus.st_mtime) /* not uptodate */
+				return 1;
+		} else {
+			return 1;
+		}
+		
+
+	
+	return 0;
+}
+
+char * e_preview_thumb_file_get(const char * theme) {
 
+	char * file = (char *)malloc(sizeof(char) * PATH_MAX);
+	snprintf(file, PATH_MAX, "%s/.e/e/themes/%s", getenv("HOME"), theme);
+	
+	char * thumb = (char *)malloc(sizeof(char) * PATH_MAX);
+	snprintf(thumb, PATH_MAX, "%s/.e/e/fileman/thumbnails/%s", getenv("HOME"), _e_thumb_file_id(file));
 
-static void _e_preview_color_set(Evas_Object *o, 
-		int r, int g, int b, int a) {}
+	return thumb;
+}
+
+int e_preview_thumb_generate(const char * theme) {
+
+	printf("Generating thumb.\n");
+	Ecore_Evas *ee = NULL;
+	Evas *e = NULL;
+	Evas_Object * preview;
+	
+	ee = ecore_evas_buffer_new(640, 480);
+	e = ecore_evas_get(ee);
+	preview = e_preview_new(e);
+	e_preview_theme_set(preview, theme);
+	evas_object_move(preview, 0, 0);
+	evas_object_resize(preview, 640, 480);
+	evas_object_show(preview);
+
+	const int *pixels;
+	pixels = ecore_evas_buffer_pixels_get(ee);
+	char * out = e_preview_thumb_file_get(theme);
+	
+	Eet_File * ef;
+	ef = eet_open(out, EET_FILE_MODE_WRITE);
+	if (ef) {
+		char path[PATH_MAX];
+		snprintf(path, PATH_MAX, "%s/.e/e/themes/%s", getenv("HOME"), theme);
+		eet_write(ef, "/thumbnail/orig_path", path, strlen(path), 1);
+		eet_data_image_write(ef, "/thumbnail/data", (void *) pixels, 640, 480, 1, 0, 91, 1);
+		eet_close(ef);
+	}
+	
+	return 1;
+}
 
 static void _e_preview_clip_set(Evas_Object *o, Evas_Object *clip){
 	E_Preview *data;
 	if ((data = evas_object_smart_data_get(o))) {
 		evas_object_clip_set(data->wallpaper, clip);
-
 	}
-
-
 }
 
-static void _e_preview_clip_unset(Evas_Object *o) {}
-
 
+/* return hash for a file  (from E) */
+static char * _e_thumb_file_id(char *file) {
+   char                s[256], *sp;
+   const char         *chmap =
+     "0123456789abcdef"
+     "ghijklmnopqrstuv"
+     "[EMAIL PROTECTED]&*()"
+     "[];',.{}<>?-=_+|";
+   unsigned int        id[4], i;
+   struct stat         st;
+
+   if (stat(file, &st) < 0)
+     return NULL;
+
+   id[0] = st.st_ino;
+   id[1] = st.st_dev;
+   id[2] = (st.st_size & 0xffffffff);
+   id[3] = (st.st_mtime & 0xffffffff);
+
+   sp = s;
+   for (i = 0; i < 4; i++)
+     {
+        unsigned int t, tt;
+        int j;
+
+        t = id[i];
+        j = 32;
+        while (j > 0)
+          {
+             tt = t & ((1 << 6) - 1);
+             *sp = chmap[tt];
+             t >>= 6;
+             j -= 6;
+             sp++;
+          }
+     }
+   *sp = 0;
+   return strdup(s);
+}
 
Index: main.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e_utils/src/bin/ethemes/main.c,v
retrieving revision 1.7
diff -u -r1.7 main.c
--- main.c	23 Oct 2005 11:51:18 -0000	1.7
+++ main.c	10 Nov 2005 12:06:53 -0000
@@ -21,22 +21,92 @@
 const int HEIGHT = 500;
 const int container_height = 400;
 
-char * selected_theme;
-char * current_theme;
-
 Evas_List * themes;
 
-Evas_Object * label;
-
 Evas_Object * container_outer;
 Evas_Object * container;
-Evas_Object * scrollbar;
 
-Evas_Object ** buttons;
+Evas_Object * b_default,
+	    * b_apply,
+	    * b_exit;
+
 Evas_Object * preview;
 Evas_Object * preview_clip;
 Evas_Object * background;
 
+Evas_Object * last_button;
+
+char * default_theme;
+char * selected_theme;
+
+typedef struct {
+	Evas_Object * thumb;
+	Evas_Object * button;
+	char * theme;
+	char * label;
+	char * thumbpath;
+} Etheme_Object;
+
+
+static void _preview_theme(void *data, Evas_Object *obj, const char *emission, const char *source);
+
+Etheme_Object * etheme_new(const char * t) {
+
+	Etheme_Object * o;
+	o = (Etheme_Object *) malloc(sizeof(Etheme_Object));
+
+	o->theme = (char *) strdup(t);
+	o->thumbpath = e_preview_thumb_file_get(t);
+
+
+	int size = strlen(t) - 4; /* without .edj */
+
+	o->label = malloc(sizeof(char) * size);
+	o->label = strncpy(o->label, t, size);
+	o->label[size] = 0;
+		
+	o->button = edje_object_add(evas);
+
+	edje_object_file_set(o->button, default_theme, "fileman/icon_normal");
+	evas_object_resize(o->button, 100, 120);
+	edje_object_part_text_set(o->button, "icon_title" , o->label);
+		
+	esmart_container_element_append(container, o->button);
+	
+	if (e_preview_thumb_check(t))
+		e_preview_thumb_generate(t);
+		
+	o->thumb = evas_object_image_add(evas);
+	evas_object_image_size_set(o->thumb, 640, 480);
+	evas_object_image_fill_set(o->thumb, 0, 0, 85, 85);
+	e_preview_thumb_image(o->thumbpath, o->thumb);
+
+	edje_object_part_swallow(o->button, "icon_swallow", o->thumb);
+
+	evas_object_show(o->button);
+
+	edje_object_signal_callback_add(o->button, "mouse,up,1", "icon_event",
+				_preview_theme, o);
+		
+	
+	return o;
+
+}
+
+void etheme_free(Etheme_Object * o) {
+
+	if (!o) return;
+
+	if (o->theme) free(o->theme);
+	if (o->thumbpath) free(o->thumbpath);
+	if (o->label) free(o->label);
+	
+	evas_object_del(o->thumb);
+	evas_object_del(o->button);
+
+	free(o);
+}
+
 
 void _resize_cb(Ecore_Evas * ee) {
 
@@ -52,30 +122,47 @@
 	evas_object_move(background, 0, 0);
 	evas_object_resize(background, barwidth, h);
 	evas_object_show(background);
+		
+	evas_object_resize(container_outer, barwidth, h - 100);
 
 	int length = (int) esmart_container_elements_length_get(container);
-	if (length > h - 100) {
-		evas_object_resize(container_outer, barwidth - 19, h - 100);
-		evas_object_show(scrollbar);
-	} else {
-		evas_object_resize(container_outer, barwidth, h - 100);
-		evas_object_hide(scrollbar);
-	}
 
-	int n = evas_list_count(themes);
-	evas_object_move(buttons[n], 0, h - 100 + 10);
-	evas_object_move(buttons[n+1], 0, h - 100 + 40);
-	evas_object_move(buttons[n+2], 0, h - 100 + 60);
-	evas_object_resize(scrollbar, 16, h - 100);
+	double size;
+	size = (double)(h - 100) / (double)length;
+
+	edje_object_part_drag_size_set(container_outer, "vbar_bar", 1.0, size);
+
+	if (length > h - 100)
+		edje_object_signal_emit(container_outer, "vbar", "show");
+	else
+		edje_object_signal_emit(container_outer, "vbar", "hide");
+
+	evas_object_move(b_default, 0, h - 100 + 10);
+	evas_object_move(b_apply, 0, h - 100 + 40);
+	evas_object_move(b_exit, 0, h - 100 + 60);
 
 	
 }
 
-static void _preview_theme(void *data, Evas_Object *o, const char *emission, const char *source) {
+static void _preview_theme(void *data, Evas_Object *obj, const char *emission, const char *source) {
+
+	Etheme_Object * o;
+	o = (Etheme_Object *) data;
 
-	selected_theme = (char *) data;
+	if (!o)
+		selected_theme = (char *)strdup("default.edj");
+	else
+		selected_theme = o->theme;
 
 	e_preview_theme_set(preview, selected_theme);
+
+	if (last_button)
+		edje_object_signal_emit(last_button, "unclicked", "");
+	if (o) {
+		edje_object_signal_emit(o->button, "clicked", "");
+		last_button = o->button;
+	}
+	
 	_resize_cb(ee);
 
 }
@@ -97,31 +184,15 @@
 
 }
 
-static void _scrollup(void *data, Evas_Object *o, const char *emission, const char *source) { 
-	esmart_container_scroll_start(container, 1);
-}
-
-static void _scrolldown(void *data, Evas_Object *o, const char *emission, const char *source) { 
-	esmart_container_scroll_start(container, -1);
-}
-
 static void _scrolldrag(void *data, Evas_Object *o, const char *emission, const char *source) { 
 	        
-	double x, y;
-	edje_object_part_drag_value_get(scrollbar, "drag", &x, &y);
+	double y;
+	edje_object_part_drag_value_get(container_outer, "vbar_bar", NULL,  &y);
 	esmart_container_scroll_percent_set(container, y);
 
 }
 
-static void _scrollstop(void *data, Evas_Object *o, const char *emission, const char *source) { 
-	esmart_container_scroll_stop(container);
-	double s;
-	s = esmart_container_scroll_percent_get(container);
-	edje_object_part_drag_value_set(scrollbar, "drag", 1, s);
-
-}
-
-void read_theme_list() {
+void get_theme_list() {
 
 	char * path;
 	path = malloc(sizeof(char) * PATH_MAX);
@@ -133,10 +204,13 @@
 	ecore_list_goto_first(list);
 	char * data;
 	themes = NULL;
-	while ((data = (char *)ecore_list_next(list)))
+	while (data = (char *)ecore_list_next(list))
 		if (strstr(data, ".edj") != NULL) {
 			char * file = (char *) strdup(data);
-			themes = evas_list_append(themes, file);
+			Etheme_Object * o;
+			o = etheme_new(file);
+			themes = evas_list_append(themes, o);
+			free(file);
 		}
 	
 	ecore_list_destroy(list);
@@ -146,74 +220,42 @@
 
 void create_buttons() {
 
-	int n = evas_list_count(themes);
-	
-	buttons = calloc(n + 3, sizeof(Evas_Object *));
 	
 	container_outer = edje_object_add(evas);
-	edje_object_file_set(container_outer, current_theme, "modules/ibar/main");
+	edje_object_file_set(container_outer, default_theme, "widgets/scrollframe");
 	evas_object_move(container_outer, 0, 0);
+	edje_object_signal_emit(container_outer, "hbar", "hide");
 	evas_object_resize(container_outer, barwidth - 19, container_height);
 	evas_object_show(container_outer);
 
-	scrollbar = edje_object_add(evas);
-	edje_object_file_set(scrollbar, current_theme, "widgets/vscrollbar");
-	evas_object_move(scrollbar, barwidth - 19, 0);
-	evas_object_resize(scrollbar, 16, container_height);
-	evas_object_show(scrollbar);
-
-	edje_object_signal_callback_add(scrollbar, "scroll_top_start", "", _scrollup, NULL);
-	edje_object_signal_callback_add(scrollbar, "scroll_bottom_start", "", _scrolldown, NULL);
-	edje_object_signal_callback_add(scrollbar, "scroll_top_stop", "", _scrollstop, NULL);
-	edje_object_signal_callback_add(scrollbar, "scroll_bottom_stop", "", _scrollstop, NULL);
-	edje_object_signal_callback_add(scrollbar, "drag", "*", _scrolldrag, NULL);
+	edje_object_signal_callback_add(container_outer, "drag*", "vbar_bar", _scrolldrag, NULL);
 	
 	container = esmart_container_new(evas);
-	edje_object_part_swallow(container_outer, "items", container);
+	edje_object_part_swallow(container_outer, "item", container);
 	esmart_container_direction_set(container, CONTAINER_DIRECTION_VERTICAL);
 	
+	get_theme_list();
 
-#define BUTTON_EVENTS(A, B, C)\
-	edje_object_signal_callback_add(buttons[A], "click", "", B, C);
-	
-#define ADD_BUTTON(A, B, C, D)\
-	buttons[A] = edje_object_add(evas);\
-	edje_object_file_set(buttons[A], current_theme, "widgets/button");\
-	evas_object_resize(buttons[A], D, 24);\
-	edje_object_part_text_set(buttons[A], "label", C);\
-	evas_object_show(buttons[A]);
-	
-	int i;
-	for (i=0; i<n; i++) {
-			
-		char * n;
-		n = evas_list_nth(themes, i);
-		char * name;
-		int size = strlen(n) - 4; /* without .edj */
-		name = malloc(sizeof(char) * size);
-		name = strncpy(name, n, size);
-		name[size] = 0;
-		
-		ADD_BUTTON(i, 20, name, 100);
-		esmart_container_element_append(container, buttons[i]);
-		BUTTON_EVENTS(i, _preview_theme, evas_list_nth(themes, i));
-		
-	}
-	
-	ADD_BUTTON(n, 40, "Default Theme", 120);
-	evas_object_move(buttons[n], 5, container_height + 10);
-	BUTTON_EVENTS(n, _preview_theme, "default.edj");
+#define ADD_BUTTON(A, B, C)\
+	A = edje_object_add(evas);\
+	edje_object_file_set(A, default_theme, "widgets/button");\
+	evas_object_resize(A, 120, 24);\
+	edje_object_part_text_set(A, "label", C);\
+	evas_object_show(A);
+	
+	ADD_BUTTON(b_default, 40, "Default Theme");
+	evas_object_move(b_default, 5, container_height + 10);
+	edje_object_signal_callback_add(b_default, "click", "", _preview_theme, NULL);
 	 
-	ADD_BUTTON(n + 1, 60, "Apply", 120);
-	evas_object_move(buttons[n+1], 5, container_height + 40);
-	BUTTON_EVENTS(n + 1, _set_theme, NULL);
-	
-	ADD_BUTTON(n + 2, 80, "Exit", 120);
-	evas_object_move(buttons[n+2], 5, container_height + 60);
-	BUTTON_EVENTS(n + 2, _ethemes_exit, NULL);
+	ADD_BUTTON(b_apply, 60, "Apply");
+	evas_object_move(b_apply, 5, container_height + 40);
+	edje_object_signal_callback_add(b_apply, "click", "", _set_theme, NULL);
+	
+	ADD_BUTTON(b_exit, 80, "Exit");
+	evas_object_move(b_exit, 5, container_height + 60);
+	edje_object_signal_callback_add(b_exit, "click", "", _ethemes_exit, NULL);
 	
 
-#undef BUTTON_EVENTS
 #undef ADD_BUTTON
 }
 
@@ -222,17 +264,9 @@
 	E_Response_Theme_Get *e;
 	e = ev;
 	
-/* for now, I'll only use the default e17 theme cause it's the only one that 
- * is guaranteed to work.
- 
-	current_theme = malloc(sizeof(char) * PATH_MAX);
-	snprintf(current_theme, PATH_MAX, "%s/.e/e/themes/%s", getenv("HOME"),
-			e->file);
-*/
-	
-	current_theme = E17PREFIX "/share/enlightenment/data/themes/default.edj";
+	default_theme = (char *) strdup(E17PREFIX "/share/enlightenment/data/themes/default.edj");
 
-	edje_object_file_set(background, current_theme, "widgets/menu/default/background");
+	edje_object_file_set(background, default_theme, "widgets/menu/default/background");
 
 	selected_theme = (char *)strdup(e->file);
 	e_preview_theme_set(preview, selected_theme);
@@ -273,6 +307,8 @@
 	evas_object_resize(background, barwidth, HEIGHT);
 	evas_object_show(background);
 
+	e_preview_thumb_init();
+
 	preview = e_preview_new(evas);
 	
 	preview_clip = evas_object_rectangle_add(evas);
@@ -281,7 +317,7 @@
 	evas_object_show(preview_clip);
 	evas_object_clip_set (preview, preview_clip);
 	
-	read_theme_list();
+	last_button = NULL;
 
 	ecore_evas_callback_resize_set(ee, _resize_cb);
 	        
@@ -290,7 +326,28 @@
 			
 	ecore_main_loop_begin();
 
+	/* free ethemes */
+	int n = evas_list_count(themes);
+	for ( n -= 1; n>=0; n--) {
+		Etheme_Object * o;
+		o = evas_list_nth(themes, n);
+		etheme_free(o);
+	}
+	evas_list_free(themes);
 
+	/* free canvas objects */
+	evas_object_free(container);
+	evas_object_free(container_outer);
+	evas_object_free(b_apply);
+	evas_object_free(b_default);
+	evas_object_free(b_exit);
+	evas_object_free(background);
+	evas_object_free(preview);
+	evas_object_free(preview_clip);
+	
+	if (selected_theme) free(selected_theme);
+	if (default_theme) free(default_theme);
+	
 	edje_shutdown();
 	ecore_shutdown();
 
@@ -298,4 +355,3 @@
 }
 
 
-

Reply via email to