Enlightenment CVS committal

Author  : raster
Project : e17
Module  : apps/e

Dir     : e17/apps/e/src/bin


Modified Files:
        e_border.c e_border.h e_container.c e_container.h e_intl.c 
        e_menu.c e_menu.h 


Log Message:


start of shaped client/border/menu support ... dropshaodw is SLOW with this.

===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_border.c,v
retrieving revision 1.131
retrieving revision 1.132
diff -u -3 -r1.131 -r1.132
--- e_border.c  12 Apr 2005 09:03:57 -0000      1.131
+++ e_border.c  13 Apr 2005 15:52:33 -0000      1.132
@@ -212,6 +212,7 @@
    bd->w = 1;
    bd->h = 1;
    bd->win = ecore_x_window_override_new(bd->container->win, 0, 0, bd->w, 
bd->h);
+   ecore_x_window_shape_events_select(bd->win, 1);
    mwin = e_menu_grab_window_get();
    if (!mwin) mwin = e_init_window_get();
    if (mwin)
@@ -236,6 +237,7 @@
    bd->event_win = ecore_x_window_input_new(bd->win, 0, 0, bd->w, bd->h);
    bd->bg_evas = ecore_evas_get(bd->bg_ecore_evas);
    bd->bg_win = ecore_evas_software_x11_window_get(bd->bg_ecore_evas);
+   ecore_x_window_shape_events_select(bd->bg_win, 1);
    ecore_evas_name_class_set(bd->bg_ecore_evas, "E", "Frame_Window");
    ecore_evas_title_set(bd->bg_ecore_evas, "Enlightenment Frame");
    bd->client.shell_win = ecore_x_window_override_new(bd->win, 0, 0, 1, 1);
@@ -298,6 +300,7 @@
    bd->w = bd->client.w;
    bd->h = bd->client.h;
    bd->changes.size = 1;
+   bd->changes.shape = 1;
 
    printf("##- ON MAP CLIENT 0x%x SIZE %ix%i\n",
          bd->client.win, bd->client.w, bd->client.h);
@@ -1059,6 +1062,36 @@
 }
 
 E_Border *
+e_border_find_by_frame_window(Ecore_X_Window win)
+{
+   Evas_List *l;
+
+   for (l = borders; l; l = l->next)
+     {
+       E_Border *bd;
+
+       bd = l->data;
+       if (bd->bg_win == win) return bd;
+     }
+   return NULL;
+}
+
+E_Border *
+e_border_find_by_window(Ecore_X_Window win)
+{
+   Evas_List *l;
+
+   for (l = borders; l; l = l->next)
+     {
+       E_Border *bd;
+
+       bd = l->data;
+       if (bd->win == win) return bd;
+     }
+   return NULL;
+}
+
+E_Border *
 e_border_focused_get(void)
 {
    return focused;
@@ -1543,7 +1576,26 @@
 
    e = ev;
    bd = e_border_find_by_client_window(e->win);
-   if (!bd) return 1;
+   if (bd)
+     {
+       bd->changes.shape = 1;
+       bd->changed = 1;
+       return 1;
+     }
+   bd = e_border_find_by_window(e->win);
+   if (bd)
+     {
+       bd->need_shape_export = 1;
+       bd->changed = 1;
+       return 1;
+     }
+   bd = e_border_find_by_frame_window(e->win);
+   if (bd)
+     {
+       bd->need_shape_merge = 1;
+       bd->changed = 1;
+       return 1;
+     }
    return 1;
 }
 
@@ -2518,6 +2570,39 @@
        bd->client.netwm.fetch.desktop = 0;
      }
 
