extra ecore_x and ecore_evas features for e17.. :)
authorCarsten Haitzler <raster@rasterman.com>
Tue, 23 Nov 2004 15:17:56 +0000 (15:17 +0000)
committerCarsten Haitzler <raster@rasterman.com>
Tue, 23 Nov 2004 15:17:56 +0000 (15:17 +0000)
SVN revision: 12241

12 files changed:
legacy/ecore/src/lib/ecore/ecore.c
legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h
legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h
legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c
legacy/ecore/src/lib/ecore_txt/ecore_txt.c
legacy/ecore/src/lib/ecore_x/Ecore_X.h
legacy/ecore/src/lib/ecore_x/ecore_x_dnd.c
legacy/ecore/src/lib/ecore_x/ecore_x_events.c
legacy/ecore/src/lib/ecore_x/ecore_x_icccm.c
legacy/ecore/src/lib/ecore_x/ecore_x_private.h
legacy/ecore/src/lib/ecore_x/ecore_x_selection.c
legacy/ecore/src/lib/ecore_x/ecore_x_window.c

index 23c4aaa..26b0c58 100644 (file)
@@ -1,5 +1,7 @@
 #include "ecore_private.h"
 #include "Ecore.h"
+#include <locale.h>
+#include <langinfo.h>
 
 static const char *_ecore_magic_string_get(Ecore_Magic m);
 static int _ecore_init_count = 0;
@@ -35,6 +37,11 @@ ecore_init(void)
 {
    if (++_ecore_init_count == 1)
      {
+       setlocale(LC_CTYPE, "");
+       if (strcmp(nl_langinfo(CODESET), "UTF-8"))
+         {
+            printf("WARNING: not a utf8 locale!\n");
+         }
 #ifndef WIN32
        if (getenv("ECORE_FPS_DEBUG")) _ecore_fps_debug = 1;
        if (_ecore_fps_debug) _ecore_fps_debug_init();
index bd38f46..a20de6a 100644 (file)
@@ -58,9 +58,15 @@ int         ecore_evas_shutdown(void);
 /* engine/target specific init calls */
 Ecore_Evas     *ecore_evas_software_x11_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h);
 Ecore_X_Window  ecore_evas_software_x11_window_get(Ecore_Evas *ee);
+Ecore_X_Window  ecore_evas_software_x11_subwindow_get(Ecore_Evas *ee);
+void            ecore_evas_software_x11_direct_resize_set(Ecore_Evas *ee, int on);
+int             ecore_evas_software_x11_direct_resize_get(Ecore_Evas *ee);
    
 Ecore_Evas     *ecore_evas_gl_x11_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h);
 Ecore_X_Window  ecore_evas_gl_x11_window_get(Ecore_Evas *ee);
+Ecore_X_Window  ecore_evas_gl_x11_subwindow_get(Ecore_Evas *ee);
+void            ecore_evas_gl_x11_direct_resize_set(Ecore_Evas *ee, int on);
+int             ecore_evas_gl_x11_direct_resize_get(Ecore_Evas *ee);
 
 Ecore_Evas     *ecore_evas_fb_new(char *disp_name, int rotation, int w, int h);
 
index e05d019..1eae253 100644 (file)
@@ -85,6 +85,7 @@ struct _Ecore_Evas_Engine
       Ecore_X_Pixmap mask;
       Ecore_X_GC     gc;
       Region         damages;
+      unsigned char  direct_resize : 1;
    } x;
 #endif   
 #ifdef BUILD_ECORE_EVAS_FB
index e1995e9..4616cca 100644 (file)
@@ -356,7 +356,7 @@ _ecore_evas_event_window_configure(void *data, int type, void *event)
        ee->w = e->w;
        ee->h = e->h;
        if (e->win == ee->engine.x.win_container)
