From a7afe74af90b2bdd24052844c36236d2ba031354 Mon Sep 17 00:00:00 2001 From: Daniel Kamil Kozar Date: Wed, 20 Sep 2017 01:38:28 +0200 Subject: [PATCH 1/3] Rework tray icon blinking Imported from https://developer.pidgin.im/ticket/17174 , authored by Zephaniah E. Loss-Cutler-Hull . --HG-- branch : trac-17174 --- pidgin/gtkdocklet-gtk.c | 17 +++++++---------- pidgin/gtkdocklet.c | 20 ++++++++++++-------- pidgin/gtkdocklet.h | 4 ++-- pidgin/win32/gtkdocklet-win32.c | 2 +- 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/pidgin/gtkdocklet-gtk.c b/pidgin/gtkdocklet-gtk.c index f70916bb5772..460d1c84739a 100644 --- a/pidgin/gtkdocklet-gtk.c +++ b/pidgin/gtkdocklet-gtk.c @@ -134,7 +134,7 @@ docklet_gtk_status_clicked_cb(GtkStatusIcon *status_icon, guint button, guint ac } static void -docklet_gtk_status_update_icon(PurpleStatusPrimitive status, gboolean connecting, gboolean pending) +docklet_gtk_status_update_icon(PurpleStatusPrimitive status, gboolean connecting, gboolean pending, gboolean blinked) { const gchar *icon_name = NULL; @@ -159,19 +159,16 @@ docklet_gtk_status_update_icon(PurpleStatusPrimitive status, gboolean connecting break; } - if (pending) - icon_name = PIDGIN_STOCK_TRAY_PENDING; - if (connecting) + if (connecting) { icon_name = PIDGIN_STOCK_TRAY_CONNECT; + } - if (icon_name) { - gtk_status_icon_set_from_icon_name(docklet, icon_name); + if (!blinked && pending) { + icon_name = PIDGIN_STOCK_TRAY_PENDING; } - if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/docklet/blink")) { - gtk_status_icon_set_blinking(docklet, (pending && !connecting)); - } else if (gtk_status_icon_get_blinking(docklet)) { - gtk_status_icon_set_blinking(docklet, FALSE); + if (icon_name) { + gtk_status_icon_set_from_icon_name(docklet, icon_name); } } diff --git a/pidgin/gtkdocklet.c b/pidgin/gtkdocklet.c index bbf997bc6380..2d8955fa9c8e 100644 --- a/pidgin/gtkdocklet.c +++ b/pidgin/gtkdocklet.c @@ -69,17 +69,21 @@ docklet_blink_icon(gpointer data) blinked = !blinked; - if(pending && !connecting) { - if (blinked) { - if (ui_ops && ui_ops->blank_icon) + if (pending) { + if (ui_ops && ui_ops->blank_icon) { + if (blinked) { ui_ops->blank_icon(); + } else { + pidgin_docklet_update_icon(blinked); + } } else { - pidgin_docklet_update_icon(); + pidgin_docklet_update_icon(blinked); } ret = TRUE; /* keep blinking */ } else { docklet_blinking_timer = 0; blinked = FALSE; + pidgin_docklet_update_icon(FALSE); } return ret; @@ -207,7 +211,7 @@ docklet_update_status(void) pending = newpending; connecting = newconnecting; - pidgin_docklet_update_icon(); + pidgin_docklet_update_icon(FALSE); /* and schedule the blinker function if messages are pending */ if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/docklet/blink") @@ -758,10 +762,10 @@ docklet_menu(void) * public api for ui_ops **************************************************************************/ void -pidgin_docklet_update_icon() +pidgin_docklet_update_icon(gboolean blinked) { if (ui_ops && ui_ops->update_icon) - ui_ops->update_icon(status, connecting, pending); + ui_ops->update_icon(status, connecting, pending, blinked); } void @@ -795,7 +799,7 @@ pidgin_docklet_embedded() } visible = TRUE; docklet_update_status(); - pidgin_docklet_update_icon(); + pidgin_docklet_update_icon(FALSE); } void diff --git a/pidgin/gtkdocklet.h b/pidgin/gtkdocklet.h index 34f88a14f5c4..7f188b92a204 100644 --- a/pidgin/gtkdocklet.h +++ b/pidgin/gtkdocklet.h @@ -31,7 +31,7 @@ struct docklet_ui_ops { void (*create)(void); void (*destroy)(void); - void (*update_icon)(PurpleStatusPrimitive, gboolean, gboolean); + void (*update_icon)(PurpleStatusPrimitive, gboolean, gboolean, gboolean); void (*blank_icon)(void); void (*set_tooltip)(gchar *); GtkMenuPositionFunc position_menu; @@ -39,7 +39,7 @@ struct docklet_ui_ops /* functions in gtkdocklet.c */ -void pidgin_docklet_update_icon(void); +void pidgin_docklet_update_icon(gboolean blinked); void pidgin_docklet_clicked(int); void pidgin_docklet_embedded(void); void pidgin_docklet_remove(void); diff --git a/pidgin/win32/gtkdocklet-win32.c b/pidgin/win32/gtkdocklet-win32.c index b02666078e49..84609f111d64 100644 --- a/pidgin/win32/gtkdocklet-win32.c +++ b/pidgin/win32/gtkdocklet-win32.c @@ -497,7 +497,7 @@ static void systray_remove_nid(void) { } static void winpidgin_tray_update_icon(PurpleStatusPrimitive status, - gboolean connecting, gboolean pending) { + gboolean connecting, gboolean pending, gboolean blinked) { int icon_index; g_return_if_fail(image != NULL); -- 2.14.4 From 3d2c01f1a472670ca7b8960fabbf4e6b4e41cc02 Mon Sep 17 00:00:00 2001 From: Daniel Kamil Kozar Date: Wed, 29 Nov 2017 21:13:54 +0100 Subject: [PATCH 2/3] Use gtk_status_icon_get_icon_name instead of a new boolean variable --HG-- branch : trac-17174 --- pidgin/gtkdocklet-gtk.c | 7 ++++--- pidgin/gtkdocklet.c | 14 +++++++------- pidgin/gtkdocklet.h | 4 ++-- pidgin/win32/gtkdocklet-win32.c | 2 +- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/pidgin/gtkdocklet-gtk.c b/pidgin/gtkdocklet-gtk.c index 460d1c84739a..a948a0d7d5d8 100644 --- a/pidgin/gtkdocklet-gtk.c +++ b/pidgin/gtkdocklet-gtk.c @@ -134,9 +134,10 @@ docklet_gtk_status_clicked_cb(GtkStatusIcon *status_icon, guint button, guint ac } static void -docklet_gtk_status_update_icon(PurpleStatusPrimitive status, gboolean connecting, gboolean pending, gboolean blinked) +docklet_gtk_status_update_icon(PurpleStatusPrimitive status, gboolean connecting, gboolean pending) { const gchar *icon_name = NULL; + const gchar *current_icon_name = gtk_status_icon_get_icon_name(docklet); switch (status) { case PURPLE_STATUS_OFFLINE: @@ -159,11 +160,11 @@ docklet_gtk_status_update_icon(PurpleStatusPrimitive status, gboolean connecting break; } - if (connecting) { + if (connecting && strcmp(current_icon_name, PIDGIN_STOCK_TRAY_CONNECT) != 0) { icon_name = PIDGIN_STOCK_TRAY_CONNECT; } - if (!blinked && pending) { + if (pending && strcmp(current_icon_name, PIDGIN_STOCK_TRAY_PENDING) != 0) { icon_name = PIDGIN_STOCK_TRAY_PENDING; } diff --git a/pidgin/gtkdocklet.c b/pidgin/gtkdocklet.c index 2d8955fa9c8e..9614dcc76d12 100644 --- a/pidgin/gtkdocklet.c +++ b/pidgin/gtkdocklet.c @@ -74,16 +74,16 @@ docklet_blink_icon(gpointer data) if (blinked) { ui_ops->blank_icon(); } else { - pidgin_docklet_update_icon(blinked); + pidgin_docklet_update_icon(); } } else { - pidgin_docklet_update_icon(blinked); + pidgin_docklet_update_icon(); } ret = TRUE; /* keep blinking */ } else { docklet_blinking_timer = 0; blinked = FALSE; - pidgin_docklet_update_icon(FALSE); + pidgin_docklet_update_icon(); } return ret; @@ -211,7 +211,7 @@ docklet_update_status(void) pending = newpending; connecting = newconnecting; - pidgin_docklet_update_icon(FALSE); + pidgin_docklet_update_icon(); /* and schedule the blinker function if messages are pending */ if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/docklet/blink") @@ -762,10 +762,10 @@ docklet_menu(void) * public api for ui_ops **************************************************************************/ void -pidgin_docklet_update_icon(gboolean blinked) +pidgin_docklet_update_icon() { if (ui_ops && ui_ops->update_icon) - ui_ops->update_icon(status, connecting, pending, blinked); + ui_ops->update_icon(status, connecting, pending); } void @@ -799,7 +799,7 @@ pidgin_docklet_embedded() } visible = TRUE; docklet_update_status(); - pidgin_docklet_update_icon(FALSE); + pidgin_docklet_update_icon(); } void diff --git a/pidgin/gtkdocklet.h b/pidgin/gtkdocklet.h index 7f188b92a204..34f88a14f5c4 100644 --- a/pidgin/gtkdocklet.h +++ b/pidgin/gtkdocklet.h @@ -31,7 +31,7 @@ struct docklet_ui_ops { void (*create)(void); void (*destroy)(void); - void (*update_icon)(PurpleStatusPrimitive, gboolean, gboolean, gboolean); + void (*update_icon)(PurpleStatusPrimitive, gboolean, gboolean); void (*blank_icon)(void); void (*set_tooltip)(gchar *); GtkMenuPositionFunc position_menu; @@ -39,7 +39,7 @@ struct docklet_ui_ops /* functions in gtkdocklet.c */ -void pidgin_docklet_update_icon(gboolean blinked); +void pidgin_docklet_update_icon(void); void pidgin_docklet_clicked(int); void pidgin_docklet_embedded(void); void pidgin_docklet_remove(void); diff --git a/pidgin/win32/gtkdocklet-win32.c b/pidgin/win32/gtkdocklet-win32.c index 84609f111d64..b02666078e49 100644 --- a/pidgin/win32/gtkdocklet-win32.c +++ b/pidgin/win32/gtkdocklet-win32.c @@ -497,7 +497,7 @@ static void systray_remove_nid(void) { } static void winpidgin_tray_update_icon(PurpleStatusPrimitive status, - gboolean connecting, gboolean pending, gboolean blinked) { + gboolean connecting, gboolean pending) { int icon_index; g_return_if_fail(image != NULL); -- 2.14.4 From 158cc7bfb197be31401b01393f3a17522da16537 Mon Sep 17 00:00:00 2001 From: Daniel Kamil Kozar Date: Sun, 10 Dec 2017 20:34:19 +0100 Subject: [PATCH 3/3] Use purple_strequal instead of strcmp --HG-- branch : trac-17174 --- pidgin/gtkdocklet-gtk.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pidgin/gtkdocklet-gtk.c b/pidgin/gtkdocklet-gtk.c index a948a0d7d5d8..4771e1e51483 100644 --- a/pidgin/gtkdocklet-gtk.c +++ b/pidgin/gtkdocklet-gtk.c @@ -160,11 +160,11 @@ docklet_gtk_status_update_icon(PurpleStatusPrimitive status, gboolean connecting break; } - if (connecting && strcmp(current_icon_name, PIDGIN_STOCK_TRAY_CONNECT) != 0) { + if (connecting && !purple_strequal(current_icon_name, PIDGIN_STOCK_TRAY_CONNECT)) { icon_name = PIDGIN_STOCK_TRAY_CONNECT; } - if (pending && strcmp(current_icon_name, PIDGIN_STOCK_TRAY_PENDING) != 0) { + if (pending && !purple_strequal(current_icon_name, PIDGIN_STOCK_TRAY_PENDING)) { icon_name = PIDGIN_STOCK_TRAY_PENDING; } -- 2.14.4