+   if (bd->changes.shape)
+     {
+       Ecore_X_Rectangle *rects;
+       int num;
+       
+       rects = ecore_x_window_shape_rectangles_get(bd->client.win, &num);
+       if (rects)
+         {
+            if ((num == 1) &&
+                (rects[0].x == 0) &&
+                (rects[0].y == 0) &&
+                (rects[0].width == bd->client.w) &&
+                (rects[0].height == bd->client.h))
+              {
+                 if (bd->client.shaped)
+                   {
+                      bd->client.shaped = 0;
+                   }
+              }
+            else
+              {
+                 if (!bd->client.shaped)
+                   {
+                      bd->client.shaped = 1;
+                   }
+              }
+            free(rects);
+         }
+       bd->need_shape_merge = 1;
+       /* is the client shaped? */
+       bd->changes.shape = 0;
+     }
+
    if (bd->client.border.changed)
      {
        Evas_Object *o;
@@ -2551,6 +2636,37 @@
         ok = edje_object_file_set(o, path, buf);
        if (ok)
          {
+            const char *shape_option;
+            
+            shape_option = edje_object_data_get(o, "shaped");
+            if (shape_option)
+              {
+                 if (!strcmp(shape_option, "1"))
+                   {
+                      if (!bd->shaped)
+                        {
+                           bd->shaped = 1;
+                           ecore_evas_shaped_set(bd->bg_ecore_evas, 
bd->shaped);
+                        }
+                   }
+                 else
+                   {
+                      if (bd->shaped)
+                        {
+                           bd->shaped = 0;
+                           ecore_evas_shaped_set(bd->bg_ecore_evas, 
bd->shaped);
+                        }
+                   }
+              }
+            else
+              {
+                 if (bd->shaped)
+                   {
+                      bd->shaped = 0;
+                      ecore_evas_shaped_set(bd->bg_ecore_evas, bd->shaped);
+                   }
+              }
+            
             edje_object_part_text_set(o, "title_text",
 //                                    "Japanese (hiragana): 
いろはにほへとちりぬるを");
                                       bd->client.icccm.title);
@@ -2926,6 +3042,68 @@
        GRAV_SET(bd, ECORE_X_GRAVITY_NW);
        bd->changes.reset_gravity = 0;
      }
+   
+   if (bd->need_shape_merge)
+     {
+       if ((bd->shaped) || (bd->client.shaped))
+         {
+            Ecore_X_Window twin;
+            
+            twin = ecore_x_window_override_new(bd->win, 0, 0, bd->w, bd->h);
+            if (bd->shaped)
+              {
+                 ecore_x_window_shape_window_set(twin, bd->bg_win);
+              }
+            else
+              {
+                 Ecore_X_Rectangle rects[4];
+                 
+                 rects[0].x      = 0;
+                 rects[0].y      = 0;
+                 rects[0].width  = bd->w;
+                 rects[0].height = bd->client_inset.t;
+                 rects[1].x      = 0;
+                 rects[1].y      = bd->client_inset.t;
+                 rects[1].width  = bd->client_inset.l;
+                 rects[1].height = bd->client.h;
+                 rects[2].x      = bd->w - bd->client_inset.r;
+                 rects[2].y      = bd->client_inset.t;
+                 rects[2].width  = bd->client_inset.r;
+                 rects[2].height = bd->client.h;
+                 rects[3].x      = 0;
+                 rects[3].y      = bd->h - bd->client_inset.b;
+                 rects[3].width  = bd->w;
+                 rects[3].height = bd->client_inset.b;
+                 ecore_x_window_shape_rectangles_set(twin, rects, 4);
+              }
+            ecore_x_window_shape_window_add_xy(twin, bd->client.win, 
bd->client_inset.l, bd->client_inset.t);
+            ecore_x_window_shape_window_set(bd->win, twin);
+            ecore_x_window_del(twin);
+         }
+       else
+         {
+            ecore_x_window_shape_mask_set(bd->win, 0);
+         }
+       bd->need_shape_merge = 0;
+     }
+   
+   if (bd->need_shape_export)
+     {
+       Ecore_X_Rectangle *rects;
+       int num;
+       
+       rects = ecore_x_window_shape_rectangles_get(bd->win, &num);
+       if (rects)
+         {
+            if (bd->client.shaped)
+              e_container_shape_solid_rect_set(bd->shape, 0, 0, 0, 0);
+            else
+              e_container_shape_solid_rect_set(bd->shape, bd->client_inset.l, 
bd->client_inset.t, bd->client.w, bd->client.h);
+            e_container_shape_rects_set(bd->shape, rects, num);
+            free(rects);
+         }
+       bd->need_shape_export = 0;
+     }
 
    bd->changed = 0;
 
@@ -3705,3 +3883,4 @@
        borders = evas_list_prepend(borders, bd);
      }
 }
