Enlightenment CVS committal

Author  : raster
Project : e17
Module  : libs/ecore

Dir     : e17/libs/ecore/src/lib/ecore_x


Modified Files:
      Tag: SPLIT
        Ecore_X.h ecore_x.c ecore_x_events.c ecore_x_private.h 
        ecore_x_window_prop.c 


Log Message:


example of porperty change to event translation... eventually might want to
turn the property one into a table...

===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/Attic/Ecore_X.h,v
retrieving revision 1.1.2.13
retrieving revision 1.1.2.14
diff -u -3 -r1.1.2.13 -r1.1.2.14
--- Ecore_X.h   5 Feb 2003 00:10:19 -0000       1.1.2.13
+++ Ecore_X.h   5 Feb 2003 06:51:57 -0000       1.1.2.14
@@ -92,8 +92,10 @@
 typedef struct _Ecore_X_Event_Client_Message           Ecore_X_Event_Client_Message;
 typedef struct _Ecore_X_Event_Window_Shape             Ecore_X_Event_Window_Shape;
 
-typedef struct _Ecore_X_Event_Window_Delete_Request    
Ecore_X_Event_Window_Delete_Request;
-
+typedef struct _Ecore_X_Event_Window_Delete_Request         
+Ecore_X_Event_Window_Delete_Request;
+typedef struct _Ecore_X_Event_Window_Prop_Title_Change      
+Ecore_X_Event_Window_Prop_Title_Change;
+typedef struct _Ecore_X_Event_Window_Prop_Name_Class_Change 
+Ecore_X_Event_Window_Prop_Name_Class_Change;
+     
 struct _Ecore_X_Event_Key_Down
 {
    char   *keyname;
@@ -322,7 +324,22 @@
    Window  win;
    Time    time;
 };
-   
+
+struct _Ecore_X_Event_Window_Prop_Title_Change
+{
+   Window  win;
+   char   *title;
+   Time    time;
+};
+
+struct _Ecore_X_Event_Window_Prop_Name_Class_Change
+{
+   Window  win;
+   char   *name;
+   char   *clas;
+   Time    time;
+};
+
 extern int ECORE_EVENT_X_KEY_DOWN;
 extern int ECORE_EVENT_X_KEY_UP;
 extern int ECORE_EVENT_X_MOUSE_BUTTON_DOWN;
@@ -357,6 +374,8 @@
 extern int ECORE_EVENT_X_WINDOW_SHAPE;
 
 extern int ECORE_EVENT_X_WINDOW_DELETE_REQUEST;
+extern int ECORE_EVENT_X_WINDOW_PROP_TITLE_CHANGE;
+extern int ECORE_EVENT_X_WINDOW_PROP_NAME_CLASS_CHANGE;
    
 extern int ECORE_MODIFIER_SHIFT;
 extern int ECORE_MODIFIER_CTRL;
@@ -383,9 +402,11 @@
 void ecore_x_window_show(Window win);
 void ecore_x_window_hide(Window win);
    
-void ecore_x_window_prop_title_set(Window win, const char *t);
-void ecore_x_window_prop_name_class_set(Window win, const char *n, const char *c);
-void ecore_x_window_prop_delete_request_set(Window win, int on);
+void  ecore_x_window_prop_title_set(Window win, const char *t);
+char *ecore_x_window_prop_title_get(Window win);
+void  ecore_x_window_prop_name_class_set(Window win, const char *n, const char *c);
+void  ecore_x_window_prop_name_class_get(Window win, char **n, char **c);
+void  ecore_x_window_prop_delete_request_set(Window win, int on);
        
 #ifdef __cplusplus
 }
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/Attic/ecore_x.c,v
retrieving revision 1.1.2.10
retrieving revision 1.1.2.11
diff -u -3 -r1.1.2.10 -r1.1.2.11
--- ecore_x.c   5 Feb 2003 00:10:19 -0000       1.1.2.10
+++ ecore_x.c   5 Feb 2003 06:51:57 -0000       1.1.2.11
@@ -24,6 +24,8 @@
 
 Atom     _ecore_x_atom_wm_delete_window = 0;
 Atom     _ecore_x_atom_wm_protocols = 0;
+Atom     _ecore_x_atom_wm_class = 0;
+Atom     _ecore_x_atom_wm_name = 0;
 
 int ECORE_EVENT_X_KEY_DOWN = 0;
 int ECORE_EVENT_X_KEY_UP = 0;
@@ -59,6 +61,8 @@
 int ECORE_EVENT_X_WINDOW_SHAPE = 0;
 
 int ECORE_EVENT_X_WINDOW_DELETE_REQUEST = 0;
+int ECORE_EVENT_X_WINDOW_PROP_TITLE_CHANGE = 0;
+int ECORE_EVENT_X_WINDOW_PROP_NAME_CLASS_CHANGE = 0;
 
 int ECORE_MODIFIER_SHIFT = 0;
 int ECORE_MODIFIER_CTRL = 0;
