Enlightenment CVS committal

Author  : sebastid
Project : e17
Module  : apps/e

Dir     : e17/apps/e/src/bin


Modified Files:
        e_manager.c 


Log Message:
todo--

===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_manager.c,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -3 -r1.41 -r1.42
--- e_manager.c 24 Sep 2005 10:29:31 -0000      1.41
+++ e_manager.c 24 Sep 2005 12:25:03 -0000      1.42
@@ -11,6 +11,10 @@
 static int _e_manager_cb_key_down(void *data, int ev_type, void *ev);
 static int _e_manager_cb_frame_extents_request(void *data, int ev_type, void 
*ev);
 static int _e_manager_cb_ping(void *data, int ev_type, void *ev);
+
+static Evas_Bool _e_manager_frame_extents_free_cb(Evas_Hash *hash __UNUSED__,
+                                                 const char *key __UNUSED__,
+                                                 void *data, void *fdata 
__UNUSED__);
 #if 0 /* use later - maybe */
 static int _e_manager_cb_window_destroy(void *data, int ev_type, void *ev);
 static int _e_manager_cb_window_hide(void *data, int ev_type, void *ev);
@@ -27,7 +31,16 @@
 #endif
 
 /* local subsystem globals */
+
+typedef struct _Frame_Extents Frame_Extents;
+
+struct _Frame_Extents
+{
+   int l, r, t, b;
+};
+
 static Evas_List *managers = NULL;
+static Evas_Hash *frame_extents = NULL;
     
 /* externally accessible functions */
 int
@@ -46,6 +59,12 @@
        l = l->next;
        e_object_del(E_OBJECT(tmp->data));
      }
+   if (frame_extents)
+     {
+       evas_hash_foreach(frame_extents, _e_manager_frame_extents_free_cb, 
NULL);
+       evas_hash_free(frame_extents);
+       frame_extents = NULL;
+     }
    return 1;
 }
 
@@ -493,34 +512,135 @@
    E_Manager *man;
    E_Container *con;
    Ecore_X_Event_Frame_Extents_Request *e;
-   Evas_Object *o;
+   Ecore_X_Window_Type type;
+   Ecore_X_MWM_Hint_Decor decor;
+   Ecore_X_Window_State *state;
+   Frame_Extents *extents;
+   const char *border, *signal, *key;
    int ok;
+   unsigned int i, num;
    
    man = data;
    con = e_container_current_get(man);
    e = ev;
 
    if (ecore_x_window_parent_get(e->win) != man->root) return 1;
