Merge branch 'backport' into work
[mikachu/openbox.git] / openbox / dock.c
index 4c183e2..f36fca8 100644 (file)
 
 #include "debug.h"
 #include "dock.h"
-#include "mainloop.h"
 #include "screen.h"
-#include "prop.h"
 #include "config.h"
 #include "grab.h"
 #include "openbox.h"
 #include "render/theme.h"
+#include "obt/prop.h"
 
 #define DOCK_EVENT_MASK (ButtonPressMask | ButtonReleaseMask | \
                          EnterWindowMask | LeaveWindowMask)
@@ -58,9 +57,9 @@ void dock_startup(gboolean reconfig)
     if (reconfig) {
         GList *it;
 
-        XSetWindowBorder(ob_display, dock->frame,
+        XSetWindowBorder(obt_display, dock->frame,
                          RrColorPixel(ob_rr_theme->osd_border_color));
-        XSetWindowBorderWidth(ob_display, dock->frame, ob_rr_theme->obwidth);
+        XSetWindowBorderWidth(obt_display, dock->frame, ob_rr_theme->obwidth);
 
         RrAppearanceFree(dock->a_frame);
         dock->a_frame = RrAppearanceCopy(ob_rr_theme->osd_hilite_bg);
@@ -79,14 +78,14 @@ void dock_startup(gboolean reconfig)
                       0, 0, 0, 0, 0, 0, 0, 0);
 
     dock = g_new0(ObDock, 1);
-    dock->obwin.type = Window_Dock;
+    dock->obwin.type = OB_WINDOW_CLASS_DOCK;
 
     dock->hidden = TRUE;
 
     attrib.event_mask = DOCK_EVENT_MASK;
     attrib.override_redirect = True;
     attrib.do_not_propagate_mask = DOCK_NOPROPAGATEMASK;
-    dock->frame = XCreateWindow(ob_display, RootWindow(ob_display, ob_screen),
+    dock->frame = XCreateWindow(obt_display, obt_root(ob_screen),
                                 0, 0, 1, 1, 0,
                                 RrDepth(ob_rr_inst), InputOutput,
                                 RrVisual(ob_rr_inst),
@@ -94,15 +93,15 @@ void dock_startup(gboolean reconfig)
                                 CWDontPropagate,
                                 &attrib);
     dock->a_frame = RrAppearanceCopy(ob_rr_theme->osd_hilite_bg);
-    XSetWindowBorder(ob_display, dock->frame,
+    XSetWindowBorder(obt_display, dock->frame,
                      RrColorPixel(ob_rr_theme->osd_border_color));
-    XSetWindowBorderWidth(ob_display, dock->frame, ob_rr_theme->obwidth);
+    XSetWindowBorderWidth(obt_display, dock->frame, ob_rr_theme->obwidth);
 
     /* Setting the window type so xcompmgr can tell what it is */
-    PROP_SET32(dock->frame, net_wm_window_type, atom,
-               prop_atoms.net_wm_window_type_dock);
+    OBT_PROP_SET32(dock->frame, NET_WM_WINDOW_TYPE, ATOM,
+                   OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_DOCK));
 
-    g_hash_table_insert(window_map, &dock->frame, dock);
+    window_add(&dock->frame, DOCK_AS_WINDOW(dock));
     stacking_add(DOCK_AS_WINDOW(dock));
 }
 
@@ -118,9 +117,9 @@ void dock_shutdown(gboolean reconfig)
         return;
     }
 
-    XDestroyWindow(ob_display, dock->frame);
+    XDestroyWindow(obt_display, dock->frame);
     RrAppearanceFree(dock->a_frame);
-    g_hash_table_remove(window_map, &dock->frame);
+    window_remove(dock->frame);
     stacking_remove(dock);
 }
 
@@ -131,12 +130,11 @@ void dock_add(Window win, XWMHints *wmhints)
     gchar **data;
 
     app = g_new0(ObDockApp, 1);
-    app->obwin.type = Window_DockApp;
     app->win = win;
     app->icon_win = (wmhints->flags & IconWindowHint) ?
         wmhints->icon_window : win;
 