+
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_border.h,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -3 -r1.32 -r1.33
--- e_border.h  20 Mar 2005 11:49:32 -0000      1.32
+++ e_border.h  13 Apr 2005 15:52:33 -0000      1.33
@@ -71,7 +71,7 @@
    Evas_List      *handlers;
 
    struct {
-       int          l, r, t, b;
+      int          l, r, t, b;
    } client_inset;
 
    Ecore_Evas     *bg_ecore_evas;
@@ -80,88 +80,90 @@
    Evas_Object    *bg_object;
    Evas_Object    *icon_object;
    Ecore_X_Window  event_win;
-
+   
    struct {
-       Ecore_X_Window shell_win;
-       Ecore_X_Window win;
-
-       int x, y, w, h;
-
-       struct {
-            unsigned char changed : 1;
-            char *name;
-       } border;
-
-       struct {
-            char *title;
-            char *name;
-            char *class;
-            char *icon_name;
-            char *machine;
-            int min_w, min_h;
-            int max_w, max_h;
-            int base_w, base_h;
-            int step_w, step_h;
-            int start_x, start_y;
-            double min_aspect, max_aspect;
-            Ecore_X_Window_State_Hint initial_state;
-            Ecore_X_Pixmap icon_pixmap;
-            Ecore_X_Pixmap icon_mask;
-            Ecore_X_Window icon_window;
-            Ecore_X_Window window_group;
-            Ecore_X_Gravity gravity;
-            unsigned char take_focus : 1;
-            unsigned char accepts_focus : 1;
-            unsigned char urgent : 1;
-            unsigned char delete_request : 1;
-            unsigned char withdrawn : 1;
-            unsigned char iconic : 1;
-            unsigned char request_pos : 1;
-            struct {
-                 unsigned int title : 1;
-                 unsigned int name_class : 1;
-                 unsigned int icon_name : 1;
-                 unsigned int machine : 1;
-                 unsigned int hints : 1;
-                 unsigned int size_pos_hints : 1;
-                 unsigned int protocol : 1;
-            } fetch;
-       } icccm;
-       struct {
-            Ecore_X_MWM_Hint_Func func;
-            Ecore_X_MWM_Hint_Decor decor;
-            Ecore_X_MWM_Hint_Input input;
-            unsigned char exists : 1;
-            unsigned char borderless : 1;
-            struct {
-                 unsigned int hints : 1;
-            } fetch;
-       } mwm;
-       struct {
-            pid_t pid;
-            int desktop;
-            struct {
-                 unsigned int pid : 1;
-                 unsigned int desktop : 1;
-            } fetch;
-
-            /* NetWM Window state */
-            struct {
-                 unsigned char modal : 1;
-                 unsigned char maximized_v : 1;
-                 unsigned char maximized_h : 1;
-                 unsigned char skip_taskbar : 1;
-                 unsigned char skip_pager : 1;
-                 unsigned char fullscreen : 1;
-                 unsigned char stacking : 2; /* 0 = None, 1 = Above, 2 = Below 
*/
-            } state;
-
-       } netwm;
-       Ecore_X_Window_Attributes initial_attributes;
+      Ecore_X_Window shell_win;
+      Ecore_X_Window win;
+      
+      int x, y, w, h;
+      
+      struct {
+        unsigned char changed : 1;
+        char *name;
+      } border;
+      
+      unsigned char shaped : 1;
+      
+      struct {
+        char *title;
+        char *name;
+        char *class;
+        char *icon_name;
+        char *machine;
+        int min_w, min_h;
+        int max_w, max_h;
+        int base_w, base_h;
+        int step_w, step_h;
+        int start_x, start_y;
+        double min_aspect, max_aspect;
+        Ecore_X_Window_State_Hint initial_state;
+        Ecore_X_Pixmap icon_pixmap;
+        Ecore_X_Pixmap icon_mask;
+        Ecore_X_Window icon_window;
+        Ecore_X_Window window_group;
+        Ecore_X_Gravity gravity;
+        unsigned char take_focus : 1;
+        unsigned char accepts_focus : 1;
+        unsigned char urgent : 1;
+        unsigned char delete_request : 1;
+        unsigned char withdrawn : 1;
+        unsigned char iconic : 1;
+        unsigned char request_pos : 1;
+        struct {
+           unsigned int title : 1;
+           unsigned int name_class : 1;
+           unsigned int icon_name : 1;
+           unsigned int machine : 1;
+           unsigned int hints : 1;
+           unsigned int size_pos_hints : 1;
+           unsigned int protocol : 1;
+        } fetch;
+      } icccm;
+      struct {
+        Ecore_X_MWM_Hint_Func func;
+        Ecore_X_MWM_Hint_Decor decor;
+        Ecore_X_MWM_Hint_Input input;
+        unsigned char exists : 1;
+        unsigned char borderless : 1;
+        struct {
+           unsigned int hints : 1;
+        } fetch;
+      } mwm;
+      struct {
+        pid_t pid;
+        int desktop;
+        struct {
+           unsigned int pid : 1;
+           unsigned int desktop : 1;
+        } fetch;
+        
+        /* NetWM Window state */
+        struct {
+           unsigned char modal : 1;
+           unsigned char maximized_v : 1;
+           unsigned char maximized_h : 1;
+           unsigned char skip_taskbar : 1;
+           unsigned char skip_pager : 1;
+           unsigned char fullscreen : 1;
+           unsigned char stacking : 2; /* 0 = None, 1 = Above, 2 = Below */
+        } state;
+        
+      } netwm;
+      Ecore_X_Window_Attributes initial_attributes;
    } client;