@@ -168,7 +172,9 @@
        ECORE_EVENT_X_CLIENT_MESSAGE           = ecore_event_type_new();
        ECORE_EVENT_X_WINDOW_SHAPE             = ecore_event_type_new();
        
-       ECORE_EVENT_X_WINDOW_DELETE_REQUEST    = ecore_event_type_new();
+       ECORE_EVENT_X_WINDOW_DELETE_REQUEST         = ecore_event_type_new();
+       ECORE_EVENT_X_WINDOW_PROP_TITLE_CHANGE      = ecore_event_type_new();
+        ECORE_EVENT_X_WINDOW_PROP_NAME_CLASS_CHANGE = ecore_event_type_new();
      }
    
    ECORE_MODIFIER_SHIFT = _ecore_x_key_mask_get(XK_Shift_L);
@@ -199,6 +205,8 @@
    _ecore_x_filter_handler = ecore_event_filter_add(_ecore_x_event_filter_start, 
_ecore_x_event_filter_filter, _ecore_x_event_filter_end, NULL);
    _ecore_x_atom_wm_delete_window = XInternAtom(_ecore_x_disp, "WM_DELETE_WINDOW", 
False);
    _ecore_x_atom_wm_protocols     = XInternAtom(_ecore_x_disp, "WM_PROTOCOLS", False);
+   _ecore_x_atom_wm_class         = XInternAtom(_ecore_x_disp, "WM_CLASS", False);
+   _ecore_x_atom_wm_name          = XInternAtom(_ecore_x_disp, "WM_NAME", False);
    return 1;
 }
 
@@ -349,38 +357,46 @@
   return 0;
 }
 
+typedef struct _Ecore_X_Filter_Data Ecore_X_Filter_Data;
+
+struct _Ecore_X_Filter_Data
+{
+   int last_event_type;
+};
+
 static void *
 _ecore_x_event_filter_start(void *data)
 {
-   static int last_event_type;
+   Ecore_X_Filter_Data *filter_data;
    
-   last_event_type = 0;
-   return &last_event_type;
+   filter_data = calloc(1, sizeof(Ecore_X_Filter_Data));
+   return filter_data;
 }
 
 static int
 _ecore_x_event_filter_filter(int type, void *event, void *loop_data, void *data)
 {
-   int *last_event_type;
+   Ecore_X_Filter_Data *filter_data;
    
-   last_event_type = loop_data;
+   filter_data = loop_data;
+   if (!filter_data) return 1;
    if (type == ECORE_EVENT_X_MOUSE_MOVE)
      {
-       if ((*last_event_type) == ECORE_EVENT_X_MOUSE_MOVE) 
+       if ((filter_data->last_event_type) == ECORE_EVENT_X_MOUSE_MOVE) 
          {
-            *last_event_type = type;
+            filter_data->last_event_type = type;
             return 0;
          }
      }
-   *last_event_type = type;
+   filter_data->last_event_type = type;
    return 1;
 }
 
 static void
 _ecore_x_event_filter_end(void *loop_data, void *data)
 {
-   int *last_event_type;
+   Ecore_X_Filter_Data *filter_data;
    
-   last_event_type = loop_data;   
-   *last_event_type = 0;
+   filter_data = loop_data;
+   if (filter_data) free(filter_data);
 }
===================================================================
RCS file: 
/cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/Attic/ecore_x_events.c,v
retrieving revision 1.1.2.8
retrieving revision 1.1.2.9
diff -u -3 -r1.1.2.8 -r1.1.2.9
--- ecore_x_events.c    5 Feb 2003 00:10:19 -0000       1.1.2.8
+++ ecore_x_events.c    5 Feb 2003 06:51:57 -0000       1.1.2.9
@@ -2,11 +2,34 @@
 #include "ecore_x_private.h"
 #include "Ecore_X.h"
 
+static void _ecore_x_event_free_window_prop_name_class_change(void *ev, void *data);
+static void _ecore_x_event_free_window_prop_title_change(void *ev, void *data);
 static void _ecore_x_event_free_key_down(void *ev, void *data);
 static void _ecore_x_event_free_key_up(void *ev, void *data);
 static void _ecore_x_event_free_generic(void *ev, void *data);
 
 static void
+_ecore_x_event_free_window_prop_name_class_change(void *ev, void *data)
+{
+   Ecore_X_Event_Window_Prop_Name_Class_Change *e;
+   
+   e = ev;
+   if (e->name) free(e->name);
+   if (e->clas) free(e->clas);
+   free(e);
+}
+
+static void
+_ecore_x_event_free_window_prop_title_change(void *ev, void *data)
+{
+   Ecore_X_Event_Window_Prop_Title_Change *e;
+   
+   e = ev;
+   if (e->title) free(e->title);
+   free(e);
+}
+
+static void
 _ecore_x_event_free_key_down(void *ev, void *data)
 {
    Ecore_X_Event_Key_Down *e;
@@ -34,6 +57,7 @@
    free(ev);
 }
 
