Fix bugs in previous commit that caused FTBFS in synfig and ETL FTBFS with older...
[synfig.git] / synfig-studio / tags / stable / src / gtkmm / dockmanager.cpp
index 503aba2..8a5198c 100644 (file)
@@ -1,20 +1,22 @@
-/* === S I N F G =========================================================== */
+/* === S Y N F I G ========================================================= */
 /*!    \file dockmanager.cpp
 **     \brief Template File
 **
-**     $Id: dockmanager.cpp,v 1.2 2005/01/12 07:03:42 darco Exp $
+**     $Id$
 **
 **     \legal
-**     Copyright (c) 2002 Robert B. Quattlebaum Jr.
+**     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+**     Copyright (c) 2007, 2008 Chris Moore
 **
-**     This software and associated documentation
-**     are CONFIDENTIAL and PROPRIETARY property of
-**     the above-mentioned copyright holder.
+**     This package is free software; you can redistribute it and/or
+**     modify it under the terms of the GNU General Public License as
+**     published by the Free Software Foundation; either version 2 of
+**     the License, or (at your option) any later version.
 **
-**     You may not copy, print, publish, or in any
-**     other way distribute this software without
-**     a prior written agreement with
-**     the copyright holder.
+**     This package is distributed in the hope that it will be useful,
+**     but WITHOUT ANY WARRANTY; without even the implied warranty of
+**     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+**     General Public License for more details.
 **     \endlegal
 */
 /* ========================================================================= */
 #include <stdexcept>
 #include "dockable.h"
 #include "dockdialog.h"
-#include <sinfgapp/settings.h>
-#include <sinfgapp/main.h>
+#include <synfigapp/settings.h>
+#include <synfigapp/main.h>
 #include <gdkmm/general.h>
 
+#include "general.h"
+
 #endif
 
 /* === U S I N G =========================================================== */
 
 using namespace std;
 using namespace etl;
-using namespace sinfg;
+using namespace synfig;
 using namespace studio;
 
 /* === M A C R O S ========================================================= */
 
 /* === P R O C E D U R E S ================================================= */
 