-
+   
    E_Container_Shape *shape;
-
+   
    unsigned char   visible : 1;
    unsigned char   moving : 1;
    unsigned char   focused : 1;
@@ -172,38 +174,42 @@
    unsigned char   maximized : 1;
    unsigned char   iconic : 1;
    unsigned char   sticky : 1;
-
+   unsigned char   shaped : 1;
+   unsigned char   need_shape_merge : 1;
+   unsigned char   need_shape_export : 1;
+   
    unsigned char   changed : 1;
-
+   
    unsigned char   ignore_first_unmap;
    unsigned char   resize_mode;
-
+   
    struct {
-       int x, y, w, h;
+      int x, y, w, h;
    } saved;
 
    struct {
-       double start;
-       double val;
-       int x, y;
-       E_Direction dir;
-       Ecore_Animator *anim;
+      double start;
+      double val;
+      int x, y;
+      E_Direction dir;
+      Ecore_Animator *anim;
    } shade;
-
+   
    Evas_List *stick_desks;
    E_Menu *border_menu;
    Evas_List *pending_move_resize;
-
+   
    struct {
-       unsigned int visible : 1;
-       unsigned int pos : 1;
-       unsigned int size : 1;
-       unsigned int stack : 1;
-       unsigned int prop : 1;
-       unsigned int border : 1;
-       unsigned int reset_gravity : 1;
-       unsigned int shading : 1;
-       unsigned int shaded : 1;
+      unsigned int visible : 1;
+      unsigned int pos : 1;
+      unsigned int size : 1;
+      unsigned int stack : 1;
+      unsigned int prop : 1;
+      unsigned int border : 1;
+      unsigned int reset_gravity : 1;
+      unsigned int shading : 1;
+      unsigned int shaded : 1;
+      unsigned int shape : 1;
    } changes;
 };
 
@@ -321,6 +327,8 @@
 EAPI void      e_border_unstick(E_Border *bd);
 
 EAPI E_Border *e_border_find_by_client_window(Ecore_X_Window win);
+EAPI E_Border *e_border_find_by_frame_window(Ecore_X_Window win);
+EAPI E_Border *e_border_find_by_window(Ecore_X_Window win);
 EAPI E_Border *e_border_focused_get(void);
 
 EAPI void      e_border_idler_before(void);
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_container.c,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -3 -r1.36 -r1.37
--- e_container.c       31 Mar 2005 16:52:12 -0000      1.36
+++ e_container.c       13 Apr 2005 15:52:33 -0000      1.37
@@ -394,8 +394,59 @@
    return es->shape;
 }
 
