From 549154cd7dc77846810654ea60b110a305b66677 Mon Sep 17 00:00:00 2001 From: sebastid Date: Wed, 17 Aug 2005 01:35:48 +0000 Subject: [PATCH] Themeable pointers. SVN revision: 16218 --- data/themes/Makefile.am | 1 + data/themes/default.edc | 1 + data/themes/images/pointer.png | Bin 0 -> 1460 bytes data/themes/images/pointer_mono.png | Bin 0 -> 229 bytes src/bin/e.h | 1 + src/bin/e_container.c | 6 +- src/bin/e_container.h | 5 + src/bin/e_error.c | 8 +- src/bin/e_init.c | 5 +- src/bin/e_main.c | 23 ++-- src/bin/e_pointer.c | 192 ++++++++++++++++++++-------- src/bin/e_pointer.h | 24 +++- 12 files changed, 197 insertions(+), 69 deletions(-) create mode 100644 data/themes/images/pointer.png create mode 100644 data/themes/images/pointer_mono.png diff --git a/data/themes/Makefile.am b/data/themes/Makefile.am index 05b6f18ac..c61d7018c 100644 --- a/data/themes/Makefile.am +++ b/data/themes/Makefile.am @@ -34,6 +34,7 @@ default_transitions.edc \ default_dialog.edc \ default_desktopname.edc \ default_icons.edc \ +default_pointer.edc \ default_randr.edc default.edj: Makefile $(EXTRA_DIST) diff --git a/data/themes/default.edc b/data/themes/default.edc index 76cddac20..be4ccc865 100644 --- a/data/themes/default.edc +++ b/data/themes/default.edc @@ -43,5 +43,6 @@ collections { #include "default_desktopname.edc" #include "default_icons.edc" #include "default_randr.edc" +#include "default_pointer.edc" } diff --git a/data/themes/images/pointer.png b/data/themes/images/pointer.png new file mode 100644 index 0000000000000000000000000000000000000000..3682632f57a2b934fa7755db760af72b3ac10b22 GIT binary patch literal 1460 zcmV;l1xxygP)gJ`Jn42cSc zcxw!?fI=ezf`Sy}2oRvwo_oA={KF}Elm)B4WU_BJv!D6S@0LI@&=0VH0FdVWe?1bo zrn-9GOMCY=w6?ak3!uFKT>lqv`HB_GXD1Sg$y>J6A9oxt2jn7P{a@e`xNydd`|p@I zadJ-~!Z8~*Z2VJeTp$|(Mpw5U1t{B2Sv57)+;!J|rJfr+vFL>t6UN?$jPi~MH0%!8 z0%Sa1B=UKWl`CK4o_p^rdE}7??p8|P1PlR6fD{n_H;z>RQd%elm6ao?tzAl0)q*nL zcc-sh`ECe&-Nh7cca$r@%4FKZFmxy@D@N=7EL%2@*|X;k)S*AU_RUoR@KqQ4{v%ug zVJs$vlmV8Np}ahe4qJGuwuYykt{Uv*vbVjrYOMx7>*7G?Y!0;mZCQvQa1kQM;6W+U zJrzUC0zP#`zx6L z!qQ8xy?XQ{U=q;Vl!62hE2P{4VoFK^$3Z%IL?**IHpD|8?YWdBW5nBb^5MI$@!az- zkGbNq;nx9^Bk*J)xTTa7wu)KW_pw|Dk!Sn8C*Gyim_Kw zQBf%#dUV#5vOdMb47f)`wE%3lcNf{GZHV2y$h#~j0Y3u&{k;4a@e?C@9%s-S$wFKmk_KCQwD16O86dzu1z$CR2V1pQslkC~ga8)zeN+}yImz(WcIwbkXjG+9+* zDp{$iWIB>0O(xv3kx)CSs?f|J%%;u*r1@jq?8_VF850U&*Fvw(Fh+I0dqzzsOhvke zV}5fBfkk)bjz|PZ0|?9t0<%u*)}ot3jVLfAhG*;2qMM^wp?znaeaNzCxguBKd5Ol1CpTI%p51B8 zn3~9{X{&rvkDEc+*M%$N`kofYXM5GIC0MDLu=1bV!+K9UF{9^*_og@LpI>XoCVV#F UKl|y<8=&zopr0Ae{$@c;k- literal 0 HcmV?d00001 diff --git a/src/bin/e.h b/src/bin/e.h index 7cc3c48d8..4752a5059 100644 --- a/src/bin/e.h +++ b/src/bin/e.h @@ -19,6 +19,7 @@ #include #include +#include #include #include #include diff --git a/src/bin/e_container.c b/src/bin/e_container.c index 01fd61dd4..97af8e581 100644 --- a/src/bin/e_container.c +++ b/src/bin/e_container.c @@ -122,7 +122,8 @@ e_container_new(E_Manager *man) evas_object_data_set(o, "e_container", con); evas_object_show(o); - e_pointer_container_set(con); + con->pointer.root = e_pointer_window_set(con->manager->root); + con->pointer.win = e_pointer_window_set(con->win); con->num = container_num; container_num++; @@ -890,6 +891,9 @@ _e_container_free(E_Container *con) Evas_List *l, *tmp; int i; + if (con->pointer.root) e_object_del(E_OBJECT(con->pointer.root)); + if (con->pointer.win) e_object_del(E_OBJECT(con->pointer.win)); + ecore_x_window_del(con->event_win); if (con->gadman) e_object_del(E_OBJECT(con->gadman)); /* We can't use e_object_del here, because border adds a ref to itself diff --git a/src/bin/e_container.h b/src/bin/e_container.h index ac9381e92..58557c0c8 100644 --- a/src/bin/e_container.h +++ b/src/bin/e_container.h @@ -54,6 +54,11 @@ struct _E_Container Ecore_X_Window win; Evas_List *clients; } layers[7]; + + struct { + E_Pointer *root; + E_Pointer *win; + } pointer; }; struct _E_Border_List diff --git a/src/bin/e_error.c b/src/bin/e_error.c index 72b0d8d21..0b7fcd3fd 100644 --- a/src/bin/e_error.c +++ b/src/bin/e_error.c @@ -61,6 +61,7 @@ e_error_message_manager_show(E_Manager *man, char *title, char *txt) Evas_Coord maxw, maxh; E_Container *con; Ecore_X_Window win; + E_Pointer *p; int x, y; char *s; @@ -93,7 +94,8 @@ e_error_message_manager_show(E_Manager *man, char *title, char *txt) ecore_evas_title_set(ee, "Enlightenment: Low Level Dialog"); // ecore_evas_avoid_damage_set(ee, 1); e = ecore_evas_get(ee); - e_pointer_ecore_evas_set(ee); + p = e_pointer_window_set(win); + ecore_evas_data_set(ee, "pointer", p); o = edje_object_add(e); if (!e_theme_edje_object_set(o, "base/theme/error", "error/main")) @@ -421,6 +423,7 @@ _e_error_cb_job_ecore_evas_free(void *data) { Ecore_Evas *ee; Evas_List *shapelist, *l; + E_Pointer *p; ee = data; shapelist = ecore_evas_data_get(ee, "shapes"); @@ -428,6 +431,9 @@ _e_error_cb_job_ecore_evas_free(void *data) e_object_del(E_OBJECT(l->data)); evas_list_free(shapelist); + p = ecore_evas_data_get(ee, "pointer"); + e_object_del(E_OBJECT(p)); + e_canvas_del(ee); ecore_evas_free(ee); } diff --git a/src/bin/e_init.c b/src/bin/e_init.c index 9cd1ae90e..3cfcc5e53 100644 --- a/src/bin/e_init.c +++ b/src/bin/e_init.c @@ -13,6 +13,7 @@ static Ecore_Evas *_e_init_ecore_evas = NULL; static Evas *_e_init_evas = NULL; static Evas_Object *_e_init_object = NULL; static Evas_Object *_e_init_icon_box = NULL; +static E_Pointer *_e_init_pointer = NULL; /* startup icons */ static Evas_Coord _e_init_icon_size = 0; @@ -60,7 +61,7 @@ e_init_init(void) _e_init_evas = ecore_evas_get(_e_init_ecore_evas); ecore_evas_name_class_set(_e_init_ecore_evas, "E", "Init_Window"); ecore_evas_title_set(_e_init_ecore_evas, "Enlightenment Init"); - e_pointer_ecore_evas_set(_e_init_ecore_evas); + _e_init_pointer = e_pointer_window_set(_e_init_win); ecore_evas_raise(_e_init_ecore_evas); ecore_evas_show(_e_init_ecore_evas); @@ -144,10 +145,12 @@ e_init_hide(void) evas_object_del(_e_init_object); e_canvas_del(_e_init_ecore_evas); ecore_evas_free(_e_init_ecore_evas); + e_object_del(E_OBJECT(_e_init_pointer)); _e_init_ecore_evas = NULL; _e_init_evas = NULL; _e_init_win = 0; _e_init_object = NULL; + _e_init_pointer = NULL; e_canvas_cache_flush(); } diff --git a/src/bin/e_main.c b/src/bin/e_main.c index d65777135..a7db33c74 100644 --- a/src/bin/e_main.c +++ b/src/bin/e_main.c @@ -424,17 +424,6 @@ main(int argc, char **argv) e_font_apply(); e_canvas_recache(); - if (!((!e_config->show_splash) || (after_restart))) - { - /* setup init status window/screen */ - if (!e_init_init()) - { - e_error_message_show(_("Enlightenment cannot set up init screen.\n" - "Perhaps you are out of memory?")); - _e_main_shutdown(-1); - } - _e_main_shutdown_push(e_init_shutdown); - } /* init app system */ if (!e_app_init()) { @@ -449,6 +438,17 @@ main(int argc, char **argv) _e_main_shutdown(-1); } _e_main_shutdown_push(e_theme_shutdown); + if (!((!e_config->show_splash) || (after_restart))) + { + /* setup init status window/screen */ + if (!e_init_init()) + { + e_error_message_show(_("Enlightenment cannot set up init screen.\n" + "Perhaps you are out of memory?")); + _e_main_shutdown(-1); + } + _e_main_shutdown_push(e_init_shutdown); + } /* manage the root window */ if (!_e_main_screens_init()) { @@ -1022,6 +1022,7 @@ _e_main_cb_idler_before(void *data __UNUSED__) e_border_idler_before(); e_popup_idler_before(); e_drag_idler_before(); + e_pointer_idler_before(); for (l = _e_main_idler_before_list; l; l = l->next) { E_Before_Idler *eb; diff --git a/src/bin/e_pointer.c b/src/bin/e_pointer.c index fc2689572..9bf7d9642 100644 --- a/src/bin/e_pointer.c +++ b/src/bin/e_pointer.c @@ -3,72 +3,160 @@ */ #include "e.h" +static Evas_List *_e_pointers = NULL; + +static void _e_pointer_free(E_Pointer *p); + /* externally accessible functions */ -void -e_pointer_container_set(E_Container *con) +E_Pointer * +e_pointer_window_set(Ecore_X_Window win) { - Ecore_X_Cursor cur; - int w, h; - Evas_Object *o; - int *pix; - char *s; + Evas_Engine_Info_Buffer *einfo; + E_Pointer *p; + int rmethod; + Evas_Coord w, h; - E_OBJECT_CHECK(E_OBJECT(con)); + rmethod = evas_render_method_lookup("buffer"); + if (!rmethod) return NULL; + + p = E_OBJECT_ALLOC(E_Pointer, E_POINTER_TYPE, _e_pointer_free); + if (!p) return NULL; + + p->win = win; + + p->w = 10; + p->h = 10; + + /* create evas */ + p->evas = evas_new(); + evas_output_method_set(p->evas, rmethod); + evas_output_size_set(p->evas, p->w, p->h); + evas_output_viewport_set(p->evas, 0, 0, p->w, p->h); - o = evas_object_image_add(con->bg_evas); + p->pixels = calloc(p->w * p->h, sizeof(int)); + + einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(p->evas); + if (einfo) + { + einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32; + einfo->info.dest_buffer = p->pixels; + einfo->info.dest_buffer_row_bytes = p->w * sizeof(int); + einfo->info.use_color_key = 0; + einfo->info.alpha_threshold = 0; + einfo->info.func.new_update_region = NULL; + einfo->info.func.free_update_region = NULL; + evas_engine_info_set(p->evas, (Evas_Engine_Info *)einfo); + } + + /* set the pointer edje */ + p->evas_object = edje_object_add(p->evas); if (ecore_x_cursor_color_supported_get()) { - s = e_path_find(path_images, "pointer.png"); - evas_object_image_file_set(o, s, NULL); - IF_FREE(s); + if (!e_theme_edje_object_set(p->evas_object, + "base/theme/pointer", + "pointer/enlightenment/default")) + { + /* error */ + printf("ERROR: No default theme for pointer!\n"); + if (!e_theme_edje_object_set(p->evas_object, + "base/theme/pointer", + "pointer/enlightenment/mono")) + { + /* error */ + printf("ERROR: No mono theme for pointer!\n"); + } + } } else { - s = e_path_find(path_images, "pointer_mono.png"); - evas_object_image_file_set(o, s, NULL); - IF_FREE(s); + if (!e_theme_edje_object_set(p->evas_object, + "base/theme/pointer", + "pointer/enlightenment/mono")) + { + /* error */ + printf("ERROR: No mono theme for pointer!\n"); + } } - evas_object_image_size_get(o, &w, &h); - pix = evas_object_image_data_get(o, 0); - cur = ecore_x_cursor_new(con->win, pix, w, h, 0, 0); - evas_object_image_data_set(o, pix); - evas_object_del(o); - ecore_x_window_cursor_set(con->manager->root, cur); - ecore_x_window_cursor_set(con->win, cur); - ecore_x_cursor_free(cur); + edje_object_calc_force(p->evas_object); + edje_object_size_min_calc(p->evas_object, &w, &h); + if ((w == 0) || (h == 0)) + { + /* error */ + printf("The size of the pointer is 0!\n"); + w = h = 10; + } + p->w = w; + p->h = h; + + /* resize evas */ + evas_output_size_set(p->evas, p->w, p->h); + evas_output_viewport_set(p->evas, 0, 0, p->w, p->h); + evas_damage_rectangle_add(p->evas, 0, 0, p->w, p->h); + + free(p->pixels); + p->pixels = calloc(p->w * p->h, sizeof(int)); + + einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(p->evas); + if (einfo) + { + einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32; + einfo->info.dest_buffer = p->pixels; + einfo->info.dest_buffer_row_bytes = p->w * sizeof(int); + einfo->info.use_color_key = 0; + einfo->info.alpha_threshold = 0; + einfo->info.func.new_update_region = NULL; + einfo->info.func.free_update_region = NULL; + evas_engine_info_set(p->evas, (Evas_Engine_Info *)einfo); + } + + /* init edje */ + evas_object_move(p->evas_object, 0, 0); + evas_object_resize(p->evas_object, p->w, p->h); + evas_object_show(p->evas_object); + + _e_pointers = evas_list_append(_e_pointers, p); + return p; } void -e_pointer_ecore_evas_set(Ecore_Evas *ee) +e_pointer_idler_before(void) { - Ecore_X_Window win; - Ecore_X_Cursor cur; - int w, h; - Evas_Object *o; - int *pix; - Evas *e; - char *s; - - e = ecore_evas_get(ee); - win = ecore_evas_software_x11_window_get(ee); - o = evas_object_image_add(e); - if (ecore_x_cursor_color_supported_get()) + Evas_List *l; + + for (l = _e_pointers; l; l = l->next) { - s = e_path_find(path_images, "pointer.png"); - evas_object_image_file_set(o, s, NULL); - IF_FREE(s); + E_Pointer *p; + Evas_List *updates; + + p = l->data; + updates = evas_render_updates(p->evas); + if (updates) + { + Ecore_X_Cursor cur; + Evas_Coord w, h; + + evas_render_updates_free(updates); + + /* TODO: Resize evas if pointer changes */ + evas_object_geometry_get(p->evas_object, NULL, NULL, &w, &h); + cur = ecore_x_cursor_new(p->win, p->pixels, p->w, p->h, 0, 0); + ecore_x_window_cursor_set(p->win, cur); + ecore_x_cursor_free(cur); + } } - else - { - s = e_path_find(path_images, "pointer_mono.png"); - evas_object_image_file_set(o, s, NULL); - IF_FREE(s); - } - evas_object_image_size_get(o, &w, &h); - pix = evas_object_image_data_get(o, 0); - cur = ecore_x_cursor_new(win, pix, w, h, 0, 0); - evas_object_image_data_set(o, pix); - evas_object_del(o); - ecore_x_window_cursor_set(win, cur); - ecore_x_cursor_free(cur); +} + +/* local subsystem functions */ +static void +_e_pointer_free(E_Pointer *p) +{ + + _e_pointers = evas_list_remove(_e_pointers, p); + + /* create evas */ + if (p->evas_object) evas_object_del(p->evas_object); + if (p->evas) evas_free(p->evas); + + free(p->pixels); + free(p); } diff --git a/src/bin/e_pointer.h b/src/bin/e_pointer.h index 9dc15597d..54f259a19 100644 --- a/src/bin/e_pointer.h +++ b/src/bin/e_pointer.h @@ -2,12 +2,30 @@ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 */ #ifdef E_TYPEDEFS + +typedef struct _E_Pointer E_Pointer; + #else #ifndef E_POINTER_H #define E_POINTER_H -EAPI void e_pointer_container_set(E_Container *con); -EAPI void e_pointer_ecore_evas_set(Ecore_Evas *ee); - +#define E_POINTER_TYPE 0xE0b01013 + +struct _E_Pointer +{ + E_Object e_obj_inherit; + + Evas *evas; + Evas_Object *evas_object; + int *pixels; + + Ecore_X_Window win; + + int w, h; +}; + +EAPI E_Pointer *e_pointer_window_set(Ecore_X_Window win); +EAPI void e_pointer_idler_before(void); + #endif #endif