-         ecore_x_window_resize(ee->engine.x.win, ee->w, ee->h);
+         ecore_x_window_move_resize(ee->engine.x.win, 0, 0, ee->w, ee->h);
        if ((ee->rotation == 90) || (ee->rotation == 270))
          {
             evas_output_size_set(ee->evas, ee->h, ee->w);
@@ -618,12 +618,70 @@ static void
 _ecore_evas_resize(Ecore_Evas *ee, int w, int h)
 {
    ecore_x_window_resize(ee->engine.x.win_container, w, h);
+   if (ee->engine.x.direct_resize)
+     {
+       ecore_x_window_move_resize(ee->engine.x.win, 0, 0, w, h);
+       if ((ee->w != w) || (ee->h != h))
+         {
+            ee->w = w;
+            ee->h = h;
+            if ((ee->rotation == 90) || (ee->rotation == 270))
+              {
+                 evas_output_size_set(ee->evas, ee->h, ee->w);
+                 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
+              }
+            else
+              {
+                 evas_output_size_set(ee->evas, ee->w, ee->h);
+                 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
+              }
+            if (ee->prop.avoid_damage)
+              {
+                 ecore_evas_avoid_damage_set(ee, 0);
+                 ecore_evas_avoid_damage_set(ee, 1);
+              }
+            if (ee->shaped)
+              {
+                 ecore_evas_shaped_set(ee, 0);
+                 ecore_evas_shaped_set(ee, 1);
+              }
+         }
+     }
 }
 
 static void
 _ecore_evas_move_resize(Ecore_Evas *ee, int x, int y, int w, int h)
 {
    ecore_x_window_move_resize(ee->engine.x.win_container, x, y, w, h);
+   if (ee->engine.x.direct_resize)
+     {
+       ecore_x_window_move_resize(ee->engine.x.win, 0, 0, w, h);
+       if ((ee->w != w) || (ee->h != h))
+         {
+            ee->w = w;
+            ee->h = h;
+            if ((ee->rotation == 90) || (ee->rotation == 270))
+              {
+                 evas_output_size_set(ee->evas, ee->h, ee->w);
+                 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
+              }
+            else
+              {
+                 evas_output_size_set(ee->evas, ee->w, ee->h);
+                 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
+              }
+            if (ee->prop.avoid_damage)
+              {
+                 ecore_evas_avoid_damage_set(ee, 0);
+                 ecore_evas_avoid_damage_set(ee, 1);
+              }
+            if (ee->shaped)
+              {
+                 ecore_evas_shaped_set(ee, 0);
+                 ecore_evas_shaped_set(ee, 1);
+              }
+         }
+     }
 }
 
 static void
@@ -965,7 +1023,7 @@ _ecore_evas_fullscreen_set(Ecore_Evas *ee, int on)
        int rw, rh;
        
        ecore_x_window_size_get(0, &rw, &rh);
-       ecore_x_window_resize(ee->engine.x.win, rw, rh);
+       ecore_x_window_move_resize(ee->engine.x.win, 0, 0, rw, rh);
        ecore_x_window_reparent(ee->engine.x.win, 0, 0, 0);
        ecore_x_window_raise(ee->engine.x.win);
        ecore_x_window_show(ee->engine.x.win);
@@ -988,13 +1046,13 @@ _ecore_evas_fullscreen_set(Ecore_Evas *ee, int on)
        
        ecore_x_window_size_get(ee->engine.x.win_container, &pw, &ph);
        ecore_x_window_reparent(ee->engine.x.win, ee->engine.x.win_container, 0, 0);
-       ecore_x_window_resize(ee->engine.x.win, pw, ph);
+       ecore_x_window_move_resize(ee->engine.x.win, 0, 0, pw, ph);
        ecore_x_window_shape_mask_set(ee->engine.x.win, 0);
        if (ee->should_be_visible) ecore_x_window_show(ee->engine.x.win_container);
        ee->w = pw;
        ee->h = ph;
      }