-   /* FIXME: this is definitely not perfect - we need to handle a border guess 
here */
-   o = edje_object_add(con->bg_evas);
-   ok = e_theme_edje_object_set(o, "base/theme/borders",
-                               "widgets/border/default/border");
-   if (ok)
-     {
-       Evas_Coord x, y, w, h;
-       int l, r, t, b;
-
-       evas_object_resize(o, 1000, 1000);
-       edje_object_calc_force(o);
-       edje_object_part_geometry_get(o, "client", &x, &y, &w, &h);
-       l = x;
-       r = 1000 - (x + w);
-       t = y;
-       b = 1000 - (y + h);
 
-       ecore_x_netwm_frame_size_set(e->win, l, r, t, b);
+   /* TODO:
+    * * We need to check if we remember this window, and border locking is set
+    */
+   border = "default";
+   key = border;
+   ok = ecore_x_mwm_hints_get(e->win, NULL, &decor, NULL);
+   if ((ok) &&
+       (!(decor & ECORE_X_MWM_HINT_DECOR_ALL)) &&
+       (!(decor & ECORE_X_MWM_HINT_DECOR_TITLE)) &&
+       (!(decor & ECORE_X_MWM_HINT_DECOR_BORDER)))
+     {
+       border = "borderless";
+       key = border;
+     }
+
+   ok = ecore_x_netwm_window_type_get(e->win, &type);
+   if ((ok) &&
+       ((type == ECORE_X_WINDOW_TYPE_DESKTOP) || 
+       (type == ECORE_X_WINDOW_TYPE_DOCK)))
+     {
+       border = "borderless";
+       key = border;
      }
-   evas_object_del(o);
+
+
+   signal = NULL;
+   ecore_x_netwm_window_state_get(e->win, &state, &num);
+   if (state)
+     {
+       int maximized = 0;
+       int fullscreen = 0;
+
+       for (i = 0; i < num; i++)
+         {
+            switch (state[i])
+              {
+               case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
+                 maximized++;
+                 break;
+               case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
+                 maximized++;
+                 break;
+               case ECORE_X_WINDOW_STATE_FULLSCREEN:
+                 fullscreen = 1;
+                 border = "borderless";
+                 key = border;
+                 break;
+               case ECORE_X_WINDOW_STATE_SHADED:
+               case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
+               case ECORE_X_WINDOW_STATE_SKIP_PAGER:
+               case ECORE_X_WINDOW_STATE_HIDDEN:
+               case ECORE_X_WINDOW_STATE_ICONIFIED:
+               case ECORE_X_WINDOW_STATE_MODAL:
+               case ECORE_X_WINDOW_STATE_STICKY:
+               case ECORE_X_WINDOW_STATE_ABOVE:
+               case ECORE_X_WINDOW_STATE_BELOW:
+               case ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION:
+               case ECORE_X_WINDOW_STATE_UNKNOWN:
+                 break;
+              }
+         }
+       if ((maximized == 2) &&
+           (e_config->maximize_policy == E_MAXIMIZE_FULLSCREEN))
+         {
+            signal = "maximize,fullscreen";
+            key = "maximize,fullscreen";
+         }
+       free(state);
+     }
+
+   if (frame_extents)
+     extents = evas_hash_find(frame_extents, key);
+   if (!extents)
+     {
+       extents = E_NEW(Frame_Extents, 1);
+       if (extents)
+         {
+            Evas_Object *o;
+            char buf[1024];
+
+            o = edje_object_add(con->bg_evas);
+            snprintf(buf, sizeof(buf), "widgets/border/%s/border", border);
+            ok = e_theme_edje_object_set(o, "base/theme/borders", buf);
+            if (ok)
+              {
+                 Evas_Coord x, y, w, h;
+
+                 if (signal)
+                   {
+                      edje_object_signal_emit(o, signal, "");
+                      edje_object_message_signal_process(o);
+                   }
+
+                 evas_object_resize(o, 1000, 1000);
+                 edje_object_calc_force(o);
+                 edje_object_part_geometry_get(o, "client", &x, &y, &w, &h);
+                 extents->l = x;
+                 extents->r = 1000 - (x + w);
+                 extents->t = y;
+                 extents->b = 1000 - (y + h);
+              }
+            else
+              {
+                 extents->l = 0;
+                 extents->r = 0;
+                 extents->t = 0;
+                 extents->b = 0;
+              }
+            evas_object_del(o);
+         }
+       frame_extents = evas_hash_add(frame_extents, key, extents);
+     }
+
+   if (extents)
+     ecore_x_netwm_frame_size_set(e->win, extents->l, extents->r, extents->t, 
extents->b);
 
    return 1;
 }
@@ -544,6 +664,14 @@
    return 1;
 }
 
+static Evas_Bool
+_e_manager_frame_extents_free_cb(Evas_Hash *hash __UNUSED__, const char *key 
__UNUSED__,
+                                void *data, void *fdata __UNUSED__)
+{
+   free(data);
+   return 1;
+}
+
 #if 0 /* use later - maybe */
 static int _e_manager_cb_window_destroy(void *data, int ev_type, void 
*ev){return 1;}
 static int _e_manager_cb_window_hide(void *data, int ev_type, void *ev){return 
1;}




-------------------------------------------------------
SF.Net email is sponsored by:
Tame your development challenges with Apache's Geronimo App Server. Download
it for free - -and be entered to win a 42" plasma tv or your very own
Sony(tm)PSP.  Click here to play: http://sourceforge.net/geronimo.php
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to