commit 4df4ee18c1acbc9fdad4e2395a8384190ff420db Author: Jason Klein trac.torproject.org@my.jrklein.com Date: Sun Apr 17 17:13:25 2011 -0500
Implement Icon Preference (appearance setting) in OSX (see #2163)
Updated the Appearance settings page to include an Icon Preference group box with three new radio options: Show Tray Icon and Dock Icon Hide the Dock Icon Hide the Tray Icon
In order to hide the Dock Icon, I had to create a custom Info.plist file with LSUIElement set to "1" so OSX would launch Vidalia in the background (without Dock Icon). I then use TransformProcessType to force Vidalia to the foreground (show Dock Icon).
Hiding the Tray Icon was trival. I only call "_trayIcon.setIcon" if the user wants to see the System/Tray Icon.
By default, the user will continue to see Tray Icon and Dock Icon. --- pkg/osx/MacOSXBundleInfo.plist.in | 38 ++++++++++++++++++++++ src/vidalia/CMakeLists.txt | 3 ++ src/vidalia/MainWindow.cpp | 22 ++++++++++++- src/vidalia/config/AppearancePage.cpp | 28 ++++++++++++++++ src/vidalia/config/AppearancePage.ui | 55 ++++++++++++++++++++++++++++++++ src/vidalia/config/VidaliaSettings.cpp | 17 ++++++++++ src/vidalia/config/VidaliaSettings.h | 6 +++ 7 files changed, 168 insertions(+), 1 deletions(-)
diff --git a/pkg/osx/MacOSXBundleInfo.plist.in b/pkg/osx/MacOSXBundleInfo.plist.in new file mode 100644 index 0000000..3b5bfe0 --- /dev/null +++ b/pkg/osx/MacOSXBundleInfo.plist.in @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>${MACOSX_BUNDLE_EXECUTABLE_NAME}</string> + <key>CFBundleGetInfoString</key> + <string>${MACOSX_BUNDLE_INFO_STRING}</string> + <key>CFBundleIconFile</key> + <string>${MACOSX_BUNDLE_ICON_FILE}</string> + <key>CFBundleIdentifier</key> + <string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleLongVersionString</key> + <string>${MACOSX_BUNDLE_LONG_VERSION_STRING}</string> + <key>CFBundleName</key> + <string>${MACOSX_BUNDLE_BUNDLE_NAME}</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleShortVersionString</key> + <string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string> + <key>CSResourcesFileMapped</key> + <true/> + <key>LSRequiresCarbon</key> + <true/> + <key>NSHumanReadableCopyright</key> + <string>${MACOSX_BUNDLE_COPYRIGHT}</string> + <key>LSUIElement</key> + <string>1</string> +</dict> +</plist> diff --git a/src/vidalia/CMakeLists.txt b/src/vidalia/CMakeLists.txt index 08fb510..be3e012 100644 --- a/src/vidalia/CMakeLists.txt +++ b/src/vidalia/CMakeLists.txt @@ -361,6 +361,9 @@ if (APPLE) set(CMAKE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}/) add_executable(${vidalia_BIN} MACOSX_BUNDLE ${vidalia_SRCS})
+ ## Specify location of custom Info.plist file + set_target_properties(${vidalia_BIN} PROPERTIES MACOSX_BUNDLE_INFO_PLIST ../pkg/osx/MacOSXBundleInfo.plist.in) + ## Get the location of the app bundle for the current configuration get_target_property(VIDALIA_EXECUTABLE ${vidalia_BIN} LOCATION) get_filename_component(MACOSX_BUNDLE_DIRECTORY ${VIDALIA_EXECUTABLE} PATH) diff --git a/src/vidalia/MainWindow.cpp b/src/vidalia/MainWindow.cpp index b159d2e..967e2df 100644 --- a/src/vidalia/MainWindow.cpp +++ b/src/vidalia/MainWindow.cpp @@ -39,6 +39,10 @@ #include <QTimer> #include <QTextStream>
+#ifdef Q_WS_MAC +#include <Carbon/Carbon.h> +#endif + #define IMG_BWGRAPH ":/images/16x16/utilities-system-monitor.png" #define IMG_CONTROL_PANEL ":/images/16x16/system-run.png" #define IMG_MESSAGELOG ":/images/16x16/format-justify-fill.png" @@ -215,6 +219,16 @@ MainWindow::MainWindow() show(); /* Optimistically hope that the tray icon gets added. */ _trayIcon.show(); + +#if defined(Q_WS_MAC) + /* Display OSX dock icon if icon preference is not set to "Tray Only" */ + if (settings.getIconPref() != "Tray") { + ProcessSerialNumber psn = { 0, kCurrentProcess }; + TransformProcessType(&psn, kProcessTransformToForegroundApplication); + } + /* Vidalia launched in background (LSUIElement=true). Bring to foreground. */ + VidaliaWindow::setVisible(true); +#endif }
/** Destructor. */ @@ -572,9 +586,15 @@ void MainWindow::setTrayIcon(const QString &iconFile) { #if defined(Q_WS_MAC) + VidaliaSettings settings; QApplication::setWindowIcon(QPixmap(iconFile)); -#endif + /* only display tray icon if icon preference is not set to "Dock Only" */ + if (settings.getIconPref() != "Dock") + _trayIcon.setIcon(QIcon(iconFile)); +#else + /* always display tray icon for other platforms */ _trayIcon.setIcon(QIcon(iconFile)); +#endif }
/** Respond to a double-click on the tray icon by opening the Control Panel diff --git a/src/vidalia/config/AppearancePage.cpp b/src/vidalia/config/AppearancePage.cpp index 11939c3..647b67a 100644 --- a/src/vidalia/config/AppearancePage.cpp +++ b/src/vidalia/config/AppearancePage.cpp @@ -72,6 +72,21 @@ AppearancePage::save(QString &errmsg) /* Set the new style */ Vidalia::setStyle(ui.cmboStyle->currentText()); _settings->setInterfaceStyle(ui.cmboStyle->currentText()); + +#if defined(Q_WS_MAC) + /* Save new icon preference */ + if(ui.rdoIconPrefDock->isChecked()) { + _settings->setIconPref("Dock"); + } + else if(ui.rdoIconPrefTray->isChecked()) { + _settings->setIconPref("Tray"); + } + else { + /* default setting */ + _settings->setIconPref("Both"); + } +#endif + return true; }
@@ -84,5 +99,18 @@ AppearancePage::load()
index = ui.cmboStyle->findData(Vidalia::style().toLower()); ui.cmboStyle->setCurrentIndex(index); + +#if defined(Q_WS_MAC) + /* set current icon preference */ + ui.rdoIconPrefBoth->setChecked(_settings->getIconPref() == "Both"); + ui.rdoIconPrefTray->setChecked(_settings->getIconPref() == "Tray"); + ui.rdoIconPrefDock->setChecked(_settings->getIconPref() == "Dock"); +#else + /* hide preference on non-OSX platforms */ + ui.grpIconPref->setVisible(false); + ui.rdoIconPrefBoth->setVisible(false); + ui.rdoIconPrefTray->setVisible(false); + ui.rdoIconPrefDock->setVisible(false); +#endif }
diff --git a/src/vidalia/config/AppearancePage.ui b/src/vidalia/config/AppearancePage.ui index 8672af3..ef7ef5f 100644 --- a/src/vidalia/config/AppearancePage.ui +++ b/src/vidalia/config/AppearancePage.ui @@ -111,6 +111,61 @@ </widget> </item> <item> + <widget class="QGroupBox" name="grpIconPref"> + <property name="minimumSize"> + <size> + <width>0</width> + <height>100</height> + </size> + </property> + <property name="contextMenuPolicy"> + <enum>Qt::PreventContextMenu</enum> + </property> + <property name="title"> + <string>System Icon Preferences (changes will take effect when you restart Vidalia)</string> + </property> + <widget class="QRadioButton" name="rdoIconPrefBoth"> + <property name="geometry"> + <rect> + <x>20</x> + <y>30</y> + <width>441</width> + <height>20</height> + </rect> + </property> + <property name="text"> + <string>Show the Tray Icon and Dock Icon (default)</string> + </property> + </widget> + <widget class="QRadioButton" name="rdoIconPrefDock"> + <property name="geometry"> + <rect> + <x>20</x> + <y>70</y> + <width>441</width> + <height>20</height> + </rect> + </property> + <property name="text"> + <string>Hide the Tray Icon</string> + </property> + </widget> + <widget class="QRadioButton" name="rdoIconPrefTray"> + <property name="geometry"> + <rect> + <x>20</x> + <y>50</y> + <width>441</width> + <height>20</height> + </rect> + </property> + <property name="text"> + <string>Hide the Dock Icon</string> + </property> + </widget> + </widget> + </item> + <item> <spacer> <property name="orientation" > <enum>Qt::Vertical</enum> diff --git a/src/vidalia/config/VidaliaSettings.cpp b/src/vidalia/config/VidaliaSettings.cpp index 0812b03..858ca8e 100644 --- a/src/vidalia/config/VidaliaSettings.cpp +++ b/src/vidalia/config/VidaliaSettings.cpp @@ -45,6 +45,9 @@ #define VIDALIA_REG_KEY "Vidalia" #endif
+#if defined(Q_WS_MAC) +#define SETTING_ICON_PREF "IconPref" +#endif
/** Default Constructor */ VidaliaSettings::VidaliaSettings() @@ -82,6 +85,7 @@ VidaliaSettings::VidaliaSettings() setDefault(SETTING_LAST_UPDATE_CHECK, QDateTime()); setDefault(SETTING_USE_LOCAL_GEOIP_DATABASE, false); setDefault(SETTING_LOCAL_GEOIP_DATABASE, ""); + setDefault(SETTING_ICON_PREF, "Both"); }
/** Gets the currently preferred language code for Vidalia. */ @@ -321,3 +325,16 @@ VidaliaSettings::setLocalGeoIpDatabase(const QString &databaseFile) setValue(SETTING_LOCAL_GEOIP_DATABASE, databaseFile); }
+/** Get the icon preference */ +QString +VidaliaSettings::getIconPref() const +{ + return value(SETTING_ICON_PREF).toString(); +} + +/** Set the icon preference */ +void +VidaliaSettings::setIconPref(const QString &iconPref) +{ + setValue(SETTING_ICON_PREF, iconPref); +} diff --git a/src/vidalia/config/VidaliaSettings.h b/src/vidalia/config/VidaliaSettings.h index 2667b12..2efec12 100644 --- a/src/vidalia/config/VidaliaSettings.h +++ b/src/vidalia/config/VidaliaSettings.h @@ -125,6 +125,12 @@ public: QString localGeoIpDatabase() const; /** Sets the file to use as a local GeoIP database. */ void setLocalGeoIpDatabase(const QString &databaseFile); + + /** Get the icon preference */ + QString getIconPref() const; + + /** Set the icon preference */ + void setIconPref(const QString &iconPref); };
#endif