-   ecore_x_window_resize(ee->engine.x.win, ee->w, ee->h);
+   ecore_x_window_move_resize(ee->engine.x.win, 0, 0, ee->w, ee->h);
    if ((ee->rotation == 90) || (ee->rotation == 270))
      {
        evas_output_size_set(ee->evas, ee->h, ee->w);
@@ -1250,6 +1308,56 @@ ecore_evas_software_x11_window_get(Ecore_Evas *ee)
 #endif   
 }
 
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ */
+Ecore_X_Window
+ecore_evas_software_x11_subwindow_get(Ecore_Evas *ee)
+{
+#ifdef BUILD_ECORE_X
+   return ee->engine.x.win;
+#else
+   return 0;
+#endif   
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ */
+void
+ecore_evas_software_x11_direct_resize_set(Ecore_Evas *ee, int on)
+{
+#ifdef BUILD_ECORE_X
+   ee->engine.x.direct_resize = on;
+#else
+   return;
+#endif   
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ */
+int
+ecore_evas_software_x11_direct_resize_get(Ecore_Evas *ee)
+{
+#ifdef BUILD_ECORE_X
+   return ee->engine.x.direct_resize;
+#else
+   return 0;
+#endif   
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ */
 Ecore_Evas *
 ecore_evas_gl_x11_new(const char *disp_name, Ecore_X_Window parent, 
                      int x, int y, int w, int h)
@@ -1390,3 +1498,49 @@ ecore_evas_gl_x11_window_get(Ecore_Evas *ee)
    return 0;
 #endif
 }
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ */
+Ecore_X_Window
+ecore_evas_gl_x11_subwindow_get(Ecore_Evas *ee)
+{
+#ifdef BUILD_ECORE_X
+   return ee->engine.x.win;
+#else
+   return 0;
+#endif   
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ */
+void
+ecore_evas_gl_x11_direct_resize_set(Ecore_Evas *ee, int on)
+{
+#ifdef BUILD_ECORE_X
+   ee->engine.x.direct_resize = on;
+#else
+   return;
+#endif   
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ */
+int
+ecore_evas_gl_x11_direct_resize_get(Ecore_Evas *ee)
+{
+#ifdef BUILD_ECORE_X
+   return ee->engine.x.direct_resize;
+#else
+   return 0;
+#endif   
+}
+
index d24fd4f..34701c2 100644 (file)
@@ -59,6 +59,12 @@ ecore_txt_convert(char *enc_from, char *enc_to, char *text)
                  new_txt = NULL;
                  break;
               }
+            else
+              {
+                 if (new_txt) free(new_txt);
+                 new_txt = NULL;
+                 break;
+              }
          }
        if (inb == 0)
          {
index a5a28b3..660bc1f 100644 (file)
@@ -105,7 +105,22 @@ typedef enum _Ecore_X_Event_Mask
    ECORE_X_EVENT_MASK_WINDOW_FOCUS_IN        = (1L << 30),
    ECORE_X_EVENT_MASK_WINDOW_FOCUS_OUT       = (1L << 31)
 } Ecore_X_Event_Mask;
-   
+
+   typedef enum _Ecore_X_Gravity {
+      ECORE_X_GRAVITY_FORGET = 0,
+       ECORE_X_GRAVITY_UNMAP = 0,
+       ECORE_X_GRAVITY_NW = 1,
+       ECORE_X_GRAVITY_N = 2,
+       ECORE_X_GRAVITY_NE = 3,
+       ECORE_X_GRAVITY_W = 4,
+       ECORE_X_GRAVITY_CENTER = 5,
+       ECORE_X_GRAVITY_E = 6,
+       ECORE_X_GRAVITY_SW = 7,
+       ECORE_X_GRAVITY_S = 8,
+       ECORE_X_GRAVITY_SE = 9,
+       ECORE_X_GRAVITY_STATIC = 10
+   } Ecore_X_Gravity;
+
 typedef struct _Ecore_X_Event_Key_Down                 Ecore_X_Event_Key_Down;
 typedef struct _Ecore_X_Event_Key_Up                   Ecore_X_Event_Key_Up;
 typedef struct _Ecore_X_Event_Mouse_Button_Down        Ecore_X_Event_Mouse_Button_Down;
@@ -806,7 +821,11 @@ Ecore_X_Window   ecore_x_window_parent_get(Ecore_X_Window win);
 
 void             ecore_x_window_background_color_set(Ecore_X_Window win,
                                                      unsigned long color);
-
+void             ecore_x_window_gravity_set(Ecore_X_Window win,
+                                           Ecore_X_Gravity grav);
+void             ecore_x_window_pixel_gravity_set(Ecore_X_Window win,
+                                                 Ecore_X_Gravity grav);
+       
 Ecore_X_Atom     ecore_x_window_prop_any_type(void);
 void             ecore_x_window_prop_property_set(Ecore_X_Window win, Ecore_X_Atom type, Ecore_X_Atom format, int size, void *data, int number);
 int              ecore_x_window_prop_property_get(Ecore_X_Window win, Ecore_X_Atom property, Ecore_X_Atom type, int size, unsigned char **data, int *num);
@@ -905,20 +924,6 @@ int              ecore_x_client_message8_send(Ecore_X_Window win, Ecore_X_Atom t
    void            ecore_x_window_client_sniff(Ecore_X_Window win);
    Ecore_X_Atom    ecore_x_atom_get(char *name);
 
-   typedef enum _Ecore_X_Gravity {
-      ECORE_X_GRAVITY_FORGET = 0,
-       ECORE_X_GRAVITY_UNMAP = 0,
-       ECORE_X_GRAVITY_NW = 1,
-       ECORE_X_GRAVITY_N = 2,
-       ECORE_X_GRAVITY_NE = 3,
-       ECORE_X_GRAVITY_W = 4,
-       ECORE_X_GRAVITY_CENTER = 5,
-       ECORE_X_GRAVITY_E = 6,
-       ECORE_X_GRAVITY_SW = 7,
-       ECORE_X_GRAVITY_S = 8,
-       ECORE_X_GRAVITY_SE = 9,
-       ECORE_X_GRAVITY_STATIC = 10
-   } Ecore_X_Gravity;
    void
      ecore_x_icccm_state_set(Ecore_X_Window win, Ecore_X_Window_State_Hint state);
    void
@@ -969,6 +974,10 @@ int              ecore_x_client_message8_send(Ecore_X_Window win, Ecore_X_Atom t
                                      int *step_x, int *step_y,
                                      double *min_aspect,
                                      double *max_aspect);
+   void
+     ecore_x_icccm_title_set(Ecore_X_Window win, const char *t);
+   char *
+     ecore_x_icccm_title_get(Ecore_X_Window win);
        
    void                ecore_x_netwm_init(void);
    void                ecore_x_netwm_wm_identify(Ecore_X_Window root, Ecore_X_Window check, const char *wm_name);
index 5a11724..8a5eaf7 100644 (file)
@@ -1,6 +1,6 @@
-#include <Ecore.h>
+#include "Ecore.h"
 #include "ecore_x_private.h"
-#include <Ecore_X.h>
+#include "Ecore_X.h"
 
 static Ecore_X_Selection_Data _xdnd_selection;
 static Ecore_X_DND_Protocol *_xdnd;
index 3b0376e..e39eebe 100644 (file)
@@ -5,7 +5,6 @@
 #include "Ecore.h"
 #include "ecore_x_private.h"
 #include "Ecore_X.h"
-#include "Ecore_Txt.h"
 
 static void _ecore_x_event_free_window_prop_name_class_change(void *data, void *ev);
 static void _ecore_x_event_free_window_prop_title_change(void *data, void *ev);
index e8da238..bd10ecb 100644 (file)
@@ -324,9 +324,93 @@ ecore_x_icccm_size_pos_hints_get(Ecore_X_Window win,
    return 1;
 }
 
+void
+ecore_x_icccm_title_set(Ecore_X_Window win, const char *t)
+{
+   char *list[1];
+   XTextProperty xprop;
+   int ret;
+   
+#ifdef X_HAVE_UTF8_STRING
+   list[0] = strdup(t);
+   ret = Xutf8TextListToTextProperty(_ecore_x_disp, list, 1, XUTF8StringStyle, &xprop);
+#else
+   list[0] = strdup(t);
+   ret = XmbTextListToTextProperty(_ecore_x_disp, list, 1, XStdICCTextStyle, &xprop);
+#endif
+   if (ret >= Success)
+     {
+       XSetWMName(_ecore_x_disp, win, &xprop);
+       XFree(xprop.value);
+     }
+   else
+     {
+       if (XStringListToTextProperty(list, 1, &xprop) >= Success)
+         {
+            XSetWMName(_ecore_x_disp, win, &xprop);
+            XFree(xprop.value);
+         }
+     }
+   free(list[0]);
+}
+
+char *
+ecore_x_icccm_title_get(Ecore_X_Window win)
+{
+   XTextProperty xprop;   
+   
+   if (XGetWMName(_ecore_x_disp, win, &xprop))
+     {
+       if (xprop.value)
+         {
+            char **list = NULL;
+            char *t = NULL;
+            int num = 0;
+            
+            if (xprop.encoding == _ecore_x_atom_string)
+              {
+                 t = strdup(xprop.value);
+              }
+            else if (xprop.encoding == _ecore_x_atom_utf8_string)
+              {
+                 t = strdup(xprop.value);
+              }
+            else
+              {
+                 int ret;
+                 
+#ifdef X_HAVE_UTF8_STRING
+                 ret = Xutf8TextPropertyToTextList(_ecore_x_disp, &xprop, 
+                                                   &list, &num);
+#else            
+                 ret = XmbTextPropertyToTextList(_ecore_x_disp, &xprop, 
+                                                 &list, &num);
+#endif           
+                 if ((ret == XLocaleNotSupported) ||
+                     (ret == XNoMemory) ||
+                     (ret == XConverterNotFound))
+                   {
+                      t = strdup(xprop.value);
+                   }
+                 else if (ret >= Success)
+                   {
+                      if ((num >= 1) && (list))
+                        {
+                           /* FIXME: convert to utf8 */
+                           t = strdup(list[0]);
+                        }
+                      if (list) XFreeStringList(list);
+                   }
+              }
+            XFree(xprop.value);
+            return t;
+         }
+     }
+   return NULL;
+}
+
 /* FIXME: move these things in here as they are icccm related */
 /* get/set wm protocols */
-/* get/set title */
 /* get/set name/class */
 /* get/set machine */
 /* get/set command */
index da3ec96..45cbb31 100644 (file)
@@ -19,6 +19,7 @@
 
 /* FIXME: this is for simulation only */
 #include "Ecore_Job.h"
+#include "Ecore_Txt.h"
 
 typedef struct _Ecore_X_Reply Ecore_X_Reply;
 
index 587d8ff..306d896 100644 (file)
@@ -1,7 +1,6 @@
-#include <Ecore.h>
+#include "Ecore.h"
 #include "ecore_x_private.h"
-#include <Ecore_X.h>
-#include <Ecore_Txt.h>
+#include "Ecore_X.h"
 
 static Ecore_X_Selection_Data selections[3] = {{0}};
 static Ecore_X_Selection_Data request_data[3] = {{0}};
index 4575850..b4f3de5 100644 (file)
@@ -719,3 +719,21 @@ ecore_x_window_background_color_set(Ecore_X_Window win, unsigned long color)
    attr.background_pixel      = color;
    XChangeWindowAttributes(_ecore_x_disp, win, CWBackPixel, &attr);
 }
+
+void
+ecore_x_window_gravity_set(Ecore_X_Window win, Ecore_X_Gravity grav)
+{
+   XSetWindowAttributes att;
+   
+   att.win_gravity = grav;
+   XChangeWindowAttributes(_ecore_x_disp, win, CWWinGravity, &att);
+}
+
+void
+ecore_x_window_pixel_gravity_set(Ecore_X_Window win, Ecore_X_Gravity grav)
+{
+   XSetWindowAttributes att;
+   
+   att.bit_gravity = grav;
+   XChangeWindowAttributes(_ecore_x_disp, win, CWBitGravity, &att);
+}