+
 void
 _ecore_x_event_handle_key_press(XEvent *xevent)
 {
@@ -569,7 +593,25 @@
 void
 _ecore_x_event_handle_property_notify(XEvent *xevent)
 {
-   /* FIXME: handle this event type */
+   if (xevent->xproperty.atom == _ecore_x_atom_wm_class)
+     {
+       Ecore_X_Event_Window_Prop_Name_Class_Change *e;
+       
+       e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Name_Class_Change));
+       if (!e) return;
+       ecore_x_window_prop_name_class_get(xevent->xproperty.window, 
+                                          &(e->name), &(e->clas));
+       ecore_event_add(ECORE_EVENT_X_WINDOW_PROP_NAME_CLASS_CHANGE, e, 
+_ecore_x_event_free_window_prop_name_class_change, NULL);
+     }
+   else if (xevent->xproperty.atom == _ecore_x_atom_wm_name)
+     {
+       Ecore_X_Event_Window_Prop_Title_Change *e;
+       
+       e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Title_Change));
+       if (!e) return;
+       e->title = ecore_x_window_prop_title_get(xevent->xproperty.window);
+       ecore_event_add(ECORE_EVENT_X_WINDOW_PROP_TITLE_CHANGE, e, 
+_ecore_x_event_free_window_prop_title_change, NULL);
+     }
 }
 
 void
===================================================================
RCS file: 
/cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/Attic/ecore_x_private.h,v
retrieving revision 1.1.2.5
retrieving revision 1.1.2.6
diff -u -3 -r1.1.2.5 -r1.1.2.6
--- ecore_x_private.h   5 Feb 2003 00:10:19 -0000       1.1.2.5
+++ ecore_x_private.h   5 Feb 2003 06:51:57 -0000       1.1.2.6
@@ -19,6 +19,8 @@
 
 extern Atom     _ecore_x_atom_wm_delete_window;
 extern Atom     _ecore_x_atom_wm_protocols;
+extern Atom     _ecore_x_atom_wm_class;
+extern Atom     _ecore_x_atom_wm_name;
 
 void _ecore_x_error_handler_init(void);
 void _ecore_x_event_handle_key_press(XEvent *xevent);
===================================================================
RCS file: 
/cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/Attic/ecore_x_window_prop.c,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -u -3 -r1.1.2.2 -r1.1.2.3
--- ecore_x_window_prop.c       4 Feb 2003 09:15:52 -0000       1.1.2.2
+++ ecore_x_window_prop.c       5 Feb 2003 06:51:57 -0000       1.1.2.3
@@ -16,6 +16,44 @@
 }
 
 /**
+ * Get a window title
+ * @param win
+ * @return The windows title
+ * 
+ * Return the title of a window. String must be free'd when done with.
+ */
+char *
+ecore_x_window_prop_title_get(Window win)
+{
+   XTextProperty       xtp;
+   
+   if (XGetWMName(_ecore_x_disp, win, &xtp))
+     {
+       int      items;
+       char   **list;
+       Status   s;
+       char    *title = NULL;
+       
+       if (xtp.format == 8)
+         {
+            s = XmbTextPropertyToTextList(_ecore_x_disp, &xtp, &list, &items);
+            if ((s == Success) && (items > 0))
+              {
+                 title = strdup(*list);
+                 XFreeStringList(list);
+              }
+            else
+              title = strdup((char *)xtp.value);
+         }
+       else
+         title = strdup((char *)xtp.value);
+       XFree(xtp.value);
+       return title;
+     }
+   return NULL;
+}
+
+/**
  * Set a window name & class
  * @param win
  * @param n
@@ -34,6 +72,37 @@
    xch->res_class = (char *)c;
    XSetClassHint(_ecore_x_disp, win, xch);
    XFree(xch);   
+}
+
+/**
+ * Get a window name & class
+ * @param win
+ * @param n
+ * @param c
+ * 
+ * Get a windows name and class property. strings must be free'd when done 
+ * with.
+ */
+void
+ecore_x_window_prop_name_class_get(Window win, char **n, char **c)
+{
+   XClassHint          xch;
+   
+   if (n) *n = NULL;
+   if (c) *c = NULL;
+   if (XGetClassHint(_ecore_x_disp, win, &xch))
+     {
+       if (n)
+         {
+            if (xch.res_name) *n = strdup(xch.res_name);
+         }
+       if (c)
+         {
+            if (xch.res_class) *c = strdup(xch.res_class);
+         }
+       XFree(xch.res_name);
+       XFree(xch.res_class);
+     }
 }
 
 /**




-------------------------------------------------------
This SF.NET email is sponsored by:
SourceForge Enterprise Edition + IBM + LinuxWorld = Something 2 See!
http://www.vasoftware.com
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to