summaryrefslogtreecommitdiffstats
path: root/src/inkscape-window.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/inkscape-window.cpp')
-rw-r--r--src/inkscape-window.cpp87
1 files changed, 75 insertions, 12 deletions
diff --git a/src/inkscape-window.cpp b/src/inkscape-window.cpp
index 6f1a5316c..be8737c8f 100644
--- a/src/inkscape-window.cpp
+++ b/src/inkscape-window.cpp
@@ -17,8 +17,13 @@
#include "inkscape-window.h"
#include "inkscape.h" // SP_ACTIVE_DESKTOP
+#include "enums.h" // PREFS_WINDOW_GEOMETRY_NONE
#include "shortcuts.h"
-#include "inkscape-application.h"
+
+#include "object/sp-namedview.h" // TODO Remove need for this!
+
+#include "ui/drag-and-drop.h" // Move to canvas?
+#include "ui/monitor.h" // get_monitor_geometry_at_point()
#include "ui/drag-and-drop.h"
@@ -32,6 +37,7 @@ InkscapeWindow::InkscapeWindow(SPDocument* document)
return;
}
+ // Register window with application.
Glib::RefPtr<Gio::Application> gio_app = Gio::Application::get_default();
Glib::RefPtr<Gtk::Application> app = Glib::RefPtr<Gtk::Application>::cast_dynamic(gio_app);
if (app) {
@@ -42,22 +48,79 @@ InkscapeWindow::InkscapeWindow(SPDocument* document)
set_resizable(true);
- // Set up drag-and-drop, probably should be moved to SPCanvas.
sp_ui_drag_setup(this);
- // Callbacks
+ // =============== Build interface ===============
+
+ // Main box
+ _mainbox = Gtk::manage(new Gtk::Box);
+ _mainbox->set_name("DesktopMainBox");
+ _mainbox->show();
+ add(*_mainbox);
+
+ // Menu bar
+
+ // Desktop widget (=> MultiPaned)
+ SPViewWidget* _vw = sp_desktop_widget_new(sp_document_namedview(document, nullptr));
+ _desktop_widget = reinterpret_cast<SPDesktopWidget*>(_vw);
+ gtk_container_add(GTK_CONTAINER(_mainbox->gobj()), GTK_WIDGET(_desktop_widget));
+ gtk_widget_show(GTK_WIDGET(_desktop_widget));
+ _desktop = _desktop_widget->desktop;
+
+ // Pallet
+
+ // Status bar
+
+ // ================== Callbacks ==================
signal_key_press_event().connect(sigc::mem_fun(*this, &InkscapeWindow::key_press));
- // Actions
-}
+ // =================== Actions ===================
+
+
+ // ============ Stuff to be cleaned up ===========
+
+ g_object_set_data(G_OBJECT(_desktop_widget), "window", this);
+ _desktop_widget->window = this;
+
+ set_data("desktop", _desktop);
+ set_data("desktopwidget", _desktop_widget);
+
+ signal_delete_event().connect( sigc::mem_fun(*_desktop, &SPDesktop::onDeleteUI));
+ signal_window_state_event().connect(sigc::mem_fun(*_desktop, &SPDesktop::onWindowStateEvent));
+ signal_focus_in_event().connect(sigc::mem_fun(*_desktop_widget, &SPDesktopWidget::onFocusInEvent));
+
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ int window_geometry = prefs->getInt("/options/savewindowgeometry/value", PREFS_WINDOW_GEOMETRY_NONE);
+ if (window_geometry == PREFS_WINDOW_GEOMETRY_LAST) {
+ gint pw = prefs->getInt("/desktop/geometry/width", -1);
+ gint ph = prefs->getInt("/desktop/geometry/height", -1);
+ gint px = prefs->getInt("/desktop/geometry/x", -1);
+ gint py = prefs->getInt("/desktop/geometry/y", -1);
+ gint full = prefs->getBool("/desktop/geometry/fullscreen");
+ gint maxed = prefs->getBool("/desktop/geometry/maximized");
+ if (pw>0 && ph>0) {
+ Gdk::Rectangle monitor_geometry = Inkscape::UI::get_monitor_geometry_at_point(px, py);
+ pw = std::min(pw, monitor_geometry.get_width());
+ ph = std::min(ph, monitor_geometry.get_height());
+ _desktop->setWindowSize(pw, ph);
+ _desktop->setWindowPosition(Geom::Point(px, py));
+ }
+ if (maxed) {
+ maximize();
+ }
+ if (full) {
+ fullscreen();
+ }
+ }
+
+ // ================ Window Options ==============
+
+ show(); // Must show before resize!
+
+ // Resize the window to match the document properties
+ sp_namedview_window_from_document(_desktop);
+ sp_namedview_update_layers_from_document(_desktop);
-// TEMP: We should be creating the desktop widget and desktop in constructor.
-void
-InkscapeWindow::set_desktop_widget(SPDesktopWidget* desktop_widget)
-{
- gtk_container_add(GTK_CONTAINER(gobj()), GTK_WIDGET(desktop_widget));
- gtk_widget_show(GTK_WIDGET(desktop_widget));
- _desktop = desktop_widget->desktop;
}
bool