Code

Cleanup of device internal handling and API.
[inkscape.git] / src / ui / uxmanager.cpp
index 5f0021ef6dbeeef5b962f27e98939790a9c463c5..3c6f85b915ad9b30ef142626768108159fb1740f 100644 (file)
 # include "config.h"
 #endif
 
+#include <algorithm>
+
 #include "uxmanager.h"
 #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;
+
+
 
 namespace Inkscape {
 namespace UI {
@@ -31,13 +53,26 @@ 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()
@@ -45,10 +80,81 @@ UXManager::~UXManager()
 }
 
 
-void UXManager::connectToDesktop( std::vector<GtkWidget *> const & toolboxes, SPDesktop *desktop )
+bool UXManager::isFloatWindowProblem() const
+{
+    return floatwindowIssues;
+}
+
+void UXManager::setTask(SPDesktop* dt, gint val)
+{
+    for (vector<SPDesktopWidget*>::iterator it = dtws.begin(); it != dtws.end(); ++it) {
+        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);
+                    }
+            }
+        }
+    }
+}
+
+
+void UXManager::addTrack( SPDesktopWidget* dtw )
+{
+    if (std::find(dtws.begin(), dtws.end(), dtw) == dtws.end()) {
+        dtws.push_back(dtw);
+    }
+}
+
+void UXManager::delTrack( SPDesktopWidget* dtw )
 {
-    for (std::vector<GtkWidget*>::const_iterator it = toolboxes.begin(); it != toolboxes.end(); ++it ) {
-        sp_toolbox_set_desktop( *it, desktop );
+    vector<SPDesktopWidget*>::iterator iter = std::find(dtws.begin(), dtws.end(), dtw);
+    if (iter != dtws.end()) {
+        dtws.erase(iter);
+    }
+}
+
+void UXManager::connectToDesktop( vector<GtkWidget *> const & toolboxes, SPDesktop *desktop )
+{
+//static map<SPDesktop*, vector<GtkWidget*> > trackedBoxes;
+
+    for (vector<GtkWidget*>::const_iterator it = toolboxes.begin(); it != toolboxes.end(); ++it ) {
+        GtkWidget* toolbox = *it;
+
+        ToolboxFactory::setToolboxDesktop( toolbox, desktop );
+        vector<GtkWidget*>& tracked = trackedBoxes[desktop];
+        if (find(tracked.begin(), tracked.end(), toolbox) == tracked.end()) {
+            tracked.push_back(toolbox);
+        }
+    }
+
+    if (std::find(desktops.begin(), desktops.end(), desktop) == desktops.end()) {
+        desktops.push_back(desktop);
     }
 }