PieDock 1.6.0

src/Settings.h

00001 /*
00002  *   O         ,-
00003  *  ° o    . -´  '     ,-
00004  *   °  .´        ` . ´,´
00005  *     ( °   ))     . (
00006  *      `-;_    . -´ `.`.
00007  *          `._'       ´
00008  *
00009  * Copyright (c) 2007-2012 Markus Fisch <mf@markusfisch.de>
00010  *
00011  * Licensed under the MIT license:
00012  * http://www.opensource.org/licenses/mit-license.php
00013  */
00014 #ifndef _PieDock_Settings_
00015 #define _PieDock_Settings_
00016 
00017 #include "MenuItems.h"
00018 #include "IconMap.h"
00019 #include "ActiveIndicator.h"
00020 #include "Text.h"
00021 #include "WorkspaceLayout.h"
00022 
00023 #include <X11/Xlib.h>
00024 #include <vector>
00025 #include <string>
00026 #include <istream>
00027 #include <stdexcept>
00028 
00029 namespace PieDock
00030 {
00036     class Settings
00037     {
00038         public:
00039             enum Action
00040             {
00041                 NoAction,
00042                 Launch,
00043                 ShowNext,
00044                 ShowPrevious,
00045                 ShowWindows,
00046                 Hide,
00047                 Close,
00048                 SpinUp,
00049                 SpinDown,
00050                 SpinNext,
00051                 SpinPrevious,
00052                 Disappear
00053             };
00054 
00055             enum CenterAction
00056             {
00057                 CenterIgnore,
00058                 CenterNearestIcon,
00059                 CenterDisappear
00060             };
00061 
00062             typedef struct Trigger
00063             {
00064                 unsigned int modifier;
00065                 union
00066                 {
00067                     unsigned int button;
00068                     KeySym keySym;
00069                 };
00070                 std::string menuName;
00071                 unsigned int eventMask;
00072             } Key, Button;
00073 
00074             typedef struct
00075             {
00076                 unsigned int button;
00077                 Action action;
00078             } ButtonFunction;
00079 
00080             typedef struct
00081             {
00082                 KeySym keySym;
00083                 Action action;
00084                 unsigned int eventType;
00085             } KeyFunction;
00086 
00087             typedef struct
00088             {
00089                 int cornerRadius;
00090                 int alpha;
00091                 unsigned int color;
00092             } CartoucheSettings;
00093 
00094             typedef struct
00095             {
00096                 bool visible;
00097                 WorkspaceLayout::PreferredVirtualLayout preferredLayout;
00098                 unsigned int workspaceColor;
00099                 unsigned int windowColor;
00100             } WorkspaceDisplaySettings;
00101 
00102             typedef std::vector<Key> Keys;
00103             typedef std::vector<Button> Buttons;
00104             typedef std::vector<ButtonFunction> ButtonFunctions;
00105             typedef std::vector<KeyFunction> KeyFunctions;
00106             typedef std::map<std::string, MenuItems> Menus;
00107             typedef std::map<std::string, bool> WindowsToIgnore;
00108 
00109             Settings() {}
00110             virtual ~Settings() { clearMenus(); }
00111             inline const std::string &getConfigurationFile() const {
00112                 return configurationFile; }
00113             inline void setConfigurationFile( std::string s ) {
00114                 configurationFile = s; }
00115             inline const int &getWidth() const { return width; }
00116             inline const int &getHeight() const { return height; }
00117 #ifdef HAVE_XRENDER
00118             inline const bool &useCompositing() const { return compositing; }
00119 #endif
00120             inline Keys &getKeys() { return keys; }
00121             inline Buttons &getButtons() { return buttons; }
00122             inline KeyFunctions &getKeyFunctions() {
00123                 return keyFunctions; }
00124             inline IconMap &getIconMap() { return iconMap; }
00125             inline MenuItems *getMenu( std::string s ) {
00126                 Menus::iterator i = menus.find( s );
00127                 if( i == menus.end() )
00128                     return 0;
00129                 return &(*i).second; }
00130             inline bool ignoreWindow( std::string s ) {
00131                 return (windowsToIgnore.find( s ) != windowsToIgnore.end()); }
00132             inline ActiveIndicator &getActiveIndicator() {
00133                 return activeIndicator; }
00134             inline const int &getFocusedAlpha() const { return focusedAlpha; }
00135             inline const int &getUnfocusedAlpha() const {
00136                 return unfocusedAlpha; }
00137             inline const double &getStartRadius() const {
00138                 return startRadius; }
00139             inline const bool &isFitts() const { return fitts; }
00140             inline const double &getZoomModifier() const {
00141                 return zoomModifier; }
00142             inline const CenterAction &getCenterAction() const {
00143                 return centerAction; }
00144             inline const double &getSpinStep() const { return spinStep; }
00145             inline const bool &getShowTitle() const { return showTitle; }
00146             inline const Text::Font &getTitleFont() const { return titleFont; }
00147             inline const CartoucheSettings &getCartoucheSettings() const {
00148                 return cartoucheSettings; }
00149             inline const int &getMinimumNumber() const { return minimumNumber; }
00150             inline const WorkspaceDisplaySettings
00151                 &getWorkspaceDisplaySettings() const {
00152                 return workspaceDisplaySettings; }
00153             virtual void setConfigurationFileFromBinary( std::string );
00154             virtual ButtonFunctions getButtonFunctions(
00155                 const std::string &menu = std::string(),
00156                 MenuItem *item = 0 );
00157             virtual void load( Display *d );
00158 
00159         protected:
00160             virtual int readMenu( std::istream &, int, std::string );
00161             virtual void clearMenus();
00162             virtual Action resolveActionString( const std::string & ) const;
00163             virtual unsigned int resolveButtonCode( const std::string & ) const;
00164             virtual void throwParsingError( const char *, unsigned int ) const;
00165             virtual void presizeIcon( Icon *, int, int, int, int, int, int );
00166 
00167         private:
00171             class Statement : public std::string
00172             {
00173                 public:
00174                     Statement( const char *s ) : std::string( s ) {}
00175                     Statement( std::string s ) : std::string( s ) {}
00176                     Statement() : std::string() {}
00177                     virtual ~Statement() {}
00178                     void cutComments( const char = '#' );
00179                     std::vector<std::string> split( const char * = " \t" );
00180 
00181                 private:
00182                     bool tokenize( const char *,
00183                         std::string::size_type &,
00184                         std::string::size_type & );
00185                     std::string trim( std::string,
00186                         const char * = " \t\r\n\"" );
00187             };
00188 
00189             std::string configurationFile;
00190             int width;
00191             int height;
00192             Keys keys;
00193             Buttons buttons;
00194             ButtonFunctions buttonFunctions;
00195             std::map<MenuItem *, ButtonFunctions> itemButtonFunctions;
00196             std::map<std::string, ButtonFunctions> menuButtonFunctions;
00197             KeyFunctions keyFunctions;
00198             IconMap iconMap;
00199             Menus menus;
00200             WindowsToIgnore windowsToIgnore;
00201             ActiveIndicator activeIndicator;
00202             int focusedAlpha;
00203             int unfocusedAlpha;
00204             double startRadius;
00205             bool fitts;
00206             double zoomModifier;
00207             CenterAction centerAction;
00208             double spinStep;
00209             bool showTitle;
00210             Text::Font titleFont;
00211             CartoucheSettings cartoucheSettings;
00212             int minimumNumber;
00213             WorkspaceDisplaySettings workspaceDisplaySettings;
00214 #ifdef HAVE_XRENDER
00215             bool compositing;
00216 #endif
00217     };
00218 }
00219 
00220 #endif