Enlightenment CVS committal

Author  : sebastid
Project : e17
Module  : apps/e

Dir     : e17/apps/e/src/bin


Modified Files:
        e.h e_container.c e_container.h e_error.c e_init.c e_main.c 
        e_pointer.c e_pointer.h 


Log Message:
Themeable pointers.

===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e.h,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -3 -r1.26 -r1.27
--- e.h 13 Jul 2005 04:46:33 -0000      1.26
+++ e.h 17 Aug 2005 01:35:48 -0000      1.27
@@ -19,6 +19,7 @@
 #include <fnmatch.h>
 
 #include <Evas.h>
+#include <Evas_Engine_Buffer.h>
 #include <Ecore.h>
 #include <Ecore_X.h>
 #include <Ecore_Evas.h>
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_container.c,v
retrieving revision 1.76
retrieving revision 1.77
diff -u -3 -r1.76 -r1.77
--- e_container.c       14 Aug 2005 17:08:38 -0000      1.76
+++ e_container.c       17 Aug 2005 01:35:48 -0000      1.77
@@ -122,7 +122,8 @@
    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 @@
    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
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_container.h,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -3 -r1.27 -r1.28
--- e_container.h       31 Jul 2005 06:22:31 -0000      1.27
+++ e_container.h       17 Aug 2005 01:35:48 -0000      1.28
@@ -54,6 +54,11 @@
       Ecore_X_Window win;
       Evas_List *clients;
    } layers[7];
+
+   struct {
+       E_Pointer *root;
+       E_Pointer *win;
+   } pointer;
 };
 
 struct _E_Border_List
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_error.c,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -3 -r1.23 -r1.24
--- e_error.c   3 Jun 2005 19:10:25 -0000       1.23
+++ e_error.c   17 Aug 2005 01:35:48 -0000      1.24
@@ -61,6 +61,7 @@
    Evas_Coord   maxw, maxh;
    E_Container *con;
    Ecore_X_Window win;
+   E_Pointer   *p;
    int          x, y;
    char        *s;
 
@@ -93,7 +94,8 @@
    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 @@
 {
    Ecore_Evas *ee;
    Evas_List *shapelist, *l;
+   E_Pointer *p;
 
    ee = data;
    shapelist = ecore_evas_data_get(ee, "shapes");
@@ -428,6 +431,9 @@
      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);
 }
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_init.c,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -3 -r1.23 -r1.24
--- e_init.c    22 Jun 2005 14:09:16 -0000      1.23
+++ e_init.c    17 Aug 2005 01:35:48 -0000      1.24
@@ -13,6 +13,7 @@
 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_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 @@
    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();
 }
 
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_main.c,v
retrieving revision 1.118
retrieving revision 1.119
diff -u -3 -r1.118 -r1.119
--- e_main.c    6 Aug 2005 05:35:34 -0000       1.118
+++ e_main.c    17 Aug 2005 01:35:48 -0000      1.119
@@ -424,17 +424,6 @@
    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 @@
        _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_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;
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_pointer.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -3 -r1.5 -r1.6
--- e_pointer.c 25 May 2005 08:08:44 -0000      1.5
+++ e_pointer.c 17 Aug 2005 01:35:48 -0000      1.6
@@ -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;
+
+   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;
 
-   E_OBJECT_CHECK(E_OBJECT(con));
+   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);
-     }
-   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);
+       if (!e_theme_edje_object_set(p->evas_object,
+                                    "base/theme/pointer",
+                                    "pointer/enlightenment/mono"))
+         {
+            /* error */
+            printf("ERROR: No mono theme for pointer!\n");
+         }
+     }
+   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);
 }
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_pointer.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -3 -r1.4 -r1.5
--- e_pointer.h 7 Feb 2005 13:51:09 -0000       1.4
+++ e_pointer.h 17 Aug 2005 01:35:48 -0000      1.5
@@ -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




-------------------------------------------------------
SF.Net email is Sponsored by the Better Software Conference & EXPO
September 19-22, 2005 * San Francisco, CA * Development Lifecycle Practices
Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA
Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to