+void
+e_container_shape_rects_set(E_Container_Shape *es, Ecore_X_Rectangle *rects, 
int num)
+{
+   Evas_List *l;
+   int i;
+   
+   E_OBJECT_CHECK(es);
+   E_OBJECT_TYPE_CHECK(es, E_CONTAINER_SHAPE_TYPE);
+   
+   if (es->shape)
+     {
+       for (l = es->shape; l; l = l->next)
+         free(l->data);
+       evas_list_free(es->shape);
+       es->shape = NULL;
+     }
+   if (rects)
+     {
+       for (i = 0; i < num; i++)
+         {
+            E_Rect *r;
+            
+            r = malloc(sizeof(E_Rect));
+            if (r)
+              {
+                 r->x = rects[i].x;
+                 r->y = rects[i].y;
+                 r->w = rects[i].width;
+                 r->h = rects[i].height;
+                 es->shape = evas_list_append(es->shape, r);
+              }
+         }
+     }
+   _e_container_shape_change_call(es, E_CONTAINER_SHAPE_RECTS);
+}
 
+void
+e_container_shape_solid_rect_set(E_Container_Shape *es, int x, int y, int w, 
int h)
+{
+   es->solid_rect.x = x;
+   es->solid_rect.y = y;
+   es->solid_rect.w = w;
+   es->solid_rect.h = h;
+}
 
+void
+e_container_shape_solid_rect_get(E_Container_Shape *es, int *x, int *y, int 
*w, int *h)
+{
+   if (x) *x = es->solid_rect.x;
+   if (y) *y = es->solid_rect.y;
+   if (w) *w = es->solid_rect.w;
+   if (h) *h = es->solid_rect.h;
+}
 
 /* local subsystem functions */
 static void
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_container.h,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -3 -r1.15 -r1.16
--- e_container.h       15 Mar 2005 10:25:48 -0000      1.15
+++ e_container.h       13 Apr 2005 15:52:33 -0000      1.16
@@ -57,6 +57,9 @@
    E_Container   *con;
    int            x, y, w, h;
    unsigned char  visible : 1;
+   struct {
+      int x, y, w, h;
+   } solid_rect;
    Evas_List     *shape;
 };
 
@@ -98,6 +101,9 @@
 EAPI void               e_container_shape_change_callback_add(E_Container 
*con, void (*func) (void *data, E_Container_Shape *es, E_Container_Shape_Change 
ch), void *data);
 EAPI void               e_container_shape_change_callback_del(E_Container 
*con, void (*func) (void *data, E_Container_Shape *es, E_Container_Shape_Change 
ch), void *data);
 EAPI Evas_List         *e_container_shape_rects_get(E_Container_Shape *es);
+EAPI void               e_container_shape_rects_set(E_Container_Shape *es, 
Ecore_X_Rectangle *rects, int num);
+EAPI void               e_container_shape_solid_rect_set(E_Container_Shape 
*es, int x, int y, int w, int h);
+EAPI void               e_container_shape_solid_rect_get(E_Container_Shape 
*es, int *x, int *y, int *w, int *h);
 
 extern EAPI int E_EVENT_CONTAINER_RESIZE;
 
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_intl.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -3 -r1.8 -r1.9
--- e_intl.c    13 Apr 2005 05:59:46 -0000      1.8
+++ e_intl.c    13 Apr 2005 15:52:33 -0000      1.9
@@ -38,10 +38,7 @@
    free(_e_intl_language);
    _e_intl_language = NULL;
    while (_e_intl_languages)
-     {
-       free(_e_intl_languages->data);
-       _e_intl_languages = evas_list_remove_list(_e_intl_languages, 
_e_intl_languages);
-     }
+     _e_intl_languages = evas_list_remove_list(_e_intl_languages, 
_e_intl_languages);
    return 1;
 }
 
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_menu.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -3 -r1.15 -r1.16
--- e_menu.c    31 Mar 2005 15:38:26 -0000      1.15
+++ e_menu.c    13 Apr 2005 15:52:33 -0000      1.16
@@ -65,6 +65,7 @@
 static int  _e_menu_cb_mouse_move                 (void *data, int type, void 
*event);
 static int  _e_menu_cb_mouse_wheel                (void *data, int type, void 
*event);
 static int  _e_menu_cb_scroll_timer               (void *data);
