]> git.ipfire.org Git - thirdparty/open-vm-tools.git/commitdiff
Changes to common source files not directly applicable to open-vm-tools.
authorJohn Wolfe <jwolfe@vmware.com>
Fri, 7 Aug 2020 19:03:26 +0000 (12:03 -0700)
committerJohn Wolfe <jwolfe@vmware.com>
Fri, 7 Aug 2020 19:03:26 +0000 (12:03 -0700)
open-vm-tools/services/plugins/dndcp/xutils/xutils.cc
open-vm-tools/services/plugins/dndcp/xutils/xutils.hh

index 3fad2ce31a5e46c2df129e5bb454a90b22f8bc0d..66565f1464c885c5703d359ec3e94884264d1a3b 100644 (file)
@@ -249,7 +249,7 @@ GetCardinal(Glib::RefPtr<const Gdk::Window> window, // IN: Window
 bool
 GetCardinalList(Glib::RefPtr<const Gdk::Window> window, // IN: Window
                 const utf::string& atomName,            // IN: Atom name
-                std::vector<unsigned long>& retValues)         // IN: Return values
+                std::vector<unsigned long>& retValues)  // IN: Return values
 {
    ASSERT(window);
    ASSERT(window->get_display());
@@ -306,6 +306,58 @@ GetCardinalList(Glib::RefPtr<const Gdk::Window> window, // IN: Window
 }
 
 
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * xutils::CheckDockPanel --
+ *
+ *      Utility function to check dock or panel window.
+ *
+ * Results:
+ *      true if the dock or panel window found.
+ *      Otherwise false.
+ *
+ * Side effects:
+ *      None.
+ *
+ *-----------------------------------------------------------------------------
+ */
+bool CheckDockPanel(Glib::RefPtr<const Gdk::Window> window)
+{
+   ASSERT(window);
+   ASSERT(window->get_display());
+
+   GdkDisplay* display = const_cast<GdkDisplay*>(window->get_display()->gobj());
+   GdkWindow* gdkwin = const_cast<GdkWindow*>(window->gobj());
+
+   Atom atom = gdk_x11_get_xatom_by_name_for_display(display, "_NET_WM_WINDOW_TYPE");
+   Atom type;
+   int format;
+   ulong nitems;
+   ulong bytes_after;
+   uint8* values;
+
+   gdk_error_trap_push();
+   int ret = XGetWindowProperty(GDK_DISPLAY_XDISPLAY(display),
+                                GDK_WINDOW_XID(gdkwin),
+                                atom, 0, G_MAXLONG, False, AnyPropertyType, &type,
+                                &format, &nitems, &bytes_after, &values);
+   gdk_error_trap_pop_ignored();
+   if (ret == Success && type == XA_ATOM
+       && format == 32 && values != NULL && nitems > 0) {
+      unsigned long* stack = (unsigned long*)values;
+      if (stack[0] == XInternAtom(GDK_DISPLAY_XDISPLAY(display),
+                                  "_NET_WM_WINDOW_TYPE_DOCK", false)) {
+         Log("found dock window: %ld.\n",GDK_WINDOW_XID(gdkwin));
+         XFree(values);
+         return true;
+      }
+   }
+   XFree(values);
+   return false;
+}
+
+
 /*
  *-----------------------------------------------------------------------------
  *
index 29d69003ff061c6fd9a4e1c8c3ba67bac3a8ac40..42beab6b851a5a4bf88cc5d4e6a7c8f3a8243b21 100644 (file)
@@ -41,6 +41,7 @@ bool GetCardinal(Glib::RefPtr<const Gdk::Window> window,
 bool GetCardinalList(Glib::RefPtr<const Gdk::Window> window,
                      const utf::string& atomName,
                      std::vector<unsigned long>& retValues);
+bool CheckDockPanel(Glib::RefPtr<const Gdk::Window> window);
 
 /*
  * Utility functions for virtual desktops.