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