+static int  _e_menu_cb_window_shape               (void *data, int ev_type, 
void *ev);
 
 /* local subsystem globals */
 static Ecore_X_Window       _e_menu_win                 = 0;
@@ -77,23 +78,25 @@
 static Ecore_X_Time         _e_menu_time                = 0;
 static int                  _e_menu_autoscroll_x        = 0;
 static int                  _e_menu_autoscroll_y        = 0;
-static Ecore_Event_Handler *_e_menu_key_down_handler    = NULL;
-static Ecore_Event_Handler *_e_menu_key_up_handler      = NULL;
-static Ecore_Event_Handler *_e_menu_mouse_down_handler  = NULL;
-static Ecore_Event_Handler *_e_menu_mouse_up_handler    = NULL;
-static Ecore_Event_Handler *_e_menu_mouse_move_handler  = NULL;
-static Ecore_Event_Handler *_e_menu_mouse_wheel_handler = NULL;
+static Ecore_Event_Handler *_e_menu_key_down_handler     = NULL;
+static Ecore_Event_Handler *_e_menu_key_up_handler       = NULL;
+static Ecore_Event_Handler *_e_menu_mouse_down_handler   = NULL;
+static Ecore_Event_Handler *_e_menu_mouse_up_handler     = NULL;
+static Ecore_Event_Handler *_e_menu_mouse_move_handler   = NULL;
+static Ecore_Event_Handler *_e_menu_mouse_wheel_handler  = NULL;
+static Ecore_Event_Handler *_e_menu_window_shape_handler = NULL;
 
 /* externally accessible functions */
 int
 e_menu_init(void)
 {
-   _e_menu_key_down_handler    = 
ecore_event_handler_add(ECORE_X_EVENT_KEY_DOWN,          _e_menu_cb_key_down,   
 NULL);
-   _e_menu_key_up_handler      = ecore_event_handler_add(ECORE_X_EVENT_KEY_UP, 
           _e_menu_cb_key_up,      NULL);
-   _e_menu_mouse_down_handler  = 
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_DOWN, _e_menu_cb_mouse_down, 
 NULL);
-   _e_menu_mouse_up_handler    = 
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_UP,   _e_menu_cb_mouse_up,   
 NULL);
-   _e_menu_mouse_move_handler  = 
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_MOVE,        _e_menu_cb_mouse_move, 
 NULL);
-   _e_menu_mouse_wheel_handler = 
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_WHEEL,       
_e_menu_cb_mouse_wheel, NULL);
+   _e_menu_key_down_handler     = 
ecore_event_handler_add(ECORE_X_EVENT_KEY_DOWN,          _e_menu_cb_key_down,   
 NULL);
+   _e_menu_key_up_handler       = 
ecore_event_handler_add(ECORE_X_EVENT_KEY_UP,            _e_menu_cb_key_up,     
 NULL);
+   _e_menu_mouse_down_handler   = 
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_DOWN, _e_menu_cb_mouse_down, 
 NULL);
+   _e_menu_mouse_up_handler     = 
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_UP,   _e_menu_cb_mouse_up,   
 NULL);
+   _e_menu_mouse_move_handler   = 
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_MOVE,        _e_menu_cb_mouse_move, 
 NULL);
+   _e_menu_mouse_wheel_handler  = 
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_WHEEL,       
_e_menu_cb_mouse_wheel, NULL);
+   _e_menu_window_shape_handler = 
ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHAPE,     
_e_menu_cb_window_shape, NULL);
    return 1;
 }
 
@@ -104,9 +107,9 @@
    E_FN_DEL(ecore_event_handler_del, _e_menu_key_up_handler);
    E_FN_DEL(ecore_event_handler_del, _e_menu_mouse_down_handler);
    E_FN_DEL(ecore_event_handler_del, _e_menu_mouse_up_handler);
-
    E_FN_DEL(ecore_event_handler_del, _e_menu_mouse_move_handler);
    E_FN_DEL(ecore_event_handler_del, _e_menu_mouse_wheel_handler);