-    if (PROP_GETSS(app->win, wm_class, locale, &data)) {
+    if (OBT_PROP_GETSS(app->win, WM_CLASS, locale, &data)) {
         if (data[0]) {
             app->name = g_strdup(data[0]);
             if (data[1])
@@ -148,7 +146,7 @@ void dock_add(Window win, XWMHints *wmhints)
     if (app->name == NULL) app->name = g_strdup("");
     if (app->class == NULL) app->class = g_strdup("");
 
-    if (XGetWindowAttributes(ob_display, app->icon_win, &attrib)) {
+    if (XGetWindowAttributes(obt_display, app->icon_win, &attrib)) {
         app->w = attrib.width;
         app->h = attrib.height;
     } else {
@@ -158,7 +156,7 @@ void dock_add(Window win, XWMHints *wmhints)
     dock->dock_apps = g_list_append(dock->dock_apps, app);
     dock_configure();
 
-    XReparentWindow(ob_display, app->icon_win, dock->frame, app->x, app->y);
+    XReparentWindow(obt_display, app->icon_win, dock->frame, app->x, app->y);
     /*
       This is the same case as in frame.c for client windows. When Openbox is
       starting, the window is already mapped so we see unmap events occur for
@@ -171,21 +169,19 @@ void dock_add(Window win, XWMHints *wmhints)
 
     if (app->win != app->icon_win) {
         /* have to map it so that it can be re-managed on a restart */
-        XMoveWindow(ob_display, app->win, -1000, -1000);
-        XMapWindow(ob_display, app->win);
+        XMoveWindow(obt_display, app->win, -1000, -1000);
+        XMapWindow(obt_display, app->win);
     }
-    XMapWindow(ob_display, app->icon_win);
-    XSync(ob_display, False);
+    XMapWindow(obt_display, app->icon_win);
+    XSync(obt_display, False);
 
     /* specify that if we exit, the window should not be destroyed and should
        be reparented back to root automatically */
-    XChangeSaveSet(ob_display, app->icon_win, SetModeInsert);
-    XSelectInput(ob_display, app->icon_win, DOCKAPP_EVENT_MASK);
+    XChangeSaveSet(obt_display, app->icon_win, SetModeInsert);
+    XSelectInput(obt_display, app->icon_win, DOCKAPP_EVENT_MASK);
 
     dock_app_grab_button(app, TRUE);
 
-    g_hash_table_insert(window_map, &app->icon_win, app);
-
     ob_debug("Managed Dock App: 0x%lx (%s)\n", app->icon_win, app->class);
 }
 
@@ -198,16 +194,14 @@ void dock_remove_all(void)
 void dock_remove(ObDockApp *app, gboolean reparent)
 {
     dock_app_grab_button(app, FALSE);
-    XSelectInput(ob_display, app->icon_win, NoEventMask);
+    XSelectInput(obt_display, app->icon_win, NoEventMask);
     /* remove the window from our save set */
-    XChangeSaveSet(ob_display, app->icon_win, SetModeDelete);
-    XSync(ob_display, False);
-
-    g_hash_table_remove(window_map, &app->icon_win);
+    XChangeSaveSet(obt_display, app->icon_win, SetModeDelete);
+    XSync(obt_display, False);
 
     if (reparent)
-        XReparentWindow(ob_display, app->icon_win,
-                        RootWindow(ob_display, ob_screen), app->x, app->y);
+        XReparentWindow(obt_display, app->icon_win,
+                        obt_root(ob_screen), app->x, app->y);
 
     dock->dock_apps = g_list_remove(dock->dock_apps, app);
     dock_configure();
@@ -273,7 +267,7 @@ void dock_configure(void)
             break;
         }
 
-        XMoveWindow(ob_display, app->icon_win, app->x, app->y);
+        XMoveWindow(obt_display, app->icon_win, app->x, app->y);
     }
 
     /* used for calculating offsets */
@@ -523,14 +517,14 @@ void dock_configure(void)
         g_assert(dock->area.width > 0);
         g_assert(dock->area.height > 0);
 
-        XMoveResizeWindow(ob_display, dock->frame, dock->area.x, dock->area.y,
+        XMoveResizeWindow(obt_display, dock->frame, dock->area.x, dock->area.y,
                           dock->area.width, dock->area.height);
 
         RrPaint(dock->a_frame, dock->frame, dock->area.width,
                 dock->area.height);
-        XMapWindow(ob_display, dock->frame);
+        XMapWindow(obt_display, dock->frame);
     } else
-        XUnmapWindow(ob_display, dock->frame);
+        XUnmapWindow(obt_display, dock->frame);
 
     /* but they are useful outside of this function! but don't add it if the
        dock is actually not visible */
@@ -636,19 +630,21 @@ void dock_hide(gboolean hide)
 {
     if (!hide) {
         if (dock->hidden && config_dock_hide) {
-            ob_main_loop_timeout_add(ob_main_loop,
-                                     config_dock_show_delay * 1000,
-                                     show_timeout, NULL, g_direct_equal, NULL);
+            obt_main_loop_timeout_add(ob_main_loop,
+                                      config_dock_show_delay * 1000,
+                                      show_timeout, NULL,
+                                      g_direct_equal, NULL);
         } else if (!dock->hidden && config_dock_hide) {
-            ob_main_loop_timeout_remove(ob_main_loop, hide_timeout);
+            obt_main_loop_timeout_remove(ob_main_loop, hide_timeout);
         }
     } else {
         if (!dock->hidden && config_dock_hide) {
-            ob_main_loop_timeout_add(ob_main_loop,
-                                     config_dock_hide_delay * 1000,
-                                     hide_timeout, NULL, g_direct_equal, NULL);
+            obt_main_loop_timeout_add(ob_main_loop,
+                                      config_dock_hide_delay * 1000,
+                                      hide_timeout, NULL,
+                                      g_direct_equal, NULL);
         } else if (dock->hidden && config_dock_hide) {
-            ob_main_loop_timeout_remove(ob_main_loop, show_timeout);
+            obt_main_loop_timeout_remove(ob_main_loop, show_timeout);
         }
     }
 }
@@ -658,3 +654,16 @@ void dock_get_area(Rect *a)
     RECT_SET(*a, dock->area.x, dock->area.y,
              dock->area.width, dock->area.height);
 }
+
+ObDockApp* dock_find_dockapp(Window xwin)
+{
+    GList *it;
+    /* there are never that many dock apps, so we can use a list here instead
+       of a hash table */
+    for (it = dock->dock_apps; it; it = g_list_next(it)) {
+        ObDockApp *app = it->data;
+        if (app->icon_win == xwin)
+            return app;
+    }
+    return NULL;
+}