Code

Fix flicker during palette update.
[inkscape.git] / src / ui / uxmanager.cpp
index 48ff9dca0237c9b3d7740749d6fa4981baeb4265..3c6f85b915ad9b30ef142626768108159fb1740f 100644 (file)
 #include "util/ege-tags.h"
 #include "widgets/toolbox.h"
 #include "widgets/desktop-widget.h"
+#include "preferences.h"
+
+#ifdef GDK_WINDOWING_X11
+#include <gdk/gdkx.h>
+#endif // GDK_WINDOWING_X11
 
 using std::map;
 using std::vector;
 
+
+gchar const* KDE_WINDOW_MANAGER_NAME = "KWin";
+gchar const* UNKOWN_WINDOW_MANAGER_NAME = "unknown";
+
+
 static vector<SPDesktop*> desktops;
 static vector<SPDesktopWidget*> dtws;
 static map<SPDesktop*, vector<GtkWidget*> > trackedBoxes;
@@ -43,32 +53,72 @@ UXManager* UXManager::getInstance()
 }
 
 
-UXManager::UXManager()
+UXManager::UXManager() :
+    floatwindowIssues(false)
 {
     ege::TagSet tags;
     tags.setLang("en");
 
     tags.addTag(ege::Tag("General"));
     tags.addTag(ege::Tag("Icons"));
+
+#if defined(GDK_WINDOWING_X11)
+    char const* wmName = gdk_x11_screen_get_window_manager_name( gdk_screen_get_default() );
+    //g_message("Window manager is [%s]", wmName);
+
+    //if (g_ascii_strcasecmp( wmName, UNKOWN_WINDOW_MANAGER_NAME ) == 0) {
+    if (g_ascii_strcasecmp( wmName, KDE_WINDOW_MANAGER_NAME ) == 0) {
+        floatwindowIssues = true;
+    }
+#elif defined(GDK_WINDOWING_WIN32)
+    floatwindowIssues = true;
+#endif // GDK_WINDOWING_WIN32
 }
 
 UXManager::~UXManager()
 {
 }
 
+
+bool UXManager::isFloatWindowProblem() const
+{
+    return floatwindowIssues;
+}
+
 void UXManager::setTask(SPDesktop* dt, gint val)
 {
-    GtkOrientation orientation = (val == 0)? GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL;
     for (vector<SPDesktopWidget*>::iterator it = dtws.begin(); it != dtws.end(); ++it) {
-        if ((*it)->desktop == dt) {
-            vector<GtkWidget*>& boxes = trackedBoxes[dt];
-            for (vector<GtkWidget*>::iterator it2 = boxes.begin(); it2 != boxes.end(); ++it2) {
-                gint id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(*it2), "BarIdValue"));
-                if (id != 1) {
-                    //ToolboxFactory::setOrientation(*it2, orientation);
-                }
+        SPDesktopWidget* dtw = *it;
+
+        gboolean notDone = Inkscape::Preferences::get()->getBool("/options/workarounds/dynamicnotdone", false);
+
+        if (dtw->desktop == dt) {
+            switch (val) {
+                default:
+                case 0:
+                    dtw->setToolboxPosition("ToolToolbar", GTK_POS_LEFT);
+                    dtw->setToolboxPosition("CommandsToolbar", GTK_POS_TOP);
+                    if (notDone) {
+                        dtw->setToolboxPosition("AuxToolbar", GTK_POS_TOP);
+                    }
+                    dtw->setToolboxPosition("SnapToolbar", GTK_POS_TOP);
+                    break;
+                case 1:
+                    dtw->setToolboxPosition("ToolToolbar", GTK_POS_TOP);
+                    dtw->setToolboxPosition("CommandsToolbar", GTK_POS_LEFT);
+                    if (notDone) {
+                        dtw->setToolboxPosition("AuxToolbar", GTK_POS_TOP);
+                    }
+                    dtw->setToolboxPosition("SnapToolbar", GTK_POS_RIGHT);
+                    break;
+                case 2:
+                    dtw->setToolboxPosition("ToolToolbar", GTK_POS_LEFT);
+                    dtw->setToolboxPosition("CommandsToolbar", GTK_POS_RIGHT);
+                    dtw->setToolboxPosition("SnapToolbar", GTK_POS_RIGHT);
+                    if (notDone) {
+                        dtw->setToolboxPosition("AuxToolbar", GTK_POS_RIGHT);
+                    }
             }
-            break;
         }
     }
 }
@@ -95,8 +145,8 @@ void UXManager::connectToDesktop( vector<GtkWidget *> const & toolboxes, SPDeskt
 
     for (vector<GtkWidget*>::const_iterator it = toolboxes.begin(); it != toolboxes.end(); ++it ) {
         GtkWidget* toolbox = *it;
-        ToolboxFactory::setToolboxDesktop( toolbox, desktop );
 
+        ToolboxFactory::setToolboxDesktop( toolbox, desktop );
         vector<GtkWidget*>& tracked = trackedBoxes[desktop];
         if (find(tracked.begin(), tracked.end(), toolbox) == tracked.end()) {
             tracked.push_back(toolbox);