+   E_FN_DEL(ecore_event_handler_del, _e_menu_window_shape_handler);
 
    while (_e_active_menus)
      {
@@ -611,7 +614,8 @@
             m->prev.visible = m->cur.visible;
             ecore_evas_raise(m->ecore_evas);
             ecore_evas_show(m->ecore_evas);
-            e_container_shape_show(m->shape);
+            if (!m->shaped)
+              e_container_shape_show(m->shape);
          }
      }
    /* phase 4. de-activate... */
@@ -639,6 +643,28 @@
             e_object_unref(E_OBJECT(m));
          }
      }
+   /* phase 5. shapes... */
+   for (l = _e_active_menus; l; l = l->next)
+     {
+       E_Menu *m;
+       
+       m = l->data;
+       if (m->need_shape_export)
+         {
+            Ecore_X_Rectangle *rects;
+            int num;
+            
+            rects = ecore_x_window_shape_rectangles_get(m->evas_win, &num);
+            if (rects)
+              {
+                 e_container_shape_rects_set(m->shape, rects, num);
+                 free(rects);
+              }
+            m->need_shape_export = 0;
+            if (m->cur.visible)
+              e_container_shape_show(m->shape);
+         }
+     }
    /* del refcount to all menus we worked with */
    while (tmp)
      {
@@ -981,6 +1007,7 @@
 {
    Evas_Object *o;
    Evas_List *l;
+   int ok;
    
    if (m->realized) return;
    m->realized = 1;
@@ -999,6 +1026,7 @@
    evas_event_feed_mouse_in(m->evas, NULL);
    evas_event_feed_mouse_move(m->evas, -1000000, -1000000, NULL);
    m->evas_win = ecore_evas_software_x11_window_get(m->ecore_evas);
+   ecore_x_window_shape_events_select(m->evas_win, 1);
    ecore_evas_name_class_set(m->ecore_evas, "E", "_e_menu_window");
    ecore_evas_title_set(m->ecore_evas, "E Menu");
    
@@ -1008,12 +1036,28 @@
    evas_object_data_set(o, "e_menu", m);
    evas_object_move(o, 0, 0);
    evas_object_resize(o, m->cur.w, m->cur.h);
-   edje_object_file_set(o,
-                       /* FIXME: "default.edj" needs to come from conf */
-                       e_path_find(path_themes, "default.edj"),
-                       "widgets/menu/default/background");
+   ok = edje_object_file_set(o,
+                            /* FIXME: "default.edj" needs to come from conf */
+                            e_path_find(path_themes, "default.edj"),
+                            "widgets/menu/default/background");
+   if (ok)
+     {
+       const char *shape_option;
+       
+       shape_option = edje_object_data_get(o, "shaped");
+       if (shape_option)
+         {
+            if (!strcmp(shape_option, "1"))
+              {
+                 m->shaped = 1;
+              }
+         }
+     }
    evas_object_show(o);
 
+   if (m->shaped)
+     ecore_evas_shaped_set(m->ecore_evas, m->shaped);
+   
    o = e_box_add(m->evas);
    m->container_object = o;
    evas_object_intercept_move_callback_add  (o, 
_e_menu_cb_intercept_container_move,   m);
@@ -2123,3 +2167,21 @@
      }
    return 1;
 }
+
+static int
+_e_menu_cb_window_shape(void *data, int ev_type, void *ev)
+{
+   Evas_List *l;
+   Ecore_X_Event_Window_Shape *e;
+   
+   e = ev;
+   for (l = _e_active_menus; l; l = l->next)
+     {
+       E_Menu *m;
+       
+       m = l->data;
+       if (m->evas_win == e->win)
+         m->need_shape_export = 1;
+     }
+   return 1;
+}
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_menu.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -3 -r1.9 -r1.10
--- e_menu.h    7 Feb 2005 13:51:09 -0000       1.9
+++ e_menu.h    13 Apr 2005 15:52:33 -0000      1.10
@@ -68,6 +68,8 @@
    unsigned char        pending_new_submenu : 1;
    unsigned char        have_submenu : 1;
    unsigned char        in_active_list : 1;
+   unsigned char        shaped : 1;
+   unsigned char        need_shape_export : 1;
 };
 
 struct _E_Menu_Item




-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to