Implement more functions prerequisite to Xdnd
authorxcomputerman <xcomputerman>
Sun, 29 Feb 2004 04:29:25 +0000 (04:29 +0000)
committerxcomputerman <xcomputerman@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sun, 29 Feb 2004 04:29:25 +0000 (04:29 +0000)
- ecore_x_window_visible_get() <-- yeah, hard to believe it wasn't there
- ecore_x_server_grab/ungrab <-- that too
- ecore_x_window_at_xy_get()

SVN revision: 9152

legacy/ecore/src/lib/ecore_x/Ecore_X.h
legacy/ecore/src/lib/ecore_x/ecore_x.c
legacy/ecore/src/lib/ecore_x/ecore_x_window.c

index 35cad300ca330ee5c53e92d603ae8b06c7dce290..d8985967929b0eee9ab8813edc0e01fd87b20515 100644 (file)
@@ -737,6 +737,8 @@ int              ecore_x_window_border_size_get(Ecore_X_Window win);
 int              ecore_x_window_depth_get(Ecore_X_Window win);
 void             ecore_x_window_cursor_show(Ecore_X_Window win, int show);
 void             ecore_x_window_defaults_set(Ecore_X_Window win);
+int              ecore_x_window_visible_get(Ecore_X_Window win);
+Ecore_X_Window   ecore_x_window_at_xy_get(int x, int y);
 
 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);
@@ -866,6 +868,10 @@ void             ecore_x_gc_del(Ecore_X_GC gc);
      ecore_x_keyboard_grab(Ecore_X_Window win);
    void
      ecore_x_keyboard_ungrab(void);
+   void
+     ecore_x_grab(void);
+   void
+     ecore_x_ungrab(void);
        
        
 #ifdef __cplusplus
index dd8181e9ff85dd838103214779a24f258f5a365e..b6066621b2d91fe33c3b9c0c919a3656b16c8ffd 100644 (file)
@@ -16,6 +16,7 @@ static int _ecore_x_event_handlers_num = 0;
 static void (**_ecore_x_event_handlers) (XEvent * event) = NULL;
 
 static int _ecore_x_init_count = 0;
+static int _ecore_x_grab_count = 0;
 
 Display *_ecore_x_disp = NULL;
 double   _ecore_x_double_click_time = 0.25;
@@ -1161,12 +1162,34 @@ ecore_x_keyboard_grab(Ecore_X_Window win)
                        CurrentTime);
 }
 
-void
-ecore_x_keyboard_ungrab(void)
+void ecore_x_keyboard_ungrab(void)
 {
    XUngrabKeyboard(_ecore_x_disp, CurrentTime);   
 }
 
+void
+ecore_x_grab(void)
+{
+   _ecore_x_grab_count++;
+   
+   if (_ecore_x_grab_count == 1)
+      XGrabServer(_ecore_x_disp);
+}
+
+void
+ecore_x_ungrab(void)
+{
+   _ecore_x_grab_count--;
+   if (_ecore_x_grab_count < 0)
+      _ecore_x_grab_count = 0;
+
+   if (_ecore_x_grab_count == 0)
+   {
+      XUngrabServer(_ecore_x_disp);
+      XSync(_ecore_x_disp, False);
+   }
+}
+
 /*****************************************************************************/
 /*****************************************************************************/
 /*****************************************************************************/
index 51039ebaa2c6aab751878b6d19f92cd7dc4140ac..bf17f1653fa1d9d586d98fc2a70a24fdc1639014 100644 (file)
@@ -444,3 +444,73 @@ ecore_x_window_cursor_show(Ecore_X_Window win, int show)
        XDefineCursor(_ecore_x_disp, win, 0);   
      }
 }
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ */
+int
+ecore_x_window_visible_get(Ecore_X_Window win)
+{
+   XWindowAttributes attr;
+
+   return (XGetWindowAttributes(_ecore_x_disp, win, &attr) &&
+           (attr.map_state == IsViewable));
+}
+
+static Window
+_ecore_x_window_at_xy_get(Window base, int bx, int by, int x, int y)
+{
+   Window           *list = NULL;
+   Window            parent_win = 0, child = 0, root_win = 0;
+   int               i, wx, wy, ww, wh;
+   unsigned int      num;
+
+   if (!ecore_x_window_visible_get(base))
+      return 0;
+
+   ecore_x_window_geometry_get(base, &wx, &wy, &ww, &wh);
+   wx += bx;
+   wy += by;
+
+   if (!((x >= wx) && (y >= wy) && (x < (wx + ww)) && (y < (wy + wh))))
+      return 0;
+   
+   if (!XQueryTree(_ecore_x_disp, base, &root_win, &parent_win, &list, &num))
+      return base;
+
+   if (list)
+   {
+      for (i = num - 1;; --i)
+      {
+         if ((child = _ecore_x_window_at_xy_get(list[i], wx, wy, x, y)))
+         {
+            XFree(list);
+            return child;
+         }
+         if (!i)
+            break;
+      }
+      XFree(list);
+   }
+
+   return base;
+}
+
+Ecore_X_Window
+ecore_x_window_at_xy_get(int x, int y)
+{
+   Ecore_X_Window    win, root;
+   
+   /* FIXME: Proper function to determine current root/virtual root
+    * window missing here */
+   root = DefaultRootWindow(_ecore_x_disp);
+   
+   ecore_x_grab();
+   win = _ecore_x_window_at_xy_get(root, 0, 0, x, y);
+   ecore_x_ungrab();
+   
+   return win ? win : root;
+}
+