Add default configs, Implement saving config files.
authorHong Jen Yee (PCMan) <pcman.tw@gmail.com>
Fri, 8 Nov 2013 18:38:19 +0000 (02:38 +0800)
committerHong Jen Yee (PCMan) <pcman.tw@gmail.com>
Fri, 8 Nov 2013 18:38:19 +0000 (02:38 +0800)
CMakeLists.txt
compton-conf.cpp
compton.conf.example [new file with mode: 0644]
maindialog.cpp
maindialog.h

index 8ce6eb6..65926a7 100644 (file)
@@ -3,14 +3,16 @@ project(compton-conf)
 cmake_minimum_required(VERSION 2.8.6)
 
 # Qt
-find_package(Qt4 REQUIRED QtCore QtGui)
+find_package(Qt4 REQUIRED QtCore QtGui QtDbus)
 
 # libconfig using pkg-config
-find_package(PkgConfig)
+find_package(PkgConfig REQUIRED)
 pkg_check_modules(LIBCONFIG REQUIRED
   libconfig
 )
 
+include(GNUInstallDirs REQUIRED)
+
 set(CMAKE_CXX_FLAGS "-DQT_NO_KEYWORDS -fno-exceptions")
 
 include_directories(
@@ -34,6 +36,10 @@ qt4_wrap_ui(compton-conf_UI_H
   ${compton-conf_UIS}
 )
 
+add_definitions(
+  -DCOMPTON_CONF_DATA_DIR="${CMAKE_INSTALL_FULL_DATADIR}/compton-conf"
+)
+
 add_executable(compton-conf
   ${compton-conf_SRCS}
   ${compton-conf_UI_H}
@@ -42,10 +48,12 @@ add_executable(compton-conf
 target_link_libraries(compton-conf
   ${QT_QTCORE_LIBRARY}
   ${QT_QTGUI_LIBRARY}
+  ${QT_QTDBUS_LIBRARY}
   ${LIBCONFIG_LIBRARIES}
 )
 
 install(TARGETS compton-conf RUNTIME DESTINATION bin)
+install(FILES compton.conf.example DESTINATION ${CMAKE_INSTALL_DATADIR}/compton-conf)
 
 # building tarball with CPack -------------------------------------------------
 # To create a source distribution, type:
index 3f82525..045e17a 100644 (file)
@@ -1,33 +1,10 @@
 #include "compton-conf.h"
 #include <QApplication>
-#include <QDir>
-#include <QFile>
 #include "maindialog.h"
-#include <libconfig.h>
-#include <stdio.h>
 
 int main(int argc, char** argv) {
     QApplication app(argc, argv);
-
-    // find config file
-    QString userConfigFile = qgetenv("XDG_CONFIG_HOME");
-    if(userConfigFile.isEmpty()) {
-      userConfigFile = QDir::homePath();
-      userConfigFile += "/.config";
-    }
-    // QDir configDir = QDir(userConfigFile);
-    // if(!configDir.exists())
-    userConfigFile += "/compton.conf";
-
-    // load config file
-    config_t cfg;
-    config_init(&cfg);
-    if(config_read_file(&cfg, userConfigFile.toLocal8Bit().constData()) == CONFIG_FALSE) {
-      // loading user config file failed
-      // try our default example
-    }
-
-    MainDialog dlg(&cfg);
+    MainDialog dlg;
     dlg.exec();
     return 0;
 }
diff --git a/compton.conf.example b/compton.conf.example
new file mode 100644 (file)
index 0000000..c444b30
--- /dev/null
@@ -0,0 +1,77 @@
+# Shadow
+shadow = true;
+no-dnd-shadow = true;
+no-dock-shadow = true;
+clear-shadow = true;
+shadow-radius = 7;
+shadow-offset-x = -7;
+shadow-offset-y = -7;
+# shadow-opacity = 0.7;
+# shadow-red = 0.0;
+# shadow-green = 0.0;
+# shadow-blue = 0.0;
+shadow-exclude = [ "name = 'Notification'", "class_g = 'Conky'", "class_g ?= 'Notify-osd'", "class_g = 'Cairo-clock'" ];
+# shadow-exclude = "n:e:Notification";
+shadow-ignore-shaped = false;
+# shadow-exclude-reg = "x10+0+0";
+# xinerama-shadow-crop = true;
+
+# Opacity
+menu-opacity = 0.8;
+inactive-opacity = 0.8;
+# active-opacity = 0.8;
+frame-opacity = 0.7;
+inactive-opacity-override = false;
+alpha-step = 0.06;
+# inactive-dim = 0.2;
+# inactive-dim-fixed = true;
+# blur-background = true;
+# blur-background-frame = true;
+blur-kern = "3x3box"
+# blur-kern = "5,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1"
+# blur-background-fixed = true;
+blur-background-exclude = [ "window_type = 'dock'", "window_type = 'desktop'" ];
+# opacity-rule = [ "80:class_g = 'URxvt'" ];
+
+# Fading
+fading = true;
+# fade-delta = 30;
+fade-in-step = 0.03;
+fade-out-step = 0.03;
+# no-fading-openclose = true;
+fade-exclude = [ ];
+
+# Other
+backend = "xrender"
+mark-wmwin-focused = true;
+mark-ovredir-focused = true;
+# use-ewmh-active-win = true;
+detect-rounded-corners = true;
+detect-client-opacity = true;
+refresh-rate = 0;
+vsync = "none";
+dbe = false;
+paint-on-overlay = true;
+# sw-opti = true;
+# unredir-if-possible = true;
+# unredir-if-possible-delay = 5000;
+# unredir-if-possible-exclude = [ ];
+focus-exclude = [ "class_g = 'Cairo-clock'" ];
+detect-transient = true;
+detect-client-leader = true;
+invert-color-include = [ ];
+# resize-damage = 1;
+
+# GLX backend
+# glx-no-stencil = true;
+glx-copy-from-front = false;
+# glx-use-copysubbuffermesa = true;
+# glx-no-rebind-pixmap = true;
+glx-swap-method = "undefined";
+# glx-use-gpushader4 = true;
+
+# Window type settings
+wintypes:
+{
+  tooltip = { fade = true; shadow = false; opacity = 0.75; focus = true; };
+};
index c2f704d..5896ec3 100644 (file)
 #include "maindialog.h"
 #include "ui_maindialog.h"
 #include <QDebug>
+#include <QDir>
+#include <QFile>
+#include <QFileInfo>
+#include <QDBusInterface>
+#include <QDBusConnection>
 
-MainDialog::MainDialog(config_t* cfg) : config_(cfg) {
+// dbus interface of compton
+#define COMPTON_SERVICE    "com.github.chjj.compton._0"
+#define COMPTON_PATH       "/"
+#define COMPTON_INTERFACE  "com.github.chjj.compton"
+
+
+MainDialog::MainDialog(QString userConfigFile) {
   ui = new Ui::MainDialog;
   ui->setupUi(this);
 
-    // set up signal handlers
+  if(userConfigFile.isEmpty()) {
+    userConfigFile_ = qgetenv("XDG_CONFIG_HOME");
+    if(userConfigFile_.isEmpty()) {
+      userConfigFile_ = QDir::homePath();
+      userConfigFile_ += "/.config";
+    }
+    // QDir configDir = QDir(userConfigFile);
+    // if(!configDir.exists())
+    userConfigFile_ += "/compton.conf";
+  }
+  else
+    userConfigFile_ = userConfigFile;
+
+  config_init(&config_);
+  if(config_read_file(&config_, userConfigFile_.toLocal8Bit().constData()) == CONFIG_FALSE) {
+    // loading user config file failed
+    // try our default example
+    qDebug() << "load fail, try " << COMPTON_CONF_DATA_DIR << "/compton.conf.example";
+    config_read_file(&config_, COMPTON_CONF_DATA_DIR "/compton.conf.example");
+  }
+
+  // set up signal handlers and initial values of the controls
+  // objectNames are kept the same as config file key names.
   Q_FOREACH(QWidget* child, findChildren<QWidget*>()) {
     if(!child->isWidgetType() || child->objectName().isEmpty())
       continue;
-    QString keyName = child->objectName().replace('_', '-');
+    // objectName uses _ while config file keys uses - as separator.
+    QByteArray keyName = child->objectName().replace('_', '-').toLatin1(); // generate config key from objectName.
     if(child->inherits("QCheckBox")) {
-      int val;
-      if(config_lookup_bool(config_, keyName.toLatin1().constData(), &val) == CONFIG_TRUE)
+      int val = -1;
+      if(config_lookup_bool(&config_, keyName.constData(), &val) == CONFIG_TRUE)
        static_cast<QCheckBox*>(child)->setChecked((bool)val);
       connect(child, SIGNAL(toggled(bool)), SLOT(onButtonToggled(bool)));
     }
     else if(child->inherits("QDoubleSpinBox")) {
       double val;
-      if(config_lookup_float(config_, keyName.toLatin1().constData(), &val) == CONFIG_TRUE)
+      if(config_lookup_float(&config_, keyName.constData(), &val) == CONFIG_TRUE)
        static_cast<QDoubleSpinBox*>(child)->setValue(val);
       connect(child, SIGNAL(valueChanged(double)), SLOT(onSpinValueChanged(double)));
     }
     else if(child->inherits("QSpinBox")) {
       int val;
-      if(config_lookup_int(config_, keyName.toLatin1().constData(), &val) == CONFIG_TRUE)
+      if(config_lookup_int(&config_, keyName.constData(), &val) == CONFIG_TRUE)
        static_cast<QSpinBox*>(child)->setValue(val);
       connect(child, SIGNAL(valueChanged(int)), SLOT(onSpinValueChanged(int)));
     }
@@ -53,17 +87,72 @@ MainDialog::MainDialog(config_t* cfg) : config_(cfg) {
 }
 
 MainDialog::~MainDialog() {
+  config_destroy(&config_);
     delete ui;
 }
 
 void MainDialog::onButtonToggled(bool checked) {
   qDebug() << "toggled: " << sender()->objectName();
+  // generate config key from objectName.
+  QByteArray keyName = sender()->objectName().replace('_', '-').toLatin1();
+  config_setting_t* setting = config_lookup(&config_, keyName.constData());
+  if(!setting) { // setting not found
+    // add a new setting for it
+    config_setting_t* root = config_root_setting(&config_);
+    setting = config_setting_add(root, keyName.constData(), CONFIG_TYPE_BOOL);
+  }
+  // set the value
+  config_setting_set_bool(setting, checked);
+  saveConfig();
 }
 
 void MainDialog::onSpinValueChanged(double d) {
   qDebug() << "changed: " << sender()->objectName() << ": " << d;
+  // generate config key from objectName.
+  QByteArray keyName = sender()->objectName().replace('_', '-').toLatin1();
+  config_setting_t* setting = config_lookup(&config_, keyName.constData());
+  if(!setting) { // setting not found
+    // add a new setting for it
+    config_setting_t* root = config_root_setting(&config_);
+    setting = config_setting_add(root, keyName.constData(), CONFIG_TYPE_FLOAT);
+  }
+  // set the value
+  config_setting_set_float(setting, d);
+  saveConfig();
 }
 
 void MainDialog::onSpinValueChanged(int i) {
   qDebug() << "changed: " << sender()->objectName() << ": " << i;
+  // generate config key from objectName.
+  QByteArray keyName = sender()->objectName().replace('_', '-').toLatin1();
+  config_setting_t* setting = config_lookup(&config_, keyName.constData());
+  if(!setting) { // setting not found
+    // add a new setting for it
+    config_setting_t* root = config_root_setting(&config_);
+    setting = config_setting_add(root, keyName.constData(), CONFIG_TYPE_INT);
+  }
+  // set the value
+  config_setting_set_int(setting, i);
+  saveConfig();
+}
+
+void MainDialog::saveConfig() {
+  // ensure the existance of user config dir
+  QString configDir = QFileInfo(userConfigFile_).dir().path();
+  QDir().mkpath(configDir);
+  qDebug() << userConfigFile_;
+  // save the config file
+  config_write_file(&config_, userConfigFile_.toLocal8Bit().constData());
+  
+  // ask compton to reload the config
+  QDBusInterface iface(COMPTON_SERVICE, COMPTON_PATH, COMPTON_INTERFACE);
+  if(iface.isValid())
+    iface.call("reset");
+  // FIXME: dbus interface of compton is not always available and reset() creates
+  // much flickers. Maybe we should use internal dbus method set_opts().
+  // Or, we can patch compton to do what we want.
+}
+
+void MainDialog::done(int res) {
+  QDialog::done(res);
 }
index d81c6a5..17865e6 100644 (file)
@@ -33,17 +33,23 @@ class MainDialog : public QDialog
 {
   Q_OBJECT
 public:
-  MainDialog(config_t* cfg);
+  MainDialog(QString userConfigFile = QString());
   ~MainDialog();
 
+  virtual void done(int res);
+
+private:
+  void saveConfig();
+
 private Q_SLOTS:
   void onButtonToggled(bool checked);
   void onSpinValueChanged(double d);
   void onSpinValueChanged(int i);
 
 private:
-    Ui::MainDialog* ui;
-    config_t* config_;
+  Ui::MainDialog* ui;
+  config_t config_;
+  QString userConfigFile_;
 };
 
 #endif // MAINDIALOG_H