-class studio::DockSettings : public sinfgapp::Settings
+class studio::DockSettings : public synfigapp::Settings
 {
        DockManager* dock_manager;
-       
+
 public:
        DockSettings(DockManager* dock_manager):dock_manager(dock_manager)
        {
-               sinfgapp::Main::settings().add_domain(this,"dock");
+               synfigapp::Main::settings().add_domain(this,"dock");
        }
-       
+
        virtual ~DockSettings()
        {
-               sinfgapp::Main::settings().remove_domain("dock");
+               synfigapp::Main::settings().remove_domain("dock");
        }
 #define SCALE_FACTOR   (1280)
-       virtual bool get_value(const sinfg::String& key_, sinfg::String& value)const
+       virtual bool get_value(const synfig::String& key_, synfig::String& value)const
        {
                int screen_w(Gdk::screen_width());
                int screen_h(Gdk::screen_height());
-               
+
                if(key_.size()>6 && String(key_.begin(),key_.begin()+6)=="dialog")try
                {
-                       sinfg::String key(key_.begin()+7,key_.end());
-                       int separator=key.find_first_of('.');
-                       int id(atoi(sinfg::String(key.begin(),key.begin()+separator).c_str()));
-                       key=sinfg::String(key.begin()+separator+1,key.end());
-                       
+                       synfig::String key(key_.begin()+7,key_.end());
+                       synfig::String::size_type separator=key.find_first_of('.');
+                       int id(atoi(synfig::String(key.begin(),key.begin()+separator).c_str()));
+                       key=synfig::String(key.begin()+separator+1,key.end());
+
                        DockDialog& dock_dialog(dock_manager->find_dock_dialog(id));
-                       
+
                        if(key=="contents_size")
                        {
                                dock_dialog.rebuild_sizes();
@@ -111,48 +115,56 @@ public:
                                return true;
                        }
                }catch (...) { return false; }
-               return sinfgapp::Settings::get_value(key_,value);
+               return synfigapp::Settings::get_value(key_,value);
        }
 
-       virtual bool set_value(const sinfg::String& key_,const sinfg::String& value)
+       virtual bool set_value(const synfig::String& key_,const synfig::String& value)
        {
                int screen_w(Gdk::screen_width());
                int screen_h(Gdk::screen_height());
 
                if(key_.size()>6 && String(key_.begin(),key_.begin()+6)=="dialog")
                {
-                       sinfg::String key(key_.begin()+7,key_.end());
-                       int separator=key.find_first_of('.');
-                       int id(atoi(sinfg::String(key.begin(),key.begin()+separator).c_str()));
-                       key=sinfg::String(key.begin()+separator+1,key.end());
-                       
+                       synfig::String key(key_.begin()+7,key_.end());
+                       synfig::String::size_type separator=key.find_first_of('.');
+                       int id(atoi(synfig::String(key.begin(),key.begin()+separator).c_str()));
+                       key=synfig::String(key.begin()+separator+1,key.end());
+
                        DockDialog& dock_dialog(dock_manager->find_dock_dialog(id));
 
                        if(key=="contents_size")
                        {
                                try {
-                                       
+                               int width, height;
+                               Gtk::IconSize::lookup(Gtk::IconSize(4),width,height);
                                vector<int> data;
-                               int n=0;
+                               String::size_type n=0;
                                String value_(value);
-                               while(value_.size() && (signed)value_.size()>n && n>=0){
+                               while(value_.size() && value_.size()>n){
                                        value_=String(value_.begin()+n,value_.end());
                                        int size;
                                        if(!strscanf(value_,"%d",&size))
                                                break;
+                                       if (size > SCALE_FACTOR) size = SCALE_FACTOR - 150;
+                                       if (size < 0) size = 0;
                                        size=size*screen_h/SCALE_FACTOR;
+
+                                       // prevent errors like this, by allowing space for at least the dockable's icon:
+                                       // ** CRITICAL **: clearlooks_style_draw_box_gap: assertion `height >= -1' failed
+                                       if (size < height + 9) size = height + 9;
+
                                        data.push_back(size);
 
                                        n=value_.find(" ");
-                                       if((unsigned)n!=String::npos)
-                                               n++;
-                                               
+                                       if(n==String::npos)
+                                               break;
+                                       n++;
                                }
                                dock_dialog.set_dock_book_sizes(data);
                                }
                                catch(...)
                                {
-                                       sinfg::error("Exception caught!!!");
+                                       synfig::error("Exception caught!!!");
                                        return false;
                                }
                                return true;
@@ -162,8 +174,14 @@ public:
                                int x,y;
                                if(!strscanf(value,"%d %d",&x, &y))
                                        return false;
+                               if (x > SCALE_FACTOR) x = SCALE_FACTOR - 150; if (x < 0) x = 0;
+                               if (y > SCALE_FACTOR) y = SCALE_FACTOR - 150; if (y < 0) y = 0;
                                x=x*screen_w/SCALE_FACTOR;
                                y=y*screen_h/SCALE_FACTOR;
+                               if(getenv("SYNFIG_WINDOW_POSITION_X_OFFSET"))
+                                       x += atoi(getenv("SYNFIG_WINDOW_POSITION_X_OFFSET"));
+                               if(getenv("SYNFIG_WINDOW_POSITION_Y_OFFSET"))
+                                       y += atoi(getenv("SYNFIG_WINDOW_POSITION_Y_OFFSET"));
                                dock_dialog.move(x,y);
                                return true;
                        }
@@ -172,6 +190,8 @@ public:
                                int x,y;
                                if(!strscanf(value,"%d %d",&x, &y))
                                        return false;
+                               if (x > SCALE_FACTOR) x = 150; if (x < 0) x = 0;
+                               if (y > SCALE_FACTOR) y = 150; if (y < 0) y = 0;
                                x=x*screen_w/SCALE_FACTOR;
                                y=y*screen_h/SCALE_FACTOR;
                                dock_dialog.set_default_size(x,y);
@@ -192,12 +212,12 @@ public:
                                return true;
                        }
                }
-               return sinfgapp::Settings::set_value(key_,value);
+               return synfigapp::Settings::set_value(key_,value);
        }
-       
+
        virtual KeyList get_key_list()const
        {
-               sinfgapp::Settings::KeyList ret(sinfgapp::Settings::get_key_list());
+               synfigapp::Settings::KeyList ret(synfigapp::Settings::get_key_list());
 
                std::list<DockDialog*>::const_iterator iter;
                for(iter=dock_manager->dock_dialog_list_.begin();iter!=dock_manager->dock_dialog_list_.end();++iter)
@@ -228,8 +248,8 @@ DockManager::~DockManager()
        while(!dockable_list_.empty())
        {
                Dockable* dockable(dockable_list_.back());
-               sinfg::info("DockManager::~DockManager(): Deleting dockable \"%s\"",dockable->get_name().c_str());
-               dockable_list_.pop_back();              
+               // synfig::info("DockManager::~DockManager(): Deleting dockable \"%s\"",dockable->get_name().c_str());
+               dockable_list_.pop_back();
                delete dockable;
        }
 }
@@ -238,7 +258,7 @@ void
 DockManager::register_dockable(Dockable& x)
 {
        dockable_list_.push_back(&x);
-       sinfg::info("DockManager::register_dockable(): Registered dockable \"%s\"",dockable_list_.back()->get_name().c_str());
+       // synfig::info("DockManager::register_dockable(): Registered dockable \"%s\"",dockable_list_.back()->get_name().c_str());
        signal_dockable_registered()(&x);
 }
 
@@ -252,7 +272,7 @@ DockManager::unregister_dockable(Dockable& x)
                {
                        x.detach();
                        dockable_list_.erase(iter);
-                       sinfg::info("DockManager::unregister_dockable(): \"%s\" has been Unregistered",x.get_name().c_str());
+                       synfig::info("DockManager::unregister_dockable(): \"%s\" has been Unregistered",x.get_name().c_str());
                        return true;
                }
        }
@@ -260,18 +280,18 @@ DockManager::unregister_dockable(Dockable& x)
 }
 
 Dockable&
-DockManager::find_dockable(const sinfg::String& x)
+DockManager::find_dockable(const synfig::String& x)
 {
        std::list<Dockable*>::iterator iter;
        for(iter=dockable_list_.begin();iter!=dockable_list_.end();++iter)
                if((*iter)->get_name()==x)
                        return **iter;
-       
+
        throw std::runtime_error("DockManager::find_dockable(): not found");
 }
 
 void
-DockManager::present(sinfg::String x)
+DockManager::present(synfig::String x)
 {
        try
        {
@@ -303,6 +323,6 @@ DockManager::find_dock_dialog(int id)const
        for(iter=dock_dialog_list_.begin();iter!=dock_dialog_list_.end();++iter)
                if((*iter)->get_id()==id)
                        return **iter;
-       
+
        throw std::runtime_error("DockManager::find_dock_dialog(int id)const: not found");
 }