Code

Cleanup on encapsulation. Addition of initial widescreen detection.
[inkscape.git] / src / ui / uxmanager.cpp
1 /** \file
2  * Desktop widget implementation
3  */
4 /* Authors:
5  *   Jon A. Cruz <jon@joncruz.org>
6  *
7  * Copyright (C) 2010 Jon A. Cruz
8  *
9  * Released under GNU GPL, read the file 'COPYING' for more information
10  */
12 #ifdef HAVE_CONFIG_H
13 # include "config.h"
14 #endif
16 #include <algorithm>
18 #include "uxmanager.h"
19 #include "util/ege-tags.h"
20 #include "widgets/toolbox.h"
21 #include "widgets/desktop-widget.h"
22 #include "preferences.h"
23 #include "gdkmm/screen.h"
25 #ifdef GDK_WINDOWING_X11
26 #include <gdk/gdkx.h>
27 #endif // GDK_WINDOWING_X11
29 using std::map;
30 using std::vector;
33 gchar const* KDE_WINDOW_MANAGER_NAME = "KWin";
34 gchar const* UNKOWN_WINDOW_MANAGER_NAME = "unknown";
37 static vector<SPDesktop*> desktops;
38 static vector<SPDesktopWidget*> dtws;
39 static map<SPDesktop*, vector<GtkWidget*> > trackedBoxes;
43 namespace Inkscape {
44 namespace UI {
46 UXManager* instance = 0;
48 class UXManagerImpl : public UXManager
49 {
50 public:
51     UXManagerImpl();
52     virtual ~UXManagerImpl();
54     virtual void setTask(SPDesktop* dt, gint val);
55     virtual void addTrack( SPDesktopWidget* dtw );
56     virtual void delTrack( SPDesktopWidget* dtw );
57     virtual void connectToDesktop( vector<GtkWidget *> const & toolboxes, SPDesktop *desktop );
59     virtual bool isFloatWindowProblem() const;
60     virtual bool isWidescreen() const;
62 private:
63     bool _floatwindowIssues;
64     bool _widescreen;
65 };
67 UXManager* UXManager::getInstance()
68 {
69     if (!instance) {
70         instance = new UXManagerImpl();
71     }
72     return instance;
73 }
76 UXManager::UXManager()
77 {
78 }
80 UXManager::~UXManager()
81 {
82 }
84 UXManagerImpl::UXManagerImpl() :
85     _floatwindowIssues(false),
86     _widescreen(false)
87 {
88     ege::TagSet tags;
89     tags.setLang("en");
91     tags.addTag(ege::Tag("General"));
92     tags.addTag(ege::Tag("Icons"));
94 #if defined(GDK_WINDOWING_X11)
95     char const* wmName = gdk_x11_screen_get_window_manager_name( gdk_screen_get_default() );
96     //g_message("Window manager is [%s]", wmName);
98     //if (g_ascii_strcasecmp( wmName, UNKOWN_WINDOW_MANAGER_NAME ) == 0) {
99     if (g_ascii_strcasecmp( wmName, KDE_WINDOW_MANAGER_NAME ) == 0) {
100         _floatwindowIssues = true;
101     }
102 #elif defined(GDK_WINDOWING_WIN32)
103     _floatwindowIssues = true;
104 #endif // GDK_WINDOWING_WIN32
107     Glib::RefPtr<Gdk::Screen> defaultScreen = Gdk::Screen::get_default();
108     if (defaultScreen) {
109         int width = defaultScreen->get_width();
110         int height = defaultScreen->get_height();
111         gdouble aspect = static_cast<gdouble>(width) / static_cast<gdouble>(height);
112         if (aspect > 1.4) {
113             _widescreen = true;
114         }
115     }
118 UXManagerImpl::~UXManagerImpl()
122 bool UXManagerImpl::isFloatWindowProblem() const
124     return _floatwindowIssues;
127 bool UXManagerImpl::isWidescreen() const
129     return _widescreen;
132 void UXManagerImpl::setTask(SPDesktop* dt, gint val)
134     for (vector<SPDesktopWidget*>::iterator it = dtws.begin(); it != dtws.end(); ++it) {
135         SPDesktopWidget* dtw = *it;
137         gboolean notDone = Inkscape::Preferences::get()->getBool("/options/workarounds/dynamicnotdone", false);
139         if (dtw->desktop == dt) {
140             switch (val) {
141                 default:
142                 case 0:
143                     dtw->setToolboxPosition("ToolToolbar", GTK_POS_LEFT);
144                     dtw->setToolboxPosition("CommandsToolbar", GTK_POS_TOP);
145                     if (notDone) {
146                         dtw->setToolboxPosition("AuxToolbar", GTK_POS_TOP);
147                     }
148                     dtw->setToolboxPosition("SnapToolbar", GTK_POS_TOP);
149                     break;
150                 case 1:
151                     dtw->setToolboxPosition("ToolToolbar", GTK_POS_TOP);
152                     dtw->setToolboxPosition("CommandsToolbar", GTK_POS_LEFT);
153                     if (notDone) {
154                         dtw->setToolboxPosition("AuxToolbar", GTK_POS_TOP);
155                     }
156                     dtw->setToolboxPosition("SnapToolbar", GTK_POS_RIGHT);
157                     break;
158                 case 2:
159                     dtw->setToolboxPosition("ToolToolbar", GTK_POS_LEFT);
160                     dtw->setToolboxPosition("CommandsToolbar", GTK_POS_RIGHT);
161                     dtw->setToolboxPosition("SnapToolbar", GTK_POS_RIGHT);
162                     if (notDone) {
163                         dtw->setToolboxPosition("AuxToolbar", GTK_POS_RIGHT);
164                     }
165             }
166         }
167     }
171 void UXManagerImpl::addTrack( SPDesktopWidget* dtw )
173     if (std::find(dtws.begin(), dtws.end(), dtw) == dtws.end()) {
174         dtws.push_back(dtw);
175     }
178 void UXManagerImpl::delTrack( SPDesktopWidget* dtw )
180     vector<SPDesktopWidget*>::iterator iter = std::find(dtws.begin(), dtws.end(), dtw);
181     if (iter != dtws.end()) {
182         dtws.erase(iter);
183     }
186 void UXManagerImpl::connectToDesktop( vector<GtkWidget *> const & toolboxes, SPDesktop *desktop )
188     //static map<SPDesktop*, vector<GtkWidget*> > trackedBoxes;
190     for (vector<GtkWidget*>::const_iterator it = toolboxes.begin(); it != toolboxes.end(); ++it ) {
191         GtkWidget* toolbox = *it;
193         ToolboxFactory::setToolboxDesktop( toolbox, desktop );
194         vector<GtkWidget*>& tracked = trackedBoxes[desktop];
195         if (find(tracked.begin(), tracked.end(), toolbox) == tracked.end()) {
196             tracked.push_back(toolbox);
197         }
198     }
200     if (std::find(desktops.begin(), desktops.end(), desktop) == desktops.end()) {
201         desktops.push_back(desktop);
202     }
206 } // namespace UI
207 } // namespace Inkscape
209 /*
210   Local Variables:
211   mode:c++
212   c-file-style:"stroustrup"
213   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
214   indent-tabs-mode:nil
215   fill-column:99
216   End:
217 */
218 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :