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 }
116 }
118 UXManagerImpl::~UXManagerImpl()
119 {
120 }
122 bool UXManagerImpl::isFloatWindowProblem() const
123 {
124 return _floatwindowIssues;
125 }
127 bool UXManagerImpl::isWidescreen() const
128 {
129 return _widescreen;
130 }
132 void UXManagerImpl::setTask(SPDesktop* dt, gint val)
133 {
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 }
168 }
171 void UXManagerImpl::addTrack( SPDesktopWidget* dtw )
172 {
173 if (std::find(dtws.begin(), dtws.end(), dtw) == dtws.end()) {
174 dtws.push_back(dtw);
175 }
176 }
178 void UXManagerImpl::delTrack( SPDesktopWidget* dtw )
179 {
180 vector<SPDesktopWidget*>::iterator iter = std::find(dtws.begin(), dtws.end(), dtw);
181 if (iter != dtws.end()) {
182 dtws.erase(iter);
183 }
184 }
186 void UXManagerImpl::connectToDesktop( vector<GtkWidget *> const & toolboxes, SPDesktop *desktop )
187 {
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 }
203 }
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 :