diff --git a/src/command/command.c b/src/command/command.c index 191415ae..984812f5 100644 --- a/src/command/command.c +++ b/src/command/command.c @@ -1253,6 +1253,19 @@ static struct cmd_t command_defs[] = CMD_NOEXAMPLES }, + { "/tray", + cmd_tray, parse_args, 1, 1, &cons_tray_setting, + CMD_TAGS( + CMD_TAG_UI) + CMD_SYN( + "/tray on|off") + CMD_DESC( + "Display an icon in the tray that will indicate new messages.") + CMD_ARGS( + { "on|off", "Enable or disable tray icon." }) + CMD_NOEXAMPLES + }, + { "/intype", cmd_intype, parse_args, 1, 1, &cons_intype_setting, CMD_TAGS( @@ -3061,9 +3074,9 @@ _cmd_complete_parameters(ProfWin *window, const char *const input) jabber_conn_status_t conn_status = jabber_get_connection_status(); // autocomplete boolean settings - gchar *boolean_choices[] = { "/beep", "/intype", "/states", "/outtype", - "/flash", "/splash", "/chlog", "/grlog", "/history", "/vercheck", - "/privileges", "/presence", "/wrap", "/winstidy", "/carbons", "/encwarn", "/lastactivity" }; + gchar *boolean_choices[] = { "/beep", "/intype", "/states", "/outtype", "/flash", "/splash", "/chlog", "/grlog", + "/history", "/vercheck", "/privileges", "/presence", "/wrap", "/winstidy", "/carbons", "/encwarn", + "/lastactivity", "/tray" }; for (i = 0; i < ARRAY_SIZE(boolean_choices); i++) { result = autocomplete_param_with_func(input, boolean_choices[i], prefs_autocomplete_boolean_choice); diff --git a/src/command/commands.c b/src/command/commands.c index 8d32237b..c60a3a3e 100644 --- a/src/command/commands.c +++ b/src/command/commands.c @@ -77,6 +77,9 @@ #include "ui/ui.h" #include "window_list.h" #include "event/client_events.h" +#ifdef HAVE_GTK +#include "tray.h" +#endif static void _update_presence(const resource_presence_t presence, const char *const show, gchar **args); @@ -5525,6 +5528,27 @@ cmd_flash(ProfWin *window, const char *const command, gchar **args) return _cmd_set_boolean_preference(args[0], command, "Screen flash", PREF_FLASH); } +gboolean +cmd_tray(ProfWin *window, const char *const command, gchar **args) +{ +#ifdef HAVE_GTK + gboolean old = prefs_get_boolean(PREF_TRAY); + gboolean ret = _cmd_set_boolean_preference(args[0], command, "Tray icon", PREF_TRAY); + gboolean new = prefs_get_boolean(PREF_TRAY); + if (old != new) { + if (new) { + create_tray(); + } else { + destroy_tray(); + } + } + return ret; +#else + cons_show("This version of Profanity has not been built with GTK Tray Icon support enabled"); + return TRUE; +#endif +} + gboolean cmd_intype(ProfWin *window, const char *const command, gchar **args) { diff --git a/src/command/commands.h b/src/command/commands.h index 3e1a4592..cfa9d966 100644 --- a/src/command/commands.h +++ b/src/command/commands.h @@ -89,6 +89,7 @@ gboolean cmd_lastactivity(ProfWin *window, const char *const command, gchar **ar gboolean cmd_disconnect(ProfWin *window, const char *const command, gchar **args); gboolean cmd_dnd(ProfWin *window, const char *const command, gchar **args); gboolean cmd_flash(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_tray(ProfWin *window, const char *const command, gchar **args); gboolean cmd_gone(ProfWin *window, const char *const command, gchar **args); gboolean cmd_grlog(ProfWin *window, const char *const command, gchar **args); gboolean cmd_group(ProfWin *window, const char *const command, gchar **args); diff --git a/src/config/preferences.c b/src/config/preferences.c index 0ad95dc4..25a6ff87 100644 --- a/src/config/preferences.c +++ b/src/config/preferences.c @@ -1239,6 +1239,7 @@ _get_group(preference_t pref) case PREF_NOTIFY_SUB: case PREF_NOTIFY_MENTION_CASE_SENSITIVE: case PREF_NOTIFY_MENTION_WHOLE_WORD: + case PREF_TRAY: return PREF_GROUP_NOTIFICATIONS; case PREF_CHLOG: case PREF_GRLOG: @@ -1289,6 +1290,8 @@ _get_key(preference_t pref) return "titlebar.goodbye"; case PREF_FLASH: return "flash"; + case PREF_TRAY: + return "tray"; case PREF_INTYPE: return "intype"; case PREF_HISTORY: @@ -1502,6 +1505,7 @@ _get_default_boolean(preference_t pref) case PREF_TLS_SHOW: case PREF_LASTACTIVITY: case PREF_NOTIFY_MENTION_WHOLE_WORD: + case PREF_TRAY: return TRUE; default: return FALSE; diff --git a/src/config/preferences.h b/src/config/preferences.h index 287e56d3..e4968521 100644 --- a/src/config/preferences.h +++ b/src/config/preferences.h @@ -52,6 +52,7 @@ typedef enum { PREF_TITLEBAR_SHOW, PREF_TITLEBAR_GOODBYE, PREF_FLASH, + PREF_TRAY, PREF_INTYPE, PREF_HISTORY, PREF_CARBONS, diff --git a/src/profanity.c b/src/profanity.c index 2595f5f7..4ca649cd 100644 --- a/src/profanity.c +++ b/src/profanity.c @@ -373,7 +373,7 @@ _init(char *log_level) atexit(_shutdown); plugins_init(); #ifdef HAVE_GTK - if (gtk_ready) { + if (gtk_ready && prefs_get_boolean(PREF_TRAY)) { log_debug("Building GTK icon"); create_tray(); } @@ -397,7 +397,7 @@ _shutdown(void) cl_ev_disconnect(); } #ifdef HAVE_GTK - if (gtk_ready) { + if (gtk_ready && prefs_get_boolean(PREF_TRAY)) { destroy_tray(); } #endif diff --git a/src/ui/console.c b/src/ui/console.c index c104e21b..43cad63d 100644 --- a/src/ui/console.c +++ b/src/ui/console.c @@ -1182,6 +1182,15 @@ cons_flash_setting(void) cons_show("Terminal flash (/flash) : OFF"); } +void +cons_tray_setting(void) +{ + if (prefs_get_boolean(PREF_TRAY)) + cons_show("Tray icon (/tray) : ON"); + else + cons_show("Tray icon (/tray) : OFF"); +} + void cons_splash_setting(void) { @@ -1611,6 +1620,7 @@ cons_show_desktop_prefs(void) cons_show("Desktop notification preferences:"); cons_show(""); cons_notify_setting(); + cons_tray_setting(); cons_alert(); } diff --git a/src/ui/ui.h b/src/ui/ui.h index 924ba33c..01ae3953 100644 --- a/src/ui/ui.h +++ b/src/ui/ui.h @@ -284,6 +284,7 @@ void cons_privileges_setting(void); void cons_beep_setting(void); void cons_console_setting(void); void cons_flash_setting(void); +void cons_tray_setting(void); void cons_splash_setting(void); void cons_encwarn_setting(void); void cons_tlsshow_setting(void); diff --git a/tests/unittests/ui/stub_ui.c b/tests/unittests/ui/stub_ui.c index f9de0859..5e86799a 100644 --- a/tests/unittests/ui/stub_ui.c +++ b/tests/unittests/ui/stub_ui.c @@ -444,6 +444,7 @@ void cons_reconnect_setting(void) {} void cons_autoping_setting(void) {} void cons_autoconnect_setting(void) {} void cons_inpblock_setting(void) {} +void cons_tray_setting(void) {} void cons_show_contact_online(PContact contact, Resource *resource, GDateTime *last_activity) {