diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d467a2f --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +SOURCES/hicolor_apps_16x16_xchat.png +SOURCES/hicolor_apps_22x22_xchat.png +SOURCES/hicolor_apps_24x24_xchat.png +SOURCES/hicolor_apps_256x256_xchat.png +SOURCES/hicolor_apps_32x32_xchat.png +SOURCES/hicolor_apps_48x48_xchat.png +SOURCES/xchat-2.8.8.tar.xz +SOURCES/xchat.svg diff --git a/.xchat.metadata b/.xchat.metadata new file mode 100644 index 0000000..11158d0 --- /dev/null +++ b/.xchat.metadata @@ -0,0 +1,8 @@ +84ac8a2caac533fa6bcdc947254df8b0ccbf9453 SOURCES/hicolor_apps_16x16_xchat.png +35a87bc6a25239327afbf8dd76fe009929b5afad SOURCES/hicolor_apps_22x22_xchat.png +ad1ea5ad579f2b0dc7e7cf99c020337897a7dc84 SOURCES/hicolor_apps_24x24_xchat.png +9010b646306f78cfc08e5fd6ff7134b56c1bdca1 SOURCES/hicolor_apps_256x256_xchat.png +e8bb65c9a0cbec38b86d38b31dc786f6ac18056d SOURCES/hicolor_apps_32x32_xchat.png +ff2fce1dc78467ac0dc60e9cf6a75f9de8a6aef1 SOURCES/hicolor_apps_48x48_xchat.png +e12305da42d1aacc26c2ca25e239f393d4dd3532 SOURCES/xchat-2.8.8.tar.xz +2d4b97250c580c4ea75140020f0fc44783639b6c SOURCES/xchat.svg diff --git a/SOURCES/0001-Don-t-force-the-use-of-SSLv3.patch b/SOURCES/0001-Don-t-force-the-use-of-SSLv3.patch new file mode 100644 index 0000000..e0f0472 --- /dev/null +++ b/SOURCES/0001-Don-t-force-the-use-of-SSLv3.patch @@ -0,0 +1,37 @@ +From 527eb322a5bfa97d5716e7f8178e319c515065a2 Mon Sep 17 00:00:00 2001 +From: Marc Deslauriers +Date: Mon, 20 Oct 2014 10:08:26 -0400 +Subject: [PATCH] Don't force the use of SSLv3. + +SSLv3 should no longer be used for security reasons. Let the best +connection method be automatically determined by using SSLv23_client_method() +and SSLv23_server_method(). +--- + src/common/ssl.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/src/common/ssl.c b/src/common/ssl.c +index a18ad47..35eb237 100644 +--- a/src/common/ssl.c ++++ b/src/common/ssl.c +@@ -70,7 +70,7 @@ _SSL_context_init (void (*info_cb_func), int server) + + SSLeay_add_ssl_algorithms (); + SSL_load_error_strings (); +- ctx = SSL_CTX_new (server ? SSLv3_server_method() : SSLv3_client_method ()); ++ ctx = SSL_CTX_new (server ? SSLv23_server_method() : SSLv23_client_method ()); + + SSL_CTX_set_session_cache_mode (ctx, SSL_SESS_CACHE_BOTH); + SSL_CTX_set_timeout (ctx, 300); +@@ -281,7 +281,7 @@ _SSL_socket (SSL_CTX *ctx, int sd) + __SSL_critical_error ("SSL_new"); + + SSL_set_fd (ssl, sd); +- if (ctx->method == SSLv3_client_method()) ++ if (ctx->method == SSLv23_client_method()) + SSL_set_connect_state (ssl); + else + SSL_set_accept_state(ssl); +-- +2.1.0 + diff --git a/SOURCES/xchat-1.8.7-use-sysconf-to-detect-cpus.patch b/SOURCES/xchat-1.8.7-use-sysconf-to-detect-cpus.patch new file mode 100644 index 0000000..417690d --- /dev/null +++ b/SOURCES/xchat-1.8.7-use-sysconf-to-detect-cpus.patch @@ -0,0 +1,34 @@ +--- src/common/util.c.use-sysconf-to-detect-cpus Tue Feb 5 07:44:27 2002 ++++ src/common/util.c Tue Feb 5 07:45:59 2002 +@@ -399,14 +399,11 @@ + int fh; + + *mhz = 0; +- *cpus = 0; ++ *cpus = (int) sysconf(_SC_NPROCESSORS_ONLN); + + fh = open ("/proc/cpuinfo", O_RDONLY); /* linux 2.2+ only */ + if (fh == -1) +- { +- *cpus = 1; + return; +- } + + while (1) + { +@@ -421,15 +418,9 @@ + } else if (!strncmp (buf, "clock\t\t:", 8)) /* PPC */ + { + *mhz = atoi (buf + 9); +- } else if (!strncmp (buf, "processor\t", 10)) +- { +- (*cpus)++; + } + } + close (fh); +- if (!*cpus) +- *cpus = 1; +- + #endif + #ifdef USING_FREEBSD + diff --git a/SOURCES/xchat-2.8.6-change-page-activity.patch b/SOURCES/xchat-2.8.6-change-page-activity.patch new file mode 100644 index 0000000..970158d --- /dev/null +++ b/SOURCES/xchat-2.8.6-change-page-activity.patch @@ -0,0 +1,339 @@ +diff -paur xchat2.orig/src/common/inbound.c xchat2/src/common/inbound.c +--- xchat2.orig/src/common/inbound.c 2008-07-20 17:31:44.898468115 +0200 ++++ xchat2/src/common/inbound.c 2008-07-19 19:57:09.799906780 +0200 +@@ -297,7 +297,10 @@ is_hilight (char *from, char *text, sess + { + g_free (text); + if (sess != current_tab) ++ { + sess->nick_said = TRUE; ++ lastact_update(sess); ++ } + fe_set_hilight (sess); + return 1; + } +@@ -344,6 +347,7 @@ inbound_action (session *sess, char *cha + sess->msg_said = TRUE; + sess->new_data = FALSE; + } ++ lastact_update(sess); + } + + user = userlist_find (sess, from); +@@ -395,6 +399,7 @@ inbound_chanmsg (server *serv, session * + { + sess->msg_said = TRUE; + sess->new_data = FALSE; ++ lastact_update(sess); + } + + user = userlist_find (sess, from); +diff -paur xchat2.orig/src/common/xchat.c xchat2/src/common/xchat.c +--- xchat2.orig/src/common/xchat.c 2008-07-20 17:31:44.900468825 +0200 ++++ xchat2/src/common/xchat.c 2008-07-20 17:33:57.089468218 +0200 +@@ -71,6 +71,23 @@ GSList *usermenu_list = 0; + GSList *urlhandler_list = 0; + GSList *tabmenu_list = 0; + ++/* ++ * This array contains 5 double linked lists, one for each priority in the ++ * "interesting session" queue ("channel" stands for everything but ++ * SESS_DIALOG): ++ * ++ * [0] queries with hilight ++ * [1] queries ++ * [2] channels with hilight ++ * [3] channels with dialogue ++ * [4] channels with other data ++ * ++ * Each time activity happens the corresponding session is put at the ++ * beginning of one of the lists. The aim is to be able to switch to the ++ * session with the most important/recent activity. ++ */ ++GList *sess_list_by_lastact[5] = {NULL, NULL, NULL, NULL, NULL}; ++ + static int in_xchat_exit = FALSE; + int xchat_is_quitting = FALSE; + /* command-line args */ +@@ -93,6 +110,105 @@ struct xchatprefs prefs; + SSL_CTX *ctx = NULL; + #endif + ++/* ++ * Update the priority queue of the "interesting sessions" ++ * (sess_list_by_lastact). ++ */ ++void ++lastact_update(session *sess) ++{ ++ int newidx; ++ ++ /* Find the priority (for the order see before) */ ++ if (sess->type == SESS_DIALOG) ++ { ++ if (sess->nick_said) ++ newidx = LACT_QUERY_HI; ++ else if (sess->msg_said) ++ newidx = LACT_QUERY; ++ else if (sess->new_data) ++ newidx = LACT_QUERY; ++ else ++ newidx = LACT_NONE; ++ } ++ else ++ { ++ if (sess->nick_said) ++ newidx = LACT_CHAN_HI; ++ else if (sess->msg_said) ++ newidx = LACT_CHAN; ++ else if (sess->new_data) ++ newidx = LACT_CHAN_DATA; ++ else ++ newidx = LACT_NONE; ++ } ++ ++ /* Check if this update is a no-op */ ++ if (sess->lastact_idx == newidx && ++ ((newidx != LACT_NONE && sess->lastact_elem == sess_list_by_lastact[newidx]) || ++ (newidx == LACT_NONE))) ++ return; ++ ++ /* Remove from the old position (and, if no new position, return */ ++ else if (sess->lastact_idx != LACT_NONE && sess->lastact_elem) ++ { ++ sess_list_by_lastact[sess->lastact_idx] = g_list_remove_link( ++ sess_list_by_lastact[sess->lastact_idx], ++ sess->lastact_elem); ++ if (newidx == LACT_NONE) ++ { ++ sess->lastact_idx = newidx; ++ return; ++ } ++ } ++ ++ /* No previous position, allocate new */ ++ else if (!sess->lastact_elem) ++ sess->lastact_elem = g_list_prepend(sess->lastact_elem, sess); ++ ++ sess->lastact_idx = newidx; ++ sess_list_by_lastact[newidx] = g_list_concat( ++ sess->lastact_elem, sess_list_by_lastact[newidx]); ++} ++ ++/* ++ * Extract the first session from the priority queue of sessions with recent ++ * activity. Return NULL if no such session can be found. ++ * ++ * If filter is specified, skip a session if filter(session) returns 0. This ++ * can be used for UI-specific needs, e.g. in fe-gtk we want to filter out ++ * detached sessions. ++ */ ++session * ++lastact_getfirst(int (*filter) (session *sess)) ++{ ++ int i; ++ session *sess = NULL; ++ GList *curitem; ++ ++ /* 5 is the number of priority classes LACT_ */ ++ for (i = 0; i < 5 && !sess; i++) ++ { ++ curitem = sess_list_by_lastact[i]; ++ while (curitem && !sess) ++ { ++ sess = g_list_nth_data(curitem, 0); ++ if (!sess || (filter && !filter(sess))) ++ { ++ sess = NULL; ++ curitem = g_list_next(curitem); ++ } ++ } ++ ++ if (sess) ++ { ++ sess_list_by_lastact[i] = g_list_remove_link(sess_list_by_lastact[i], curitem); ++ sess->lastact_idx = LACT_NONE; ++ } ++ } ++ ++ return sess; ++} + + int + is_session (session * sess) +@@ -362,6 +478,9 @@ session_new (server *serv, char *from, i + + sess_list = g_slist_prepend (sess_list, sess); + ++ sess->lastact_elem = NULL; ++ sess->lastact_idx = LACT_NONE; ++ + fe_new_window (sess, focus); + + return sess; +@@ -533,6 +652,16 @@ session_free (session *killsess) + current_sess = sess_list->data; + } + ++ if (killsess->lastact_elem) ++ { ++ if (killsess->lastact_idx != LACT_NONE) ++ sess_list_by_lastact[killsess->lastact_idx] = g_list_delete_link( ++ sess_list_by_lastact[killsess->lastact_idx], ++ killsess->lastact_elem); ++ else ++ g_list_free_1(killsess->lastact_elem); ++ } ++ + free (killsess); + + if (!sess_list && !in_xchat_exit) +diff -paur xchat2.orig/src/common/xchat.h xchat2/src/common/xchat.h +--- xchat2.orig/src/common/xchat.h 2008-07-20 17:31:44.901467675 +0200 ++++ xchat2/src/common/xchat.h 2008-07-20 17:33:28.240467970 +0200 +@@ -320,6 +320,15 @@ struct xchatprefs + #define SET_ON 1 + #define SET_DEFAULT 2 /* use global setting */ + ++/* Priorities in the "interesting sessions" priority queue ++ * (see xchat.c:sess_list_by_lastact) */ ++#define LACT_NONE -1 /* no queues */ ++#define LACT_QUERY_HI 0 /* query with hilight */ ++#define LACT_QUERY 1 /* query with messages */ ++#define LACT_CHAN_HI 2 /* channel with hilight */ ++#define LACT_CHAN 3 /* channel with messages */ ++#define LACT_CHAN_DATA 4 /* channel with other data */ ++ + typedef struct session + { + /* Per-Channel Alerts */ +@@ -369,6 +378,10 @@ typedef struct session + + int type; /* SESS_* */ + ++ GList *lastact_elem; /* our GList element in sess_list_by_lastact */ ++ int lastact_idx; /* the sess_list_by_lastact[] index of the list we're in. ++ * For valid values, see defines of LACT_*. */ ++ + int new_data:1; /* new data avail? (purple tab) */ + int nick_said:1; /* your nick mentioned? (blue tab) */ + int msg_said:1; /* new msg available? (red tab) */ +diff -paur xchat2.orig/src/common/xchatc.h xchat2/src/common/xchatc.h +--- xchat2.orig/src/common/xchatc.h 2008-07-20 17:31:44.901467675 +0200 ++++ xchat2/src/common/xchatc.h 2008-07-20 11:43:36.673967630 +0200 +@@ -25,10 +25,13 @@ extern GSList *ignore_list; + extern GSList *usermenu_list; + extern GSList *urlhandler_list; + extern GSList *tabmenu_list; ++extern GList *sess_list_by_lastact[]; + + session * find_channel (server *serv, char *chan); + session * find_dialog (server *serv, char *nick); + session * new_ircwindow (server *serv, char *name, int type, int focus); ++void lastact_update (session * sess); ++session * lastact_getfirst (int (*filter) (session *sess)); + int is_session (session * sess); + void session_free (session *killsess); + void lag_check (void); +diff -paur xchat2.orig/src/fe-gtk/fe-gtk.c xchat2/src/fe-gtk/fe-gtk.c +--- xchat2.orig/src/fe-gtk/fe-gtk.c 2008-07-20 17:31:44.958466232 +0200 ++++ xchat2/src/fe-gtk/fe-gtk.c 2008-07-19 19:58:57.431961788 +0200 +@@ -603,6 +603,7 @@ fe_print_text (struct session *sess, cha + sess->gui->is_tab && !sess->nick_said && stamp == 0) + { + sess->new_data = TRUE; ++ lastact_update(sess); + if (sess->msg_said) + fe_set_tab_color (sess, 2); + else +diff -paur xchat2.orig/src/fe-gtk/fkeys.c xchat2/src/fe-gtk/fkeys.c +--- xchat2.orig/src/fe-gtk/fkeys.c 2008-07-20 17:31:44.960465847 +0200 ++++ xchat2/src/fe-gtk/fkeys.c 2008-07-20 12:20:50.186930065 +0200 +@@ -158,7 +158,7 @@ static const struct key_action key_actio + {key_action_handle_command, "Run Command", + N_("The \002Run Command\002 action runs the data in Data 1 as if it has been typed into the entry box where you pressed the key sequence. Thus it can contain text (which will be sent to the channel/person), commands or user commands. When run all \002\\n\002 characters in Data 1 are used to deliminate seperate commands so it is possible to run more than one command. If you want a \002\\\002 in the actual text run then enter \002\\\\\002")}, + {key_action_page_switch, "Change Page", +- N_("The \002Change Page\002 command switches between pages in the notebook. Set Data 1 to the page you want to switch to. If Data 2 is set to anything then the switch will be relative to the current position")}, ++ N_("The \002Change Page\002 command switches between pages in the notebook. Set Data 1 to the page you want to switch to. If Data 2 is set to anything then the switch will be relative to the current position. Set Data 1 to auto to switch to the page with the most recent and important activity (queries first, then channels with hilight, channels with dialogue, channels with other data)")}, + {key_action_insert, "Insert in Buffer", + N_("The \002Insert in Buffer\002 command will insert the contents of Data 1 into the entry where the key sequence was pressed at the current cursor position")}, + {key_action_scroll_page, "Scroll Page", +@@ -402,6 +402,7 @@ key_load_defaults () + "A\n3\nChange Page\nD1:3\nD2!\n\n"\ + "A\n2\nChange Page\nD1:2\nD2!\n\n"\ + "A\n1\nChange Page\nD1:1\nD2!\n\n"\ ++ "A\ngrave\nChange Page\nD1:auto\nD2!\n\n"\ + "C\no\nInsert in Buffer\nD1:\nD2!\n\n"\ + "C\nb\nInsert in Buffer\nD1:\nD2!\n\n"\ + "C\nk\nInsert in Buffer\nD1:\nD2!\n\n"\ +@@ -1196,6 +1197,20 @@ key_action_handle_command (GtkWidget * w + return 0; + } + ++/* ++ * Check if the given session is inside the main window. This predicate ++ * is passed to lastact_pop as a way to filter out detached sessions. ++ * XXX: Consider moving this in a different file? ++ */ ++static int ++session_check_is_tab(session *sess) ++{ ++ if (!sess || !sess->gui) ++ return FALSE; ++ ++ return (sess->gui->is_tab); ++} ++ + static int + key_action_page_switch (GtkWidget * wid, GdkEventKey * evt, char *d1, + char *d2, struct session *sess) +@@ -1209,6 +1224,30 @@ key_action_page_switch (GtkWidget * wid, + if (!len) + return 1; + ++ if (strcasecmp(d1, "auto") == 0) ++ { ++ /* Auto switch makes no sense in detached sessions */ ++ if (!sess->gui->is_tab) ++ return 1; ++ ++ /* Obtain a session with recent activity */ ++ session *newsess = lastact_getfirst(session_check_is_tab); ++ ++ if (newsess) ++ { ++ /* ++ * Only sessions in the current window should be considered (i.e. ++ * we don't want to move the focus on a different window). This ++ * call could, in theory, do this, but we checked before that ++ * newsess->gui->is_tab and sess->gui->is_tab. ++ */ ++ mg_bring_tofront_sess(newsess); ++ return 0; ++ } ++ else ++ return 1; ++ } ++ + for (i = 0; i < len; i++) + { + if (d1[i] < '0' || d1[i] > '9') +diff -paur xchat2.orig/src/fe-gtk/maingui.c xchat2/src/fe-gtk/maingui.c +--- xchat2.orig/src/fe-gtk/maingui.c 2008-07-20 17:31:44.964469466 +0200 ++++ xchat2/src/fe-gtk/maingui.c 2008-07-19 19:58:58.255909127 +0200 +@@ -359,6 +359,7 @@ fe_set_tab_color (struct session *sess, + + break; + } ++ lastact_update(sess); + } + } + +@@ -643,6 +644,7 @@ mg_focus (session *sess) + sess->nick_said = FALSE; + sess->msg_said = FALSE; + sess->new_data = FALSE; ++ lastact_update(sess); + /* when called via mg_changui_new, is_tab might be true, but + sess->res->tab is still NULL. */ + if (sess->res->tab) diff --git a/SOURCES/xchat-2.8.6-default-utf8.patch b/SOURCES/xchat-2.8.6-default-utf8.patch new file mode 100644 index 0000000..358a438 --- /dev/null +++ b/SOURCES/xchat-2.8.6-default-utf8.patch @@ -0,0 +1,24 @@ +diff -ur xchat-2.8.6/src/common/servlist.c xchat-2.8.6-default-utf8/src/common/servlist.c +--- xchat-2.8.6/src/common/servlist.c 2008-04-01 10:22:34.000000000 +0200 ++++ xchat-2.8.6-default-utf8/src/common/servlist.c 2008-06-15 14:43:35.000000000 +0200 +@@ -892,7 +892,7 @@ + if (def[i].network) + { + net = servlist_net_add (def[i].network, def[i].host, FALSE); +- net->encoding = strdup ("IRC (Latin/Unicode Hybrid)"); ++ net->encoding = strdup ("UTF-8 (Unicode)"); + if (def[i].channel) + net->autojoin = strdup (def[i].channel); + if (def[i].charset) +diff -ur xchat-2.8.6/src/fe-gtk/servlistgui.c xchat-2.8.6-default-utf8/src/fe-gtk/servlistgui.c +--- xchat-2.8.6/src/fe-gtk/servlistgui.c 2008-06-08 10:04:48.000000000 +0200 ++++ xchat-2.8.6-default-utf8/src/fe-gtk/servlistgui.c 2008-06-15 14:36:03.000000000 +0200 +@@ -267,7 +267,7 @@ + ircnet *net; + + net = servlist_net_add (_("New Network"), "", TRUE); +- net->encoding = strdup ("IRC (Latin/Unicode Hybrid)"); ++ net->encoding = strdup ("UTF-8 (Unicode)"); + servlist_server_add (net, "newserver/6667"); + + store = (GtkListStore *)gtk_tree_view_get_model (treeview); diff --git a/SOURCES/xchat-2.8.6-freenode-ports.patch b/SOURCES/xchat-2.8.6-freenode-ports.patch new file mode 100644 index 0000000..3e336fd --- /dev/null +++ b/SOURCES/xchat-2.8.6-freenode-ports.patch @@ -0,0 +1,35 @@ +From bc98c28e891408145bed2b18d3c02adbadadde31 Mon Sep 17 00:00:00 2001 +From: Debarshi Ray +Date: Sat, 30 Jan 2010 13:05:21 +0200 +Subject: [PATCH] Added port numbers for Freenode + +http://freenode.net/irc_servers.shtml +--- + src/common/servlist.c | 11 ++++++++++- + 1 files changed, 10 insertions(+), 1 deletions(-) + +diff --git a/src/common/servlist.c b/src/common/servlist.c +index c6839e0..3082966 100644 +--- a/src/common/servlist.c ++++ b/src/common/servlist.c +@@ -207,7 +207,16 @@ static const struct defaultserver def[] = + {0, "irc.vendetta.com"}, + + {"FreeNode", 0}, +- {0, "irc.freenode.net"}, ++ {0, "irc.freenode.net/6665"}, ++ {0, "irc.freenode.net/6666"}, ++ {0, "irc.freenode.net/6667"}, ++ {0, "irc.freenode.net/8000"}, ++ {0, "irc.freenode.net/8001"}, ++ {0, "irc.freenode.net/8002"}, ++#ifdef USE_OPENSSL ++ {0, "irc.freenode.net/+7000"}, ++ {0, "irc.freenode.net/+7070"}, ++#endif + + /* {"Freeworld", 0}, + {0, "kabel.freeworld.nu"}, +-- +1.6.6 + diff --git a/SOURCES/xchat-2.8.8-desktop-file-name.patch b/SOURCES/xchat-2.8.8-desktop-file-name.patch new file mode 100644 index 0000000..2d6044a --- /dev/null +++ b/SOURCES/xchat-2.8.8-desktop-file-name.patch @@ -0,0 +1,13 @@ +diff -urNp xchat-2.8.8.orig/xchat.desktop xchat-2.8.8/xchat.desktop +--- xchat-2.8.8.orig/xchat.desktop 2013-06-10 14:01:07.408432973 +0200 ++++ xchat-2.8.8/xchat.desktop 2013-06-10 14:12:56.044209785 +0200 +@@ -1,7 +1,8 @@ + [Desktop Entry] + Encoding=UTF-8 +-Name=XChat IRC ++Name=XChat + Name[zh_TW]=網路清談 ++GenericName=IRC Client + Comment[de]=IRC-Client + Comment[es]=Aplicación de IRC + Comment[fi]=IRC-sovellus diff --git a/SOURCES/xchat-2.8.8-glib.patch b/SOURCES/xchat-2.8.8-glib.patch new file mode 100644 index 0000000..0012ce5 --- /dev/null +++ b/SOURCES/xchat-2.8.8-glib.patch @@ -0,0 +1,61 @@ +--- src/common/text.c.orig 2012-02-25 11:05:23.890274334 -0600 ++++ src/common/text.c 2012-02-25 11:05:39.006195489 -0600 +@@ -28,7 +28,7 @@ + #include + + #include "xchat.h" +-#include ++#include + #include "cfgfiles.h" + #include "chanopt.h" + #include "plugin.h" +--- src/common/servlist.c.orig 2012-02-25 11:04:30.601501605 -0600 ++++ src/common/servlist.c 2012-02-25 11:04:42.964072823 -0600 +@@ -24,7 +24,7 @@ + #include + + #include "xchat.h" +-#include ++#include + + #include "cfgfiles.h" + #include "fe.h" +--- src/common/dbus/dbus-client.c.orig 2012-02-25 10:59:23.948527589 -0600 ++++ src/common/dbus/dbus-client.c 2012-02-25 11:00:40.082203787 -0600 +@@ -53,11 +53,6 @@ + GError *error = NULL; + char *command = NULL; + +- /* GnomeVFS >=2.15 uses D-Bus and threads, so threads should be +- * initialised before opening for the first time a D-Bus connection */ +- if (!g_thread_supported ()) { +- g_thread_init (NULL); +- } + dbus_g_thread_init (); + + /* if there is nothing to do, return now. */ +--- src/common/xchat.h.orig 2012-02-25 11:29:33.400499630 -0600 ++++ src/common/xchat.h 2012-02-25 11:29:51.774834912 -0600 +@@ -1,10 +1,6 @@ + #include "../../config.h" + +-#include +-#include +-#include +-#include +-#include ++#include + #include /* need time_t */ + + #ifndef XCHAT_H +--- src/common/util.c.orig 2012-02-25 11:38:29.404622998 -0600 ++++ src/common/util.c 2012-02-25 11:38:51.904482615 -0600 +@@ -39,7 +39,7 @@ + #include + #include "xchat.h" + #include "xchatc.h" +-#include ++#include + #include + #include "util.h" + #include "../../config.h" diff --git a/SOURCES/xchat-2.8.8-hires-icons.patch b/SOURCES/xchat-2.8.8-hires-icons.patch new file mode 100644 index 0000000..2baba84 --- /dev/null +++ b/SOURCES/xchat-2.8.8-hires-icons.patch @@ -0,0 +1,85 @@ +diff -urNp xchat-2.8.8.orig/configure.in xchat-2.8.8/configure.in +--- xchat-2.8.8.orig/configure.in 2013-06-07 17:33:41.600172433 +0200 ++++ xchat-2.8.8/configure.in 2013-06-07 17:39:02.672190284 +0200 +@@ -792,6 +792,7 @@ plugins/python/Makefile + plugins/perl/Makefile + plugins/tcl/Makefile + intl/Makefile ++icons/Makefile + po/Makefile.in + ]) + +diff -urNp xchat-2.8.8.orig/icons/Makefile.am xchat-2.8.8/icons/Makefile.am +--- xchat-2.8.8.orig/icons/Makefile.am 1970-01-01 01:00:00.000000000 +0100 ++++ xchat-2.8.8/icons/Makefile.am 2013-06-07 17:35:09.053456817 +0200 +@@ -0,0 +1,59 @@ ++public_icon_themes = \ ++ hicolor \ ++ $(NULL) ++ ++public_icons = \ ++ hicolor_apps_16x16_xchat.png \ ++ hicolor_apps_22x22_xchat.png \ ++ hicolor_apps_24x24_xchat.png \ ++ hicolor_apps_32x32_xchat.png \ ++ hicolor_apps_48x48_xchat.png \ ++ hicolor_apps_256x256_xchat.png \ ++ $(NULL) ++ ++noinst_DATA = \ ++ xchat.svg \ ++ $(NULL) ++ ++EXTRA_DIST = \ ++ $(public_icons) \ ++ $(noinst_DATA) \ ++ $(NULL) ++ ++gtk_update_icon_cache = gtk-update-icon-cache -f -t ++ ++update-icon-cache: ++ @-if test -z "$(DESTDIR)"; then \ ++ echo "Updating Gtk icon cache."; \ ++ for theme in $(public_icon_themes); do \ ++ $(gtk_update_icon_cache) $(datadir)/icons/$$theme; \ ++ done; \ ++ else \ ++ echo "*** Icon cache not updated. After (un)install, run this:"; \ ++ for theme in $(public_icon_themes); do \ ++ echo "*** $(gtk_update_icon_cache) $(datadir)/icons/$$theme"; \ ++ done; \ ++ fi ++ ++install-icons: ++ for icon in $(public_icons); do \ ++ THEME=`echo $$icon | cut -d_ -f1`; \ ++ CONTEXT=`echo $$icon | cut -d_ -f2`; \ ++ SIZE=`echo $$icon | cut -d_ -f3`; \ ++ ICONFILE=`echo $$icon | cut -d_ -f4`; \ ++ mkdir -p $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT; \ ++ $(INSTALL_DATA) $(srcdir)/$$icon $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \ ++ done ++ ++uninstall-icons: ++ -for icon in $(public_icons); do \ ++ THEME=`echo $$icon | cut -d_ -f1`; \ ++ CONTEXT=`echo $$icon | cut -d_ -f2`; \ ++ SIZE=`echo $$icon | cut -d_ -f3`; \ ++ ICONFILE=`echo $$icon | cut -d_ -f4`; \ ++ rm -f $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \ ++ done ++ ++install-data-local: install-icons update-icon-cache ++ ++uninstall-local: uninstall-icons update-icon-cache +diff -urNp xchat-2.8.8.orig/Makefile.am xchat-2.8.8/Makefile.am +--- xchat-2.8.8.orig/Makefile.am 2013-06-07 17:33:41.600172433 +0200 ++++ xchat-2.8.8/Makefile.am 2013-06-10 13:25:06.316773350 +0200 +@@ -1,6 +1,6 @@ + ## Process this file with automake to produce Makefile.in + +-SUBDIRS = po intl src plugins ++SUBDIRS = po icons intl src plugins + + EXTRA_DIST = autogen.sh HACKING INSTALL.w32 faq.html xchat.png \ + xchat.desktop xchat.spec config.h.w32 xchat.ico diff --git a/SOURCES/xchat-2.8.8-libnotify07.patch b/SOURCES/xchat-2.8.8-libnotify07.patch new file mode 100644 index 0000000..2a6dce9 --- /dev/null +++ b/SOURCES/xchat-2.8.8-libnotify07.patch @@ -0,0 +1,24 @@ +diff -up xchat-2.8.8/src/fe-gtk/plugin-tray.c.libnotify07 xchat-2.8.8/src/fe-gtk/plugin-tray.c +--- xchat-2.8.8/src/fe-gtk/plugin-tray.c.libnotify07 2010-11-15 17:32:15.708325783 -0500 ++++ xchat-2.8.8/src/fe-gtk/plugin-tray.c 2010-11-15 18:05:17.322141789 -0500 +@@ -125,8 +125,9 @@ static void *nn_mod = NULL; + /* prototypes */ + static gboolean (*nn_init) (char *); + static void (*nn_uninit) (void); +-static void *(*nn_new_with_status_icon) (const gchar *summary, const gchar *message, const gchar *icon, GtkStatusIcon *status_icon); +-static void *(*nn_new) (const gchar *summary, const gchar *message, const gchar *icon, GtkWidget *attach); ++/* recent versions of libnotify don't take the fourth GtkWidget argument, but passing an ++ * extra NULL argument will be fine */ ++static void *(*nn_new) (const gchar *summary, const gchar *message, const gchar *icon, gpointer dummy); + static gboolean (*nn_show) (void *noti, GError **error); + static void (*nn_set_timeout) (void *noti, gint timeout); + +@@ -160,8 +161,6 @@ libnotify_notify_new (const char *title, + goto bad; + if (!g_module_symbol (nn_mod, "notify_uninit", (gpointer)&nn_uninit)) + goto bad; +- if (!g_module_symbol (nn_mod, "notify_notification_new_with_status_icon", (gpointer)&nn_new_with_status_icon)) +- goto bad; + if (!g_module_symbol (nn_mod, "notify_notification_new", (gpointer)&nn_new)) + goto bad; + if (!g_module_symbol (nn_mod, "notify_notification_show", (gpointer)&nn_show)) diff --git a/SOURCES/xchat-2.8.8-link-against-libnotify.patch b/SOURCES/xchat-2.8.8-link-against-libnotify.patch new file mode 100644 index 0000000..31e6c08 --- /dev/null +++ b/SOURCES/xchat-2.8.8-link-against-libnotify.patch @@ -0,0 +1,343 @@ +From: Christopher Aillon +Date: Thu, 7 Apr 2011 19:34:14 -0700 +Subject: [PATCH] Link directly against libnotify + +Dynamically loading the library isn't ideal since the soname +can change silently on us. Additionally, notify-send is +shipped as part of libnotify, so we aren't actually bringing +in a new dependency. Since we'd need to patch the source and +rebuild for new sonames anyway, there's little benefit to +dynamically loading libnotify. + +Plus, this has the benefit of cleaning up the code, as well as +ensuring we'll catch any future soname changes sooner. + +https://bugzilla.redhat.com/show_bug.cgi?id=693362 +https://sourceforge.net/tracker/?func=detail&aid=3280223&group_id=239&atid=100239 +--- + configure.in | 23 +++++++ + src/fe-gtk/plugin-tray.c | 144 ++++++++++------------------------------------- + 2 files changed, 55 insertions(+), 112 deletions(-) + +diff -p -U8 xchat-2.8.8/configure.in.libnotifyso4 xchat-2.8.8/configure.in +--- xchat-2.8.8/configure.in.libnotifyso4 2010-05-29 23:01:16.000000000 -0700 ++++ xchat-2.8.8/configure.in 2011-04-07 19:27:00.448137113 -0700 +@@ -34,16 +34,17 @@ AH_VERBATIM([PREFIX],[#undef PREFIX]) + AH_VERBATIM([XCHATLIBDIR],[#undef XCHATLIBDIR]) + AH_VERBATIM([XCHATSHAREDIR],[#undef XCHATSHAREDIR]) + AH_VERBATIM([SOCKS],[#undef SOCKS]) + AH_VERBATIM([USE_MSPROXY],[#undef USE_MSPROXY]) + dnl AH_VERBATIM([USE_GNOME],[#undef USE_GNOME]) + AH_VERBATIM([USE_SHM],[#undef USE_SHM]) + AH_VERBATIM([USE_GTKSPELL],[#undef USE_GTKSPELL]) + AH_VERBATIM([USE_LIBSEXY],[#undef USE_LIBSEXY]) ++AH_VERBATIM([USE_LIBNOTIFY],[#undef USE_LIBNOTIFY]) + AH_VERBATIM([USE_IPV6],[#undef USE_IPV6]) + AH_VERBATIM([USE_MMX],[#undef USE_MMX]) + AH_VERBATIM([USE_OPENSSL],[#undef USE_OPENSSL]) + AH_VERBATIM([USE_PLUGIN],[#undef USE_PLUGIN]) + AH_VERBATIM([USE_XFT],[#undef USE_XFT]) + AH_VERBATIM([USE_XLIB],[#undef USE_XLIB]) + AH_VERBATIM([USE_SIGACTION],[#undef USE_SIGACTION]) + AH_VERBATIM([USING_FREEBSD],[#undef USING_FREEBSD]) +@@ -126,16 +127,20 @@ AC_ARG_ENABLE(tcl, + AC_ARG_ENABLE(plugin, + [ --disable-plugin disable plugin support], + plugin=$enableval, plugin=yes) + + AC_ARG_ENABLE(dbus, + [ --disable-dbus disable DBUS support], + dbus=$enableval, dbus=yes) + ++AC_ARG_ENABLE(libnotify, ++[ --disable-libnotify disable libnotify support], ++ libnotify=$enableval, libnotify=yes) ++ + AC_ARG_ENABLE(mmx, + [ --disable-mmx disable MMX assembly routines], + mmx=$enableval, mmx=yes) + + AC_ARG_ENABLE(shm, + [ --enable-shm enable use of XShm for fast tinting (default: no)], + shm=$enableval, shm=no) + +@@ -482,16 +487,32 @@ if test "x$dbus" = "xyes" ; then + + DBUS_SERVICES_DIR="$DATADIR/dbus-1/services" + AC_SUBST(DBUS_SERVICES_DIR) + AC_DEFINE_UNQUOTED(DBUS_SERVICES_DIR, "$DBUS_SERVICES_DIR", [Where services dir for DBUS is]) + fi + fi + + dnl ********************************************************************* ++dnl ** LIBNOTIFY ******************************************************** ++dnl ********************************************************************* ++ ++if test "x$libnotify" = "xyes" ; then ++ PKG_CHECK_MODULES(LIBNOTIFY, libnotify >= 0.4, [], [ ++ AC_MSG_RESULT(no) ++ libnotify=no ++ ]) ++ if test "$libnotify" != "no" ; then ++ GUI_LIBS="$GUI_LIBS $LIBNOTIFY_LIBS" ++ GUI_CFLAGS="$GUI_CFLAGS $LIBNOTIFY_CFLAGS" ++ AC_DEFINE(USE_LIBNOTIFY) ++ fi ++fi ++ ++dnl ********************************************************************* + dnl ** SPELL ************************************************************ + dnl ********************************************************************* + + if test "$spell" = "gtkspell" ; then + PKG_CHECK_MODULES(GTKSPELL, gtkspell-2.0 >= 2.0.2, [], [ + AC_MSG_RESULT(no) + spell=no + ]) +@@ -519,16 +540,17 @@ if test "$spell" = "static" ; then + fi + + dnl ********************************************************************* + dnl ** CONDITIONALS ***************************************************** + dnl ********************************************************************* + + AM_CONDITIONAL(USE_OPENSSL, test "x$openssl" = "xyes") + AM_CONDITIONAL(USE_LIBSEXY, test "x$spell" = "xstatic") ++AM_CONDITIONAL(USE_LIBNOTIFY, test "x$libnotify" = "xyes") + AM_CONDITIONAL(DO_TEXT, test "x$textfe" = "xyes") + AM_CONDITIONAL(DO_GTK, test "x$gtkfe" = "xyes") + AM_CONDITIONAL(DO_PERL, test "x$perl" = "xyes") + AM_CONDITIONAL(DO_PYTHON, test "x$python" = "xyes") + AM_CONDITIONAL(DO_TCL, test "x$tcl" = "xyes") + AM_CONDITIONAL(DO_PLUGIN, test "x$plugin" = "xyes") + AM_CONDITIONAL(USE_DBUS, test "x$dbus" = "xyes") + AM_CONDITIONAL(DO_GCONF, test "x$GCONFTOOL" != "xno") +@@ -807,16 +829,17 @@ echo mmx tinting ......... : $mmx\ spell + echo XShm tinting ........ : $shm\ plugin interface ...... : $plugin + if test "$xft" = no; then + echo text backend ........ : pango\ nls/gettext ........... : $USE_NLS + else + echo text backend ........ : xft\ nls/gettext ........... : $USE_NLS + fi + echo openssl support ..... : $openssl\ ipv6 support .......... : $ipv6 + echo dbus support ........ : $dbus\ msproxy ntlm \(ISA\) .... : $have_ntlm ++echo libnotify support ... : $libnotify + echo + echo The binary will be installed in $prefix/bin + echo + + if test "$gtkfe" = no; then + echo Warning: The GTK \(GUI\) frontend will not be built. + echo + fi +diff -p -U8 xchat-2.8.8/src/fe-gtk/plugin-tray.c.libnotifyso4 xchat-2.8.8/src/fe-gtk/plugin-tray.c +--- xchat-2.8.8/src/fe-gtk/plugin-tray.c.libnotifyso4 2011-04-07 17:57:27.524307905 -0700 ++++ xchat-2.8.8/src/fe-gtk/plugin-tray.c 2011-04-07 19:18:33.429475719 -0700 +@@ -10,17 +10,27 @@ + #include "../common/fe.h" + #include "../common/util.h" + #include "fe-gtk.h" + #include "pixmaps.h" + #include "maingui.h" + #include "menu.h" + #include + +-#define LIBNOTIFY ++#ifdef USE_LIBNOTIFY ++#include ++#ifndef NOTIFY_CHECK_VERSION ++#define NOTIFY_CHECK_VERSION(x,y,z) 0 ++#endif ++#if NOTIFY_CHECK_VERSION(0,7,0) ++#define XC_NOTIFY_NEW(a,b,c,d) notify_notification_new(a,b,c) ++#else ++#define XC_NOTIFY_NEW(a,b,c,d) notify_notification_new(a,b,c,d) ++#endif ++#endif + + typedef enum /* current icon status */ + { + TS_NONE, + TS_MESSAGE, + TS_HIGHLIGHT, + TS_FILEOFFER, + TS_CUSTOM /* plugin */ +@@ -112,90 +122,16 @@ tray_count_networks (void) + + void + fe_tray_set_tooltip (const char *text) + { + if (sticon) + gtk_status_icon_set_tooltip (sticon, text); + } + +-#ifdef LIBNOTIFY +- +-/* dynamic access to libnotify.so */ +- +-static void *nn_mod = NULL; +-/* prototypes */ +-static gboolean (*nn_init) (char *); +-static void (*nn_uninit) (void); +-/* recent versions of libnotify don't take the fourth GtkWidget argument, but passing an +- * extra NULL argument will be fine */ +-static void *(*nn_new) (const gchar *summary, const gchar *message, const gchar *icon, gpointer dummy); +-static gboolean (*nn_show) (void *noti, GError **error); +-static void (*nn_set_timeout) (void *noti, gint timeout); +- +-static void +-libnotify_cleanup (void) +-{ +- if (nn_mod) +- { +- nn_uninit (); +- g_module_close (nn_mod); +- nn_mod = NULL; +- } +-} +- +-static gboolean +-libnotify_notify_new (const char *title, const char *text, GtkStatusIcon *icon) +-{ +- void *noti; +- +- if (!nn_mod) +- { +- nn_mod = g_module_open ("libnotify", G_MODULE_BIND_LAZY); +- if (!nn_mod) +- { +- nn_mod = g_module_open ("libnotify.so.1", G_MODULE_BIND_LAZY); +- if (!nn_mod) +- return FALSE; +- } +- +- if (!g_module_symbol (nn_mod, "notify_init", (gpointer)&nn_init)) +- goto bad; +- if (!g_module_symbol (nn_mod, "notify_uninit", (gpointer)&nn_uninit)) +- goto bad; +- if (!g_module_symbol (nn_mod, "notify_notification_new", (gpointer)&nn_new)) +- goto bad; +- if (!g_module_symbol (nn_mod, "notify_notification_show", (gpointer)&nn_show)) +- goto bad; +- if (!g_module_symbol (nn_mod, "notify_notification_set_timeout", (gpointer)&nn_set_timeout)) +- goto bad; +- if (!nn_init (PACKAGE_NAME)) +- goto bad; +- } +- +- text = strip_color (text, -1, STRIP_ALL|STRIP_ESCMARKUP); +- title = strip_color (title, -1, STRIP_ALL); +- noti = nn_new (title, text, XCHATSHAREDIR"/pixmaps/xchat.png", NULL); +- g_free ((char *)title); +- g_free ((char *)text); +- +- nn_set_timeout (noti, prefs.input_balloon_time*1000); +- nn_show (noti, NULL); +- g_object_unref (G_OBJECT (noti)); +- +- return TRUE; +- +-bad: +- g_module_close (nn_mod); +- nn_mod = NULL; +- return FALSE; +-} +- +-#endif +- + void + fe_tray_set_balloon (const char *title, const char *text) + { + #ifndef WIN32 + const char *argv[8]; + const char *path; + char time[16]; + WinStatus ws; +@@ -208,52 +144,36 @@ fe_tray_set_balloon (const char *title, + /* bit 1 of flags means "no balloons unless hidden/iconified" */ + if (ws != WS_HIDDEN && (prefs.gui_tray_flags & 2)) + return; + + /* FIXME: this should close the current balloon */ + if (!text) + return; + +-#ifdef LIBNOTIFY +- /* try it via libnotify.so */ +- if (libnotify_notify_new (title, text, sticon)) +- return; /* success */ +-#endif ++#ifdef USE_LIBNOTIFY ++ NotifyNotification *notification; ++ char *notify_text, *notify_title; + +- /* try it the crude way */ +- path = g_find_program_in_path ("notify-send"); +- if (path) +- { +- sprintf(time, "%d000",prefs.input_balloon_time); +- argv[0] = path; +- argv[1] = "-i"; +- argv[2] = "gtk-dialog-info"; +- if (access (XCHATSHAREDIR"/pixmaps/xchat.png", R_OK) == 0) +- argv[2] = XCHATSHAREDIR"/pixmaps/xchat.png"; +- argv[3] = "-t"; +- argv[4] = time; +- argv[5] = title; +- text = strip_color (text, -1, STRIP_ALL|STRIP_ESCMARKUP); +- argv[6] = text; +- argv[7] = NULL; +- xchat_execv (argv); +- g_free ((char *)path); +- g_free ((char *)text); +- } +- else +- { +- /* show this error only once */ +- static unsigned char said_it = FALSE; +- if (!said_it) +- { +- said_it = TRUE; +- fe_message (_("Cannot find 'notify-send' to open balloon alerts.\nPlease install libnotify."), FE_MSG_ERROR); +- } +- } ++ if (!notify_is_initted()) ++ notify_init(PACKAGE_NAME); ++ ++ notify_text = strip_color (text, -1, STRIP_ALL|STRIP_ESCMARKUP); ++ notify_title = strip_color (title, -1, STRIP_ALL); ++ ++ notification = XC_NOTIFY_NEW (notify_title, notify_text, XCHATSHAREDIR"/pixmaps/xchat.png", NULL); ++ ++ g_free ((char *)notify_title); ++ g_free ((char *)notify_text); ++ ++ notify_notification_set_timeout (notification, prefs.input_balloon_time*1000); ++ notify_notification_show (notification, NULL); ++ ++ g_object_unref (notification); ++#endif + #endif + } + + static void + tray_set_balloonf (const char *text, const char *format, ...) + { + va_list args; + char *buf; +@@ -840,13 +760,13 @@ tray_plugin_init (xchat_plugin *plugin_h + return 1; /* return 1 for success */ + } + + int + tray_plugin_deinit (xchat_plugin *plugin_handle) + { + #ifdef WIN32 + tray_cleanup (); +-#elif defined(LIBNOTIFY) +- libnotify_cleanup (); ++#elif defined(USE_LIBNOTIFY) ++ notify_uninit (); + #endif + return 1; + } diff --git a/SOURCES/xchat-2.8.8-notifications-and-tray.patch b/SOURCES/xchat-2.8.8-notifications-and-tray.patch new file mode 100644 index 0000000..0803ce2 --- /dev/null +++ b/SOURCES/xchat-2.8.8-notifications-and-tray.patch @@ -0,0 +1,30 @@ +diff -urNp xchat-2.8.8/src/common/cfgfiles.c xchat-2.8.8-notifications-and-tray/src/common/cfgfiles.c +--- xchat-2.8.8/src/common/cfgfiles.c 2009-08-16 11:40:16.000000000 +0200 ++++ xchat-2.8.8-notifications-and-tray/src/common/cfgfiles.c 2012-11-27 15:34:13.080403744 +0100 +@@ -670,11 +670,13 @@ load_config (void) + prefs.autoopendccchatwindow = 1; + prefs.userhost = 1; + prefs.gui_url_mod = 4; /* ctrl */ +- prefs.gui_tray = 1; ++ prefs.gui_tray = 0; + prefs.gui_pane_left_size = 100; + prefs.gui_pane_right_size = 100; + prefs.mainwindow_save = 1; + prefs.bantype = 2; ++ prefs.input_balloon_hilight = 1; ++ prefs.input_balloon_priv = 1; + prefs.input_balloon_time = 20; + prefs.input_flash_priv = prefs.input_flash_hilight = 1; + prefs.input_tray_priv = prefs.input_tray_hilight = 1; +diff -urNp xchat-2.8.8/src/fe-gtk/maingui.c xchat-2.8.8-notifications-and-tray/src/fe-gtk/maingui.c +--- xchat-2.8.8/src/fe-gtk/maingui.c 2010-05-16 05:15:55.000000000 +0200 ++++ xchat-2.8.8-notifications-and-tray/src/fe-gtk/maingui.c 2012-11-27 16:05:27.609518192 +0100 +@@ -3107,7 +3107,7 @@ mg_tabwindow_de_cb (GtkWidget *widget, G + list = list->next; + } + +- mg_open_quit_dialog (TRUE); ++ mg_open_quit_dialog (FALSE); + return TRUE; + } + diff --git a/SOURCES/xchat-2.8.8-restore-status-icon.patch b/SOURCES/xchat-2.8.8-restore-status-icon.patch new file mode 100644 index 0000000..d304947 --- /dev/null +++ b/SOURCES/xchat-2.8.8-restore-status-icon.patch @@ -0,0 +1,61 @@ +diff -urNp xchat-2.8.8.orig/src/fe-gtk/plugin-tray.c xchat-2.8.8/src/fe-gtk/plugin-tray.c +--- xchat-2.8.8.orig/src/fe-gtk/plugin-tray.c 2019-08-16 15:08:14.591032240 +0200 ++++ xchat-2.8.8/src/fe-gtk/plugin-tray.c 2019-08-16 15:09:06.772393960 +0200 +@@ -65,9 +65,13 @@ static int tray_priv_count = 0; + static int tray_pub_count = 0; + static int tray_hilight_count = 0; + static int tray_file_count = 0; ++static int tray_restore_timer = 0; + + + void tray_apply_setup (void); ++static gboolean tray_menu_try_restore (void); ++static void tray_cleanup (void); ++static void tray_init (void); + + + static WinStatus +@@ -406,6 +410,34 @@ tray_menu_restore_cb (GtkWidget *item, g + } + + static void ++tray_menu_notify_cb (GObject *tray, GParamSpec *pspec, gpointer user_data) ++{ ++ if (sticon) ++ { ++ if (!gtk_status_icon_is_embedded (sticon)) ++ { ++ tray_restore_timer = g_timeout_add (500, (GSourceFunc)tray_menu_try_restore, NULL); ++ } ++ else ++ { ++ if (tray_restore_timer) ++ { ++ g_source_remove (tray_restore_timer); ++ tray_restore_timer = 0; ++ } ++ } ++ } ++} ++ ++static gboolean ++tray_menu_try_restore (void) ++{ ++ tray_cleanup (); ++ tray_init (); ++ return TRUE; ++} ++ ++static void + tray_menu_quit_cb (GtkWidget *item, gpointer userdata) + { + mg_open_quit_dialog (FALSE); +@@ -555,6 +587,8 @@ tray_init (void) + G_CALLBACK (tray_menu_cb), sticon); + g_signal_connect (G_OBJECT (sticon), "activate", + G_CALLBACK (tray_menu_restore_cb), NULL); ++ g_signal_connect (G_OBJECT (sticon), "notify::embedded", ++ G_CALLBACK (tray_menu_notify_cb), NULL); + } + + static int diff --git a/SOURCES/xchat-2.8.8-xdg-dirs.patch b/SOURCES/xchat-2.8.8-xdg-dirs.patch new file mode 100644 index 0000000..5530085 --- /dev/null +++ b/SOURCES/xchat-2.8.8-xdg-dirs.patch @@ -0,0 +1,1224 @@ +diff -urNp xchat-2.8.8.orig/src/common/cfgfiles.c xchat-2.8.8/src/common/cfgfiles.c +--- xchat-2.8.8.orig/src/common/cfgfiles.c 2013-06-10 14:01:07.402432963 +0200 ++++ xchat-2.8.8/src/common/cfgfiles.c 2013-06-10 14:27:09.668464169 +0200 +@@ -1,3 +1,4 @@ ++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ + /* X-Chat + * Copyright (C) 1998 Peter Zelezny. + * +@@ -34,7 +35,8 @@ + #ifdef WIN32 + #define XCHAT_DIR "X-Chat 2" + #else +-#define XCHAT_DIR ".xchat2" ++#define XCHAT_DIR "xchat2" ++#define OLD_XCHAT_DIR ".xchat2" + #endif + #define DEF_FONT "Monospace 9" + +@@ -318,17 +320,68 @@ get_xdir_fs (void) + return xdir_fs; + } + ++void ++maybe_migrate_xdg_config (void) ++{ ++} ++ + #else + + char * + get_xdir_fs (void) + { + if (!xdir_fs) +- xdir_fs = g_strdup_printf ("%s/" XCHAT_DIR, g_get_home_dir ()); ++ xdir_fs = g_strdup_printf ("%s/" XCHAT_DIR, g_get_user_config_dir ()); + + return xdir_fs; + } + ++void ++maybe_migrate_xdg_config (void) ++{ ++ char *old_dir; ++ char *new_dir; ++ GFile *source; ++ GFile *dest; ++ GError *error; ++ gboolean res; ++ ++ new_dir = g_strdup_printf ("%s/" XCHAT_DIR, g_get_user_config_dir ()); ++ ++ /* already migrated */ ++ if (g_file_test (new_dir, G_FILE_TEST_IS_DIR)) ++ { ++ g_free (new_dir); ++ return; ++ } ++ ++ /* nothing to migrate */ ++ old_dir = g_strdup_printf ("%s/" OLD_XCHAT_DIR, g_get_home_dir ()); ++ if (!g_file_test (old_dir, G_FILE_TEST_IS_DIR)) ++ { ++ g_free (old_dir); ++ g_free (new_dir); ++ return; ++ } ++ ++ source = g_file_new_for_path (old_dir); ++ dest = g_file_new_for_path (new_dir); ++ ++ g_message (_("Migrating data from %s to %s"), old_dir, new_dir); ++ error = NULL; ++ res = g_file_move (source, dest, G_FILE_COPY_NONE, NULL, NULL, NULL, &error); ++ if (error != NULL) ++ { ++ g_warning (_("Error migrating data: %s"), error->message); ++ g_error_free (error); ++ } ++ ++ g_free (old_dir); ++ g_free (new_dir); ++ g_object_unref (source); ++ g_object_unref (dest); ++} ++ + #endif /* !WIN32 */ + + char * +@@ -351,7 +404,7 @@ check_prefs_dir (void) + #else + if (mkdir (dir, S_IRUSR | S_IWUSR | S_IXUSR) != 0) + #endif +- fe_message (_("Cannot create ~/.xchat2"), FE_MSG_ERROR); ++ fe_message (_("Cannot create configuration directory"), FE_MSG_ERROR); + } + } + +@@ -593,6 +646,7 @@ load_config (void) + const char *username, *realname; + int res, val, i, fh; + ++ maybe_migrate_xdg_config (); + check_prefs_dir (); + username = g_get_user_name (); + if (!username) +diff -urNp xchat-2.8.8.orig/src/common/cfgfiles.c.orig xchat-2.8.8/src/common/cfgfiles.c.orig +--- xchat-2.8.8.orig/src/common/cfgfiles.c.orig 1970-01-01 01:00:00.000000000 +0100 ++++ xchat-2.8.8/src/common/cfgfiles.c.orig 2013-06-10 14:26:18.219319628 +0200 +@@ -0,0 +1,1104 @@ ++/* X-Chat ++ * Copyright (C) 1998 Peter Zelezny. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "xchat.h" ++#include "cfgfiles.h" ++#include "util.h" ++#include "fe.h" ++#include "text.h" ++#include "xchatc.h" ++ ++#ifdef WIN32 ++#define XCHAT_DIR "X-Chat 2" ++#else ++#define XCHAT_DIR ".xchat2" ++#endif ++#define DEF_FONT "Monospace 9" ++ ++void ++list_addentry (GSList ** list, char *cmd, char *name) ++{ ++ struct popup *pop; ++ int cmd_len = 1, name_len; ++ ++ /* remove <2.8.0 stuff */ ++ if (!strcmp (cmd, "away") && !strcmp (name, "BACK")) ++ return; ++ ++ if (cmd) ++ cmd_len = strlen (cmd) + 1; ++ name_len = strlen (name) + 1; ++ ++ pop = malloc (sizeof (struct popup) + cmd_len + name_len); ++ pop->name = (char *) pop + sizeof (struct popup); ++ pop->cmd = pop->name + name_len; ++ ++ memcpy (pop->name, name, name_len); ++ if (cmd) ++ memcpy (pop->cmd, cmd, cmd_len); ++ else ++ pop->cmd[0] = 0; ++ ++ *list = g_slist_append (*list, pop); ++} ++ ++/* read it in from a buffer to our linked list */ ++ ++static void ++list_load_from_data (GSList ** list, char *ibuf, int size) ++{ ++ char cmd[384]; ++ char name[128]; ++ char *buf; ++ int pnt = 0; ++ ++ cmd[0] = 0; ++ name[0] = 0; ++ ++ while (buf_get_line (ibuf, &buf, &pnt, size)) ++ { ++ if (*buf != '#') ++ { ++ if (!strncasecmp (buf, "NAME ", 5)) ++ { ++ safe_strcpy (name, buf + 5, sizeof (name)); ++ } ++ else if (!strncasecmp (buf, "CMD ", 4)) ++ { ++ safe_strcpy (cmd, buf + 4, sizeof (cmd)); ++ if (*name) ++ { ++ list_addentry (list, cmd, name); ++ cmd[0] = 0; ++ name[0] = 0; ++ } ++ } ++ } ++ } ++} ++ ++void ++list_loadconf (char *file, GSList ** list, char *defaultconf) ++{ ++ char filebuf[256]; ++ char *ibuf; ++ int fh; ++ struct stat st; ++ ++ snprintf (filebuf, sizeof (filebuf), "%s/%s", get_xdir_fs (), file); ++ fh = open (filebuf, O_RDONLY | OFLAGS); ++ if (fh == -1) ++ { ++ if (defaultconf) ++ list_load_from_data (list, defaultconf, strlen (defaultconf)); ++ return; ++ } ++ if (fstat (fh, &st) != 0) ++ { ++ perror ("fstat"); ++ abort (); ++ } ++ ++ ibuf = malloc (st.st_size); ++ read (fh, ibuf, st.st_size); ++ close (fh); ++ ++ list_load_from_data (list, ibuf, st.st_size); ++ ++ free (ibuf); ++} ++ ++void ++list_free (GSList ** list) ++{ ++ void *data; ++ while (*list) ++ { ++ data = (void *) (*list)->data; ++ free (data); ++ *list = g_slist_remove (*list, data); ++ } ++} ++ ++int ++list_delentry (GSList ** list, char *name) ++{ ++ struct popup *pop; ++ GSList *alist = *list; ++ ++ while (alist) ++ { ++ pop = (struct popup *) alist->data; ++ if (!strcasecmp (name, pop->name)) ++ { ++ *list = g_slist_remove (*list, pop); ++ free (pop); ++ return 1; ++ } ++ alist = alist->next; ++ } ++ return 0; ++} ++ ++char * ++cfg_get_str (char *cfg, char *var, char *dest, int dest_len) ++{ ++ while (1) ++ { ++ if (!strncasecmp (var, cfg, strlen (var))) ++ { ++ char *value, t; ++ cfg += strlen (var); ++ while (*cfg == ' ') ++ cfg++; ++ if (*cfg == '=') ++ cfg++; ++ while (*cfg == ' ') ++ cfg++; ++ /*while (*cfg == ' ' || *cfg == '=') ++ cfg++; */ ++ value = cfg; ++ while (*cfg != 0 && *cfg != '\n') ++ cfg++; ++ t = *cfg; ++ *cfg = 0; ++ safe_strcpy (dest, value, dest_len); ++ *cfg = t; ++ return cfg; ++ } ++ while (*cfg != 0 && *cfg != '\n') ++ cfg++; ++ if (*cfg == 0) ++ return 0; ++ cfg++; ++ if (*cfg == 0) ++ return 0; ++ } ++} ++ ++static int ++cfg_put_str (int fh, char *var, char *value) ++{ ++ char buf[512]; ++ int len; ++ ++ snprintf (buf, sizeof buf, "%s = %s\n", var, value); ++ len = strlen (buf); ++ return (write (fh, buf, len) == len); ++} ++ ++int ++cfg_put_color (int fh, int r, int g, int b, char *var) ++{ ++ char buf[400]; ++ int len; ++ ++ snprintf (buf, sizeof buf, "%s = %04x %04x %04x\n", var, r, g, b); ++ len = strlen (buf); ++ return (write (fh, buf, len) == len); ++} ++ ++int ++cfg_put_int (int fh, int value, char *var) ++{ ++ char buf[400]; ++ int len; ++ ++ if (value == -1) ++ value = 1; ++ ++ snprintf (buf, sizeof buf, "%s = %d\n", var, value); ++ len = strlen (buf); ++ return (write (fh, buf, len) == len); ++} ++ ++int ++cfg_get_color (char *cfg, char *var, int *r, int *g, int *b) ++{ ++ char str[128]; ++ ++ if (!cfg_get_str (cfg, var, str, sizeof (str))) ++ return 0; ++ ++ sscanf (str, "%04x %04x %04x", r, g, b); ++ return 1; ++} ++ ++int ++cfg_get_int_with_result (char *cfg, char *var, int *result) ++{ ++ char str[128]; ++ ++ if (!cfg_get_str (cfg, var, str, sizeof (str))) ++ { ++ *result = 0; ++ return 0; ++ } ++ ++ *result = 1; ++ return atoi (str); ++} ++ ++int ++cfg_get_int (char *cfg, char *var) ++{ ++ char str[128]; ++ ++ if (!cfg_get_str (cfg, var, str, sizeof (str))) ++ return 0; ++ ++ return atoi (str); ++} ++ ++char *xdir_fs = NULL; /* file system encoding */ ++char *xdir_utf = NULL; /* utf-8 encoding */ ++ ++#ifdef WIN32 ++ ++#include ++ ++static gboolean ++get_reg_str (const char *sub, const char *name, char *out, DWORD len) ++{ ++ HKEY hKey; ++ DWORD t; ++ ++ if (RegOpenKeyEx (HKEY_CURRENT_USER, sub, 0, KEY_READ, &hKey) == ++ ERROR_SUCCESS) ++ { ++ if (RegQueryValueEx (hKey, name, NULL, &t, out, &len) != ERROR_SUCCESS || ++ t != REG_SZ) ++ { ++ RegCloseKey (hKey); ++ return FALSE; ++ } ++ out[len-1] = 0; ++ RegCloseKey (hKey); ++ return TRUE; ++ } ++ ++ return FALSE; ++} ++ ++char * ++get_xdir_fs (void) ++{ ++ if (!xdir_fs) ++ { ++ char out[256]; ++ ++ if (!get_reg_str ("Software\\Microsoft\\Windows\\CurrentVersion\\" ++ "Explorer\\Shell Folders", "AppData", out, sizeof (out))) ++ return "./config"; ++ xdir_fs = g_strdup_printf ("%s\\" XCHAT_DIR, out); ++ } ++ return xdir_fs; ++} ++ ++#else ++ ++char * ++get_xdir_fs (void) ++{ ++ if (!xdir_fs) ++ xdir_fs = g_strdup_printf ("%s/" XCHAT_DIR, g_get_home_dir ()); ++ ++ return xdir_fs; ++} ++ ++#endif /* !WIN32 */ ++ ++char * ++get_xdir_utf8 (void) ++{ ++ if (!xdir_utf) /* never free this, keep it for program life time */ ++ xdir_utf = xchat_filename_to_utf8 (get_xdir_fs (), -1, 0, 0, 0); ++ ++ return xdir_utf; ++} ++ ++static void ++check_prefs_dir (void) ++{ ++ char *dir = get_xdir_fs (); ++ if (access (dir, F_OK) != 0) ++ { ++#ifdef WIN32 ++ if (mkdir (dir) != 0) ++#else ++ if (mkdir (dir, S_IRUSR | S_IWUSR | S_IXUSR) != 0) ++#endif ++ fe_message (_("Cannot create ~/.xchat2"), FE_MSG_ERROR); ++ } ++} ++ ++static char * ++default_file (void) ++{ ++ static char *dfile = 0; ++ ++ if (!dfile) ++ { ++ dfile = malloc (strlen (get_xdir_fs ()) + 12); ++ sprintf (dfile, "%s/xchat.conf", get_xdir_fs ()); ++ } ++ return dfile; ++} ++ ++/* Keep these sorted!! */ ++ ++const struct prefs vars[] = { ++ {"auto_save", P_OFFINT (autosave), TYPE_BOOL}, ++ {"auto_save_url", P_OFFINT (autosave_url), TYPE_BOOL}, ++ ++ {"away_auto_unmark", P_OFFINT (auto_unmark_away), TYPE_BOOL}, ++ {"away_reason", P_OFFSET (awayreason), TYPE_STR}, ++ {"away_show_message", P_OFFINT (show_away_message), TYPE_BOOL}, ++ {"away_show_once", P_OFFINT (show_away_once), TYPE_BOOL}, ++ {"away_size_max", P_OFFINT (away_size_max), TYPE_INT}, ++ {"away_timeout", P_OFFINT (away_timeout), TYPE_INT}, ++ {"away_track", P_OFFINT (away_track), TYPE_BOOL}, ++ ++ {"completion_amount", P_OFFINT (completion_amount), TYPE_INT}, ++ {"completion_auto", P_OFFINT (nickcompletion), TYPE_BOOL}, ++ {"completion_sort", P_OFFINT (completion_sort), TYPE_INT}, ++ {"completion_suffix", P_OFFSET (nick_suffix), TYPE_STR}, ++ ++ {"dcc_auto_chat", P_OFFINT (autodccchat), TYPE_INT}, ++ {"dcc_auto_resume", P_OFFINT (autoresume), TYPE_BOOL}, ++ {"dcc_auto_send", P_OFFINT (autodccsend), TYPE_INT}, ++ {"dcc_blocksize", P_OFFINT (dcc_blocksize), TYPE_INT}, ++ {"dcc_completed_dir", P_OFFSET (dcc_completed_dir), TYPE_STR}, ++ {"dcc_dir", P_OFFSET (dccdir), TYPE_STR}, ++ {"dcc_fast_send", P_OFFINT (fastdccsend), TYPE_BOOL}, ++ {"dcc_global_max_get_cps", P_OFFINT (dcc_global_max_get_cps), TYPE_INT}, ++ {"dcc_global_max_send_cps", P_OFFINT (dcc_global_max_send_cps), TYPE_INT}, ++ {"dcc_ip", P_OFFSET (dcc_ip_str), TYPE_STR}, ++ {"dcc_ip_from_server", P_OFFINT (ip_from_server), TYPE_BOOL}, ++ {"dcc_max_get_cps", P_OFFINT (dcc_max_get_cps), TYPE_INT}, ++ {"dcc_max_send_cps", P_OFFINT (dcc_max_send_cps), TYPE_INT}, ++ {"dcc_permissions", P_OFFINT (dccpermissions), TYPE_INT}, ++ {"dcc_port_first", P_OFFINT (first_dcc_send_port), TYPE_INT}, ++ {"dcc_port_last", P_OFFINT (last_dcc_send_port), TYPE_INT}, ++ {"dcc_remove", P_OFFINT (dcc_remove), TYPE_BOOL}, ++ {"dcc_save_nick", P_OFFINT (dccwithnick), TYPE_BOOL}, ++ {"dcc_send_fillspaces", P_OFFINT (dcc_send_fillspaces), TYPE_BOOL}, ++ {"dcc_stall_timeout", P_OFFINT (dccstalltimeout), TYPE_INT}, ++ {"dcc_timeout", P_OFFINT (dcctimeout), TYPE_INT}, ++ ++ {"dnsprogram", P_OFFSET (dnsprogram), TYPE_STR}, ++ ++ {"flood_ctcp_num", P_OFFINT (ctcp_number_limit), TYPE_INT}, ++ {"flood_ctcp_time", P_OFFINT (ctcp_time_limit), TYPE_INT}, ++ {"flood_msg_num", P_OFFINT (msg_number_limit), TYPE_INT}, ++ {"flood_msg_time", P_OFFINT (msg_time_limit), TYPE_INT}, ++ ++ {"gui_auto_open_chat", P_OFFINT (autoopendccchatwindow), TYPE_BOOL}, ++ {"gui_auto_open_dialog", P_OFFINT (autodialog), TYPE_BOOL}, ++ {"gui_auto_open_recv", P_OFFINT (autoopendccrecvwindow), TYPE_BOOL}, ++ {"gui_auto_open_send", P_OFFINT (autoopendccsendwindow), TYPE_BOOL}, ++ {"gui_dialog_height", P_OFFINT (dialog_height), TYPE_INT}, ++ {"gui_dialog_left", P_OFFINT (dialog_left), TYPE_INT}, ++ {"gui_dialog_top", P_OFFINT (dialog_top), TYPE_INT}, ++ {"gui_dialog_width", P_OFFINT (dialog_width), TYPE_INT}, ++ {"gui_hide_menu", P_OFFINT (hidemenu), TYPE_BOOL}, ++ {"gui_input_spell", P_OFFINT (gui_input_spell), TYPE_BOOL}, ++ {"gui_input_style", P_OFFINT (style_inputbox), TYPE_BOOL}, ++ {"gui_join_dialog", P_OFFINT (gui_join_dialog), TYPE_BOOL}, ++ {"gui_lagometer", P_OFFINT (lagometer), TYPE_INT}, ++ {"gui_mode_buttons", P_OFFINT (chanmodebuttons), TYPE_BOOL}, ++ {"gui_pane_left_size", P_OFFINT (gui_pane_left_size), TYPE_INT}, ++ {"gui_pane_right_size", P_OFFINT (gui_pane_right_size), TYPE_INT}, ++ {"gui_quit_dialog", P_OFFINT (gui_quit_dialog), TYPE_BOOL}, ++ {"gui_slist_select", P_OFFINT (slist_select), TYPE_INT}, ++ {"gui_slist_skip", P_OFFINT (slist_skip), TYPE_BOOL}, ++ {"gui_throttlemeter", P_OFFINT (throttlemeter), TYPE_INT}, ++ {"gui_topicbar", P_OFFINT (topicbar), TYPE_BOOL}, ++ {"gui_tray", P_OFFINT (gui_tray), TYPE_BOOL}, ++ {"gui_tray_flags", P_OFFINT (gui_tray_flags), TYPE_INT}, ++ {"gui_tweaks", P_OFFINT (gui_tweaks), TYPE_INT}, ++ {"gui_ulist_buttons", P_OFFINT (userlistbuttons), TYPE_BOOL}, ++ {"gui_ulist_doubleclick", P_OFFSET (doubleclickuser), TYPE_STR}, ++ {"gui_ulist_hide", P_OFFINT (hideuserlist), TYPE_BOOL}, ++ {"gui_ulist_left", P_OFFINT (_gui_ulist_left), TYPE_BOOL}, /* obsolete */ ++ {"gui_ulist_pos", P_OFFINT (gui_ulist_pos), TYPE_INT}, ++ {"gui_ulist_resizable", P_OFFINT (paned_userlist), TYPE_BOOL}, ++ {"gui_ulist_show_hosts", P_OFFINT(showhostname_in_userlist), TYPE_BOOL}, ++ {"gui_ulist_sort", P_OFFINT (userlist_sort), TYPE_INT}, ++ {"gui_ulist_style", P_OFFINT (style_namelistgad), TYPE_BOOL}, ++ {"gui_url_mod", P_OFFINT (gui_url_mod), TYPE_INT}, ++ {"gui_usermenu", P_OFFINT (gui_usermenu), TYPE_BOOL}, ++ {"gui_win_height", P_OFFINT (mainwindow_height), TYPE_INT}, ++ {"gui_win_left", P_OFFINT (mainwindow_left), TYPE_INT}, ++ {"gui_win_save", P_OFFINT (mainwindow_save), TYPE_BOOL}, ++ {"gui_win_state", P_OFFINT (gui_win_state), TYPE_INT}, ++ {"gui_win_top", P_OFFINT (mainwindow_top), TYPE_INT}, ++ {"gui_win_width", P_OFFINT (mainwindow_width), TYPE_INT}, ++ ++#ifdef WIN32 ++ {"identd", P_OFFINT (identd), TYPE_BOOL}, ++#endif ++ {"input_balloon_chans", P_OFFINT (input_balloon_chans), TYPE_BOOL}, ++ {"input_balloon_hilight", P_OFFINT (input_balloon_hilight), TYPE_BOOL}, ++ {"input_balloon_priv", P_OFFINT (input_balloon_priv), TYPE_BOOL}, ++ {"input_balloon_time", P_OFFINT (input_balloon_time), TYPE_INT}, ++ {"input_beep_chans", P_OFFINT (input_beep_chans), TYPE_BOOL}, ++ {"input_beep_hilight", P_OFFINT (input_beep_hilight), TYPE_BOOL}, ++ {"input_beep_msg", P_OFFINT (input_beep_priv), TYPE_BOOL}, ++ {"input_command_char", P_OFFSET (cmdchar), TYPE_STR}, ++ {"input_filter_beep", P_OFFINT (filterbeep), TYPE_BOOL}, ++ {"input_flash_chans", P_OFFINT (input_flash_chans), TYPE_BOOL}, ++ {"input_flash_hilight", P_OFFINT (input_flash_hilight), TYPE_BOOL}, ++ {"input_flash_priv", P_OFFINT (input_flash_priv), TYPE_BOOL}, ++ {"input_perc_ascii", P_OFFINT (perc_ascii), TYPE_BOOL}, ++ {"input_perc_color", P_OFFINT (perc_color), TYPE_BOOL}, ++ {"input_tray_chans", P_OFFINT (input_tray_chans), TYPE_BOOL}, ++ {"input_tray_hilight", P_OFFINT (input_tray_hilight), TYPE_BOOL}, ++ {"input_tray_priv", P_OFFINT (input_tray_priv), TYPE_BOOL}, ++ ++ {"irc_auto_rejoin", P_OFFINT (autorejoin), TYPE_BOOL}, ++ {"irc_ban_type", P_OFFINT (bantype), TYPE_INT}, ++ {"irc_conf_mode", P_OFFINT (confmode), TYPE_BOOL}, ++ {"irc_extra_hilight", P_OFFSET (irc_extra_hilight), TYPE_STR}, ++ {"irc_hide_version", P_OFFINT (hidever), TYPE_BOOL}, ++ {"irc_id_ntext", P_OFFSET (irc_id_ntext), TYPE_STR}, ++ {"irc_id_ytext", P_OFFSET (irc_id_ytext), TYPE_STR}, ++ {"irc_invisible", P_OFFINT (invisible), TYPE_BOOL}, ++ {"irc_join_delay", P_OFFINT (irc_join_delay), TYPE_INT}, ++ {"irc_logging", P_OFFINT (logging), TYPE_BOOL}, ++ {"irc_logmask", P_OFFSET (logmask), TYPE_STR}, ++ {"irc_nick1", P_OFFSET (nick1), TYPE_STR}, ++ {"irc_nick2", P_OFFSET (nick2), TYPE_STR}, ++ {"irc_nick3", P_OFFSET (nick3), TYPE_STR}, ++ {"irc_nick_hilight", P_OFFSET (irc_nick_hilight), TYPE_STR}, ++ {"irc_no_hilight", P_OFFSET (irc_no_hilight), TYPE_STR}, ++ {"irc_part_reason", P_OFFSET (partreason), TYPE_STR}, ++ {"irc_quit_reason", P_OFFSET (quitreason), TYPE_STR}, ++ {"irc_raw_modes", P_OFFINT (raw_modes), TYPE_BOOL}, ++ {"irc_real_name", P_OFFSET (realname), TYPE_STR}, ++ {"irc_servernotice", P_OFFINT (servernotice), TYPE_BOOL}, ++ {"irc_skip_motd", P_OFFINT (skipmotd), TYPE_BOOL}, ++ {"irc_user_name", P_OFFSET (username), TYPE_STR}, ++ {"irc_wallops", P_OFFINT (wallops), TYPE_BOOL}, ++ {"irc_who_join", P_OFFINT (userhost), TYPE_BOOL}, ++ {"irc_whois_front", P_OFFINT (irc_whois_front), TYPE_BOOL}, ++ ++ {"net_auto_reconnect", P_OFFINT (autoreconnect), TYPE_BOOL}, ++ {"net_auto_reconnectonfail", P_OFFINT (autoreconnectonfail), TYPE_BOOL}, ++ {"net_bind_host", P_OFFSET (hostname), TYPE_STR}, ++ {"net_ping_timeout", P_OFFINT (pingtimeout), TYPE_INT}, ++ {"net_proxy_auth", P_OFFINT (proxy_auth), TYPE_BOOL}, ++ {"net_proxy_host", P_OFFSET (proxy_host), TYPE_STR}, ++ {"net_proxy_pass", P_OFFSET (proxy_pass), TYPE_STR}, ++ {"net_proxy_port", P_OFFINT (proxy_port), TYPE_INT}, ++ {"net_proxy_type", P_OFFINT (proxy_type), TYPE_INT}, ++ {"net_proxy_use", P_OFFINT (proxy_use), TYPE_INT}, ++ {"net_proxy_user", P_OFFSET (proxy_user), TYPE_STR}, ++ ++ {"net_reconnect_delay", P_OFFINT (recon_delay), TYPE_INT}, ++ {"net_throttle", P_OFFINT (throttle), TYPE_BOOL}, ++ ++ {"notify_timeout", P_OFFINT (notify_timeout), TYPE_INT}, ++ {"notify_whois_online", P_OFFINT (whois_on_notifyonline), TYPE_BOOL}, ++ ++ {"perl_warnings", P_OFFINT (perlwarnings), TYPE_BOOL}, ++ ++ {"sound_command", P_OFFSET (soundcmd), TYPE_STR}, ++ {"sound_dir", P_OFFSET (sounddir), TYPE_STR}, ++ {"stamp_log", P_OFFINT (timestamp_logs), TYPE_BOOL}, ++ {"stamp_log_format", P_OFFSET (timestamp_log_format), TYPE_STR}, ++ {"stamp_text", P_OFFINT (timestamp), TYPE_BOOL}, ++ {"stamp_text_format", P_OFFSET (stamp_format), TYPE_STR}, ++ ++ {"tab_chans", P_OFFINT (tabchannels), TYPE_BOOL}, ++ {"tab_dialogs", P_OFFINT (privmsgtab), TYPE_BOOL}, ++ {"tab_layout", P_OFFINT (tab_layout), TYPE_INT}, ++ {"tab_new_to_front", P_OFFINT (newtabstofront), TYPE_INT}, ++ {"tab_notices", P_OFFINT (notices_tabs), TYPE_BOOL}, ++ {"tab_pos", P_OFFINT (tab_pos), TYPE_INT}, ++ {"tab_position", P_OFFINT (_tabs_position), TYPE_INT}, /* obsolete */ ++ {"tab_server", P_OFFINT (use_server_tab), TYPE_BOOL}, ++ {"tab_small", P_OFFINT (tab_small), TYPE_INT}, ++ {"tab_sort", P_OFFINT (tab_sort), TYPE_BOOL}, ++ {"tab_trunc", P_OFFINT (truncchans), TYPE_INT}, ++ {"tab_utils", P_OFFINT (windows_as_tabs), TYPE_BOOL}, ++ ++ {"text_background", P_OFFSET (background), TYPE_STR}, ++ {"text_color_nicks", P_OFFINT (colorednicks), TYPE_BOOL}, ++ {"text_font", P_OFFSET (font_normal), TYPE_STR}, ++ {"text_indent", P_OFFINT (indent_nicks), TYPE_BOOL}, ++ {"text_max_indent", P_OFFINT (max_auto_indent), TYPE_INT}, ++ {"text_max_lines", P_OFFINT (max_lines), TYPE_INT}, ++ {"text_replay", P_OFFINT (text_replay), TYPE_BOOL}, ++ {"text_show_marker", P_OFFINT (show_marker), TYPE_BOOL}, ++ {"text_show_sep", P_OFFINT (show_separator), TYPE_BOOL}, ++ {"text_stripcolor", P_OFFINT (stripcolor), TYPE_BOOL}, ++ {"text_thin_sep", P_OFFINT (thin_separator), TYPE_BOOL}, ++ {"text_tint_blue", P_OFFINT (tint_blue), TYPE_INT}, ++ {"text_tint_green", P_OFFINT (tint_green), TYPE_INT}, ++ {"text_tint_red", P_OFFINT (tint_red), TYPE_INT}, ++ {"text_transparent", P_OFFINT (transparent), TYPE_BOOL}, ++ {"text_wordwrap", P_OFFINT (wordwrap), TYPE_BOOL}, ++ ++ {0, 0, 0}, ++}; ++ ++static char * ++convert_with_fallback (const char *str, const char *fallback) ++{ ++ char *utf; ++ ++ utf = g_locale_to_utf8 (str, -1, 0, 0, 0); ++ if (!utf) ++ { ++ /* this can happen if CHARSET envvar is set wrong */ ++ /* maybe it's already utf8 (breakage!) */ ++ if (!g_utf8_validate (str, -1, NULL)) ++ utf = g_strdup (fallback); ++ else ++ utf = g_strdup (str); ++ } ++ ++ return utf; ++} ++ ++void ++load_config (void) ++{ ++ struct stat st; ++ char *cfg, *sp; ++ const char *username, *realname; ++ int res, val, i, fh; ++ ++ check_prefs_dir (); ++ username = g_get_user_name (); ++ if (!username) ++ username = "root"; ++ ++ realname = g_get_real_name (); ++ if ((realname && realname[0] == 0) || !realname) ++ realname = username; ++ ++ username = convert_with_fallback (username, "username"); ++ realname = convert_with_fallback (realname, "realname"); ++ ++ memset (&prefs, 0, sizeof (struct xchatprefs)); ++ ++ /* put in default values, anything left out is automatically zero */ ++ prefs.local_ip = 0xffffffff; ++ prefs.irc_join_delay = 3; ++ prefs.show_marker = 1; ++ prefs.newtabstofront = 2; ++ prefs.completion_amount = 5; ++ prefs.away_timeout = 60; ++ prefs.away_size_max = 300; ++ prefs.away_track = 1; ++ prefs.timestamp_logs = 1; ++ prefs.truncchans = 20; ++ prefs.autoresume = 1; ++ prefs.show_away_once = 1; ++ prefs.indent_nicks = 1; ++ prefs.thin_separator = 1; ++ prefs._tabs_position = 2; /* 2 = left */ ++ prefs.fastdccsend = 1; ++ prefs.wordwrap = 1; ++ prefs.autosave = 1; ++ prefs.autodialog = 1; ++ prefs.gui_input_spell = 1; ++ prefs.autoreconnect = 1; ++ prefs.recon_delay = 10; ++ prefs.text_replay = 1; ++ prefs.tabchannels = 1; ++ prefs.tab_layout = 2; /* 0=Tabs 1=Reserved 2=Tree */ ++ prefs.tab_sort = 1; ++ prefs.paned_userlist = 1; ++ prefs.newtabstofront = 2; ++ prefs.use_server_tab = 1; ++ prefs.privmsgtab = 1; ++ /*prefs.style_inputbox = 1;*/ ++ prefs.dccpermissions = 0600; ++ prefs.max_lines = 500; ++ prefs.mainwindow_width = 640; ++ prefs.mainwindow_height = 400; ++ prefs.dialog_width = 500; ++ prefs.dialog_height = 256; ++ prefs.gui_join_dialog = 1; ++ prefs.gui_quit_dialog = 1; ++ prefs.dcctimeout = 180; ++ prefs.dccstalltimeout = 60; ++ prefs.notify_timeout = 15; ++ prefs.tint_red = ++ prefs.tint_green = ++ prefs.tint_blue = 195; ++ prefs.auto_indent = 1; ++ prefs.max_auto_indent = 256; ++ prefs.show_separator = 1; ++ prefs.dcc_blocksize = 1024; ++ prefs.throttle = 1; ++ /*FIXME*/ prefs.msg_time_limit = 30; ++ prefs.msg_number_limit = 5; ++ prefs.ctcp_time_limit = 30; ++ prefs.ctcp_number_limit = 5; ++ prefs.topicbar = 1; ++ prefs.lagometer = 1; ++ prefs.throttlemeter = 1; ++ prefs.autoopendccrecvwindow = 1; ++ prefs.autoopendccsendwindow = 1; ++ prefs.autoopendccchatwindow = 1; ++ prefs.userhost = 1; ++ prefs.gui_url_mod = 4; /* ctrl */ ++ prefs.gui_tray = 1; ++ prefs.gui_pane_left_size = 100; ++ prefs.gui_pane_right_size = 100; ++ prefs.mainwindow_save = 1; ++ prefs.bantype = 2; ++ prefs.input_balloon_time = 20; ++ prefs.input_flash_priv = prefs.input_flash_hilight = 1; ++ prefs.input_tray_priv = prefs.input_tray_hilight = 1; ++ prefs.autodccsend = 2; /* browse mode */ ++#ifdef WIN32 ++ prefs.identd = 1; ++#endif ++ strcpy (prefs.stamp_format, "[%H:%M] "); ++ strcpy (prefs.timestamp_log_format, "%b %d %H:%M:%S "); ++ strcpy (prefs.logmask, "%n-%c.log"); ++ strcpy (prefs.nick_suffix, ","); ++ strcpy (prefs.cmdchar, "/"); ++ strcpy (prefs.nick1, username); ++ strcpy (prefs.nick2, username); ++ strcat (prefs.nick2, "_"); ++ strcpy (prefs.nick3, username); ++ strcat (prefs.nick3, "__"); ++ strcpy (prefs.realname, realname); ++ strcpy (prefs.username, username); ++#ifdef WIN32 ++ strcpy (prefs.sounddir, "./sounds"); ++ { ++ char out[256]; ++ ++ if (get_reg_str ("Software\\Microsoft\\Windows\\CurrentVersion\\" ++ "Explorer\\Shell Folders", "Personal", out, sizeof (out))) ++ snprintf (prefs.dccdir, sizeof (prefs.dccdir), "%s\\Downloads", out); ++ else ++ snprintf (prefs.dccdir, sizeof (prefs.dccdir), "%s\\Downloads", get_xdir_utf8 ()); ++ } ++#else ++ snprintf (prefs.sounddir, sizeof (prefs.sounddir), "%s/sounds", get_xdir_utf8 ()); ++ snprintf (prefs.dccdir, sizeof (prefs.dccdir), "%s/downloads", get_xdir_utf8 ()); ++#endif ++ strcpy (prefs.doubleclickuser, "QUOTE WHOIS %s %s"); ++ strcpy (prefs.awayreason, _("I'm busy")); ++ strcpy (prefs.quitreason, _("Leaving")); ++ strcpy (prefs.partreason, prefs.quitreason); ++ strcpy (prefs.font_normal, DEF_FONT); ++ strcpy (prefs.dnsprogram, "host"); ++ strcpy (prefs.irc_no_hilight, "NickServ,ChanServ"); ++ ++ g_free ((char *)username); ++ g_free ((char *)realname); ++ ++ fh = open (default_file (), OFLAGS | O_RDONLY); ++ if (fh != -1) ++ { ++ fstat (fh, &st); ++ cfg = malloc (st.st_size + 1); ++ cfg[0] = '\0'; ++ i = read (fh, cfg, st.st_size); ++ if (i >= 0) ++ cfg[i] = '\0'; /* make sure cfg is NULL terminated */ ++ close (fh); ++ i = 0; ++ do ++ { ++ switch (vars[i].type) ++ { ++ case TYPE_STR: ++ cfg_get_str (cfg, vars[i].name, (char *) &prefs + vars[i].offset, ++ vars[i].len); ++ break; ++ case TYPE_BOOL: ++ case TYPE_INT: ++ val = cfg_get_int_with_result (cfg, vars[i].name, &res); ++ if (res) ++ *((int *) &prefs + vars[i].offset) = val; ++ break; ++ } ++ i++; ++ } ++ while (vars[i].name); ++ ++ free (cfg); ++ ++ } else ++ { ++#ifndef WIN32 ++#ifndef __EMX__ ++ /* OS/2 uses UID 0 all the time */ ++ if (getuid () == 0) ++ fe_message (_("* Running IRC as root is stupid! You should\n" ++ " create a User Account and use that to login.\n"), FE_MSG_WARN|FE_MSG_WAIT); ++#endif ++#endif /* !WIN32 */ ++ ++ mkdir_utf8 (prefs.dccdir); ++ mkdir_utf8 (prefs.dcc_completed_dir); ++ } ++ if (prefs.mainwindow_height < 138) ++ prefs.mainwindow_height = 138; ++ if (prefs.mainwindow_width < 106) ++ prefs.mainwindow_width = 106; ++ ++ sp = strchr (prefs.username, ' '); ++ if (sp) ++ sp[0] = 0; /* spaces in username would break the login */ ++ ++ /* try to make sense of old ulist/tree position settings */ ++ if (prefs.gui_ulist_pos == 0) ++ { ++ prefs.gui_ulist_pos = 3; /* top right */ ++ if (prefs._gui_ulist_left) ++ prefs.gui_ulist_pos = 2; /* bottom left */ ++ ++ switch (prefs._tabs_position) ++ { ++ case 0: ++ prefs.tab_pos = 6; /* bottom */ ++ break; ++ case 1: ++ prefs.tab_pos = 5; /* top */ ++ break; ++ case 2: ++ prefs.tab_pos = 1; /* left */ ++ break; ++ case 3: ++ prefs.tab_pos = 4; /* right */ ++ break; ++ case 4: ++ prefs.tab_pos = 1; /* (hidden)left */ ++ break; ++ case 5: ++ if (prefs._gui_ulist_left) ++ { ++ prefs.tab_pos = 1; /* above ulist left */ ++ prefs.gui_ulist_pos = 2; ++ } ++ else ++ { ++ prefs.tab_pos = 3; /* above ulist right */ ++ prefs.gui_ulist_pos = 4; ++ } ++ break; ++ } ++ } ++} ++ ++int ++save_config (void) ++{ ++ int fh, i; ++ char *new_config, *config; ++ ++ check_prefs_dir (); ++ ++ config = default_file (); ++ new_config = malloc (strlen (config) + 5); ++ strcpy (new_config, config); ++ strcat (new_config, ".new"); ++ ++ fh = open (new_config, OFLAGS | O_TRUNC | O_WRONLY | O_CREAT, 0600); ++ if (fh == -1) ++ { ++ free (new_config); ++ return 0; ++ } ++ ++ if (!cfg_put_str (fh, "version", PACKAGE_VERSION)) ++ { ++ free (new_config); ++ return 0; ++ } ++ ++ i = 0; ++ do ++ { ++ switch (vars[i].type) ++ { ++ case TYPE_STR: ++ if (!cfg_put_str (fh, vars[i].name, (char *) &prefs + vars[i].offset)) ++ { ++ free (new_config); ++ return 0; ++ } ++ break; ++ case TYPE_INT: ++ case TYPE_BOOL: ++ if (!cfg_put_int (fh, *((int *) &prefs + vars[i].offset), vars[i].name)) ++ { ++ free (new_config); ++ return 0; ++ } ++ } ++ i++; ++ } ++ while (vars[i].name); ++ ++ if (close (fh) == -1) ++ { ++ free (new_config); ++ return 0; ++ } ++ ++#ifdef WIN32 ++ unlink (config); /* win32 can't rename to an existing file */ ++#endif ++ if (rename (new_config, config) == -1) ++ { ++ free (new_config); ++ return 0; ++ } ++ free (new_config); ++ ++ return 1; ++} ++ ++static void ++set_showval (session *sess, const struct prefs *var, char *tbuf) ++{ ++ int len, dots, j; ++ ++ len = strlen (var->name); ++ memcpy (tbuf, var->name, len); ++ dots = 29 - len; ++ if (dots < 0) ++ dots = 0; ++ tbuf[len++] = '\003'; ++ tbuf[len++] = '2'; ++ for (j=0;jtype) ++ { ++ case TYPE_STR: ++ sprintf (tbuf + len, "\0033:\017 %s\n", ++ (char *) &prefs + var->offset); ++ break; ++ case TYPE_INT: ++ sprintf (tbuf + len, "\0033:\017 %d\n", ++ *((int *) &prefs + var->offset)); ++ break; ++ case TYPE_BOOL: ++ if (*((int *) &prefs + var->offset)) ++ sprintf (tbuf + len, "\0033:\017 %s\n", "ON"); ++ else ++ sprintf (tbuf + len, "\0033:\017 %s\n", "OFF"); ++ break; ++ } ++ PrintText (sess, tbuf); ++} ++ ++static void ++set_list (session * sess, char *tbuf) ++{ ++ int i; ++ ++ i = 0; ++ do ++ { ++ set_showval (sess, &vars[i], tbuf); ++ i++; ++ } ++ while (vars[i].name); ++} ++ ++int ++cfg_get_bool (char *var) ++{ ++ int i = 0; ++ ++ do ++ { ++ if (!strcasecmp (var, vars[i].name)) ++ { ++ return *((int *) &prefs + vars[i].offset); ++ } ++ i++; ++ } ++ while (vars[i].name); ++ ++ return -1; ++} ++ ++int ++cmd_set (struct session *sess, char *tbuf, char *word[], char *word_eol[]) ++{ ++ int wild = FALSE; ++ int or = FALSE; ++ int off = FALSE; ++ int quiet = FALSE; ++ int erase = FALSE; ++ int i = 0, finds = 0, found; ++ int idx = 2; ++ char *var, *val; ++ ++ if (strcasecmp (word[2], "-e") == 0) ++ { ++ idx++; ++ erase = TRUE; ++ } ++ ++ /* turn a bit OFF */ ++ if (strcasecmp (word[idx], "-off") == 0) ++ { ++ idx++; ++ off = TRUE; ++ } ++ ++ /* turn a bit ON */ ++ if (strcasecmp (word[idx], "-or") == 0 || strcasecmp (word[idx], "-on") == 0) ++ { ++ idx++; ++ or = TRUE; ++ } ++ ++ if (strcasecmp (word[idx], "-quiet") == 0) ++ { ++ idx++; ++ quiet = TRUE; ++ } ++ ++ var = word[idx]; ++ val = word_eol[idx+1]; ++ ++ if (!*var) ++ { ++ set_list (sess, tbuf); ++ return TRUE; ++ } ++ ++ if ((strchr (var, '*') || strchr (var, '?')) && !*val) ++ wild = TRUE; ++ ++ if (*val == '=') ++ val++; ++ ++ do ++ { ++ if (wild) ++ found = !match (var, vars[i].name); ++ else ++ found = strcasecmp (var, vars[i].name); ++ ++ if (found == 0) ++ { ++ finds++; ++ switch (vars[i].type) ++ { ++ case TYPE_STR: ++ if (erase || *val) ++ { ++ strncpy ((char *) &prefs + vars[i].offset, val, vars[i].len); ++ ((char *) &prefs)[vars[i].offset + vars[i].len - 1] = 0; ++ if (!quiet) ++ PrintTextf (sess, "%s set to: %s\n", var, (char *) &prefs + vars[i].offset); ++ } else ++ { ++ set_showval (sess, &vars[i], tbuf); ++ } ++ break; ++ case TYPE_INT: ++ case TYPE_BOOL: ++ if (*val) ++ { ++ if (vars[i].type == TYPE_BOOL) ++ { ++ if (atoi (val)) ++ *((int *) &prefs + vars[i].offset) = 1; ++ else ++ *((int *) &prefs + vars[i].offset) = 0; ++ if (!strcasecmp (val, "YES") || !strcasecmp (val, "ON")) ++ *((int *) &prefs + vars[i].offset) = 1; ++ if (!strcasecmp (val, "NO") || !strcasecmp (val, "OFF")) ++ *((int *) &prefs + vars[i].offset) = 0; ++ } else ++ { ++ if (or) ++ *((int *) &prefs + vars[i].offset) |= atoi (val); ++ else if (off) ++ *((int *) &prefs + vars[i].offset) &= ~(atoi (val)); ++ else ++ *((int *) &prefs + vars[i].offset) = atoi (val); ++ } ++ if (!quiet) ++ PrintTextf (sess, "%s set to: %d\n", var, ++ *((int *) &prefs + vars[i].offset)); ++ } else ++ { ++ set_showval (sess, &vars[i], tbuf); ++ } ++ break; ++ } ++ } ++ i++; ++ } ++ while (vars[i].name); ++ ++ if (!finds && !quiet) ++ PrintText (sess, "No such variable.\n"); ++ ++ return TRUE; ++} ++ ++int ++xchat_open_file (char *file, int flags, int mode, int xof_flags) ++{ ++ char buf[1024]; ++ ++ if (xof_flags & XOF_FULLPATH) ++ { ++ if (xof_flags & XOF_DOMODE) ++ return open (file, flags | OFLAGS, mode); ++ else ++ return open (file, flags | OFLAGS); ++ } ++ ++ snprintf (buf, sizeof (buf), "%s/%s", get_xdir_fs (), file); ++ if (xof_flags & XOF_DOMODE) ++ return open (buf, flags | OFLAGS, mode); ++ else ++ return open (buf, flags | OFLAGS); ++} ++ ++FILE * ++xchat_fopen_file (const char *file, const char *mode, int xof_flags) ++{ ++ char buf[1024]; ++ ++ if (xof_flags & XOF_FULLPATH) ++ return fopen (file, mode); ++ ++ snprintf (buf, sizeof (buf), "%s/%s", get_xdir_fs (), file); ++ return fopen (buf, mode); ++} +diff -urNp xchat-2.8.8.orig/src/common/xchat.h xchat-2.8.8/src/common/xchat.h +--- xchat-2.8.8.orig/src/common/xchat.h 2013-06-10 14:26:55.885425482 +0200 ++++ xchat-2.8.8/src/common/xchat.h 2013-06-10 14:27:23.748503597 +0200 +@@ -1,6 +1,7 @@ + #include "../../config.h" + + #include ++#include + #include /* need time_t */ + + #ifndef XCHAT_H diff --git a/SPECS/xchat.spec b/SPECS/xchat.spec new file mode 100644 index 0000000..bd78f6f --- /dev/null +++ b/SPECS/xchat.spec @@ -0,0 +1,948 @@ +%define gconf_version 2.14 + +Summary: A popular and easy to use graphical IRC (chat) client +Name: xchat +Version: 2.8.8 +Release: 25%{?dist} +Epoch: 1 +Group: Applications/Internet +License: GPLv2+ +URL: http://www.xchat.org +Source0: http://www.xchat.org/files/source/2.8/xchat-%{version}.tar.xz + +# http://sourceforge.net/p/xchat/bugs/1504/ +Source1: hicolor_apps_16x16_%{name}.png +Source2: hicolor_apps_22x22_%{name}.png +Source3: hicolor_apps_24x24_%{name}.png +Source4: hicolor_apps_32x32_%{name}.png +Source5: hicolor_apps_48x48_%{name}.png +Source6: hicolor_apps_256x256_%{name}.png +Source7: %{name}.svg + +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) + +# Patches 0-9 reserved for official xchat.org patches + +Patch12: xchat-1.8.7-use-sysconf-to-detect-cpus.patch +# see #241923 & #880672 +Patch35: xchat-2.8.8-notifications-and-tray.patch +# Upstream XChat 2.8.6 defaults to Latin1 (what upstream calls the "IRC" +# encoding). Default to UTF-8 instead (as previous versions did, at least when +# running under a UTF-8 locale). +# Both the "IRC" and "UTF-8" settings will try to accept both Latin1 and UTF-8 +# when it comes in, however "IRC" sends Latin1, "UTF-8" sends UTF-8. +Patch41: xchat-2.8.6-default-utf8.patch +# patch to add ability to change to tab with most recent activity +# See http://sourceforge.net/tracker/?func=detail&aid=2022871&group_id=239&atid=350239 +Patch50: xchat-2.8.6-change-page-activity.patch +# add port numbers for Freenode (Debarshi Ray) +Patch51: xchat-2.8.6-freenode-ports.patch +# work with libnotify 0.7 +# https://sourceforge.net/tracker/?func=detail&aid=3109838&group_id=239&atid=100239 +Patch52: xchat-2.8.8-libnotify07.patch +# link against libnotify +# https://sourceforge.net/tracker/?func=detail&aid=3280223&group_id=239&atid=100239 +Patch53: xchat-2.8.8-link-against-libnotify.patch +# Only glib.h can be included and g_thread_init should no longer be used +Patch54: xchat-2.8.8-glib.patch +# http://sourceforge.net/p/xchat/bugs/1504/ +Patch55: xchat-2.8.8-hires-icons.patch +# http://sourceforge.net/p/xchat/bugs/1506/ +Patch56: xchat-2.8.8-xdg-dirs.patch +# http://sourceforge.net/p/xchat/bugs/1397/ +Patch57: xchat-2.8.8-desktop-file-name.patch +# https://bugzilla.redhat.com/show_bug.cgi?id=1091544 +Patch58: 0001-Don-t-force-the-use-of-SSLv3.patch +# https://bugzilla.redhat.com/show_bug.cgi?id=1544840 +Patch59: xchat-2.8.8-restore-status-icon.patch + +BuildRequires: perl perl(ExtUtils::Embed) python-devel openssl-devel pkgconfig, tcl-devel +BuildRequires: GConf2-devel +BuildRequires: dbus-devel >= 0.60, dbus-glib-devel >= 0.60 +BuildRequires: glib2-devel >= 2.10.0, gtk2-devel >= 2.10.0, bison >= 1.35 +BuildRequires: gettext-devel /bin/sed +BuildRequires: libtool +BuildRequires: libntlm-devel +BuildRequires: libsexy-devel +BuildRequires: desktop-file-utils >= 0.10 +BuildRequires: libnotify-devel +# For xchat-2.8.8-link-against-libnotify.patch +BuildRequires: autoconf +BuildRequires: automake + +# For gconftool-2: +Requires(post): GConf2 >= %{gconf_version} +Requires(preun): GConf2 >= %{gconf_version} + +# For aplay: +Requires: alsa-utils + +# Ensure that a compatible libperl is installed +Requires: perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version)) + +Provides: xchat-perl = %{epoch}:%{version}-%{release} +Obsoletes: xchat-perl < %{epoch}:%{version}-%{release} +Provides: xchat-python = %{epoch}:%{version}-%{release} +Obsoletes: xchat-python < %{epoch}:%{version}-%{release} + +%description +X-Chat is an easy to use graphical IRC chat client for the X Window System. +It allows you to join multiple IRC channels (chat rooms) at the same time, +talk publicly, private one-on-one conversations etc. Even file transfers +are possible. + +This includes the plugins to run the Perl and Python scripts. + +%package tcl +Summary: Tcl script plugin for X-Chat +Group: Applications/Internet +Requires: %{name} = %{epoch}:%{version}-%{release} +%description tcl +This package contains the X-Chat plugin providing the Tcl scripting interface. + +%prep +%setup -q +# Various small fixes from CVS that are considered safe to apply to 2.8.6. +# (currently none) + +%patch12 -p0 -b .use-sysconf-to-detect-cpus +%patch35 -p1 -b .tray-icon +%patch41 -p1 -b .default-utf8 +%patch50 -p1 -b .active-channel-switch +%patch51 -p1 -b .freenode-ports +%patch52 -p1 -b .libnotify07 +%patch53 -p1 -b .link-against-libnotify +%patch54 -p0 -b .glib +%patch55 -p1 -b .hires-icons +%patch56 -p1 -b .xdg-dirs +%patch57 -p1 -b .desktop-file-name +%patch58 -p1 -b .allow-tls +%patch59 -p1 -b .restore-status-icon + +sed -i -e 's/#define GTK_DISABLE_DEPRECATED//g' src/fe-gtk/*.c + +cp -p %{SOURCE1} icons/ +cp -p %{SOURCE2} icons/ +cp -p %{SOURCE3} icons/ +cp -p %{SOURCE4} icons/ +cp -p %{SOURCE5} icons/ +cp -p %{SOURCE6} icons/ +cp -p %{SOURCE7} icons/ + +%build +# Remove CVS files from source dirs so they're not installed into doc dirs. +find . -name CVS -type d | xargs rm -rf + +export CFLAGS="$RPM_OPT_FLAGS $(perl -MExtUtils::Embed -e ccopts)" +export LDFLAGS=$(perl -MExtUtils::Embed -e ldopts) + +# For xchat-2.8.8-link-against-libnotify.patch +./autogen.sh + +%configure --disable-textfe \ + --enable-gtkfe \ + --enable-openssl \ + --enable-python \ + --enable-tcl=%{_libdir} \ + --enable-ipv6 \ + --enable-spell=libsexy \ + --enable-shm \ + --enable-ntlm + +# gtkspell breaks Input Method commit with ENTER + +make %{?_smp_mflags} + + +%install +%{__rm} -rf $RPM_BUILD_ROOT +%{__make} install DESTDIR=$RPM_BUILD_ROOT GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL=1 + +# Get rid of libtool archives +%{__rm} -f $RPM_BUILD_ROOT%{_libdir}/xchat/plugins/*.la + +# Install the .desktop file properly +%{__rm} -f $RPM_BUILD_ROOT%{_datadir}/applications/xchat.desktop +desktop-file-install --vendor="" \ + --dir $RPM_BUILD_ROOT%{_datadir}/applications \ + --remove-key=Encoding \ + --add-category=IRCClient \ + --add-category=GTK xchat.desktop + +%find_lang %{name} + +# do not Provide plugins .so +%define _use_internal_dependency_generator 0 +%{__cat} << \EOF > %{name}.prov +#!%{_buildshell} +%{__grep} -v %{_docdir} - | %{__find_provides} $* \ + | %{__sed} '/\.so\(()(64bit)\)\?$/d' +EOF +%define __find_provides %{_builddir}/%{name}-%{version}/%{name}.prov +%{__chmod} +x %{__find_provides} + + +%post +# Install schema +export GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source` +gconftool-2 --makefile-install-rule /etc/gconf/schemas/apps_xchat_url_handler.schemas >& /dev/null || : + +%postun +if [ $1 -eq 0 ] ; then + /bin/touch --no-create %{_datadir}/icons/hicolor &>/dev/null + /usr/bin/gtk-update-icon-cache -f %{_datadir}/icons/hicolor &>/dev/null || : +fi + +%posttrans +/usr/bin/gtk-update-icon-cache -f %{_datadir}/icons/hicolor &>/dev/null || : + +%clean +%{__rm} -rf $RPM_BUILD_ROOT + +%files -f %{name}.lang +%defattr(-,root,root) +%doc README ChangeLog +%doc plugins/plugin20.html plugins/perl/xchat2-perl.html +%{_bindir}/xchat +%dir %{_libdir}/xchat +%dir %{_libdir}/xchat/plugins +%{_libdir}/xchat/plugins/perl.so +%{_libdir}/xchat/plugins/python.so +%{_datadir}/applications/xchat.desktop +%{_datadir}/icons/hicolor/*/apps/xchat.png +%{_datadir}/pixmaps/* +%{_sysconfdir}/gconf/schemas/apps_xchat_url_handler.schemas +%{_datadir}/dbus-1/services/org.xchat.service.service + +%files tcl +%defattr(-,root,root) +%{_libdir}/xchat/plugins/tcl.so + +%changelog +* Fri Aug 16 2019 Debarshi Ray - 1:2.8.8-25 +- Fix a typo in the patch to restore the status icon after resuming +Resolves: #1544840 + +* Wed Mar 20 2019 Debarshi Ray - 1:2.8.8-24 +- Restore the status icon after resuming from suspend +Resolves: #1544840 + +* Mon May 18 2015 Debarshi Ray - 1:2.8.8-23 +- Do not force SSLv3, also allow TLSv1_X +Resolves: #1198317 + +* Fri Jan 24 2014 Daniel Mach - 1:2.8.8-22 +- Mass rebuild 2014-01-24 + +* Fri Dec 27 2013 Daniel Mach - 1:2.8.8-21 +- Mass rebuild 2013-12-27 + +* Wed Oct 9 2013 Matthias Clasen - 1:2.8.8-20 +- Escape %% in changelog +- Remove unneeded patch fuzz +- Drop Encoding key from desktop file + +* Mon Jun 10 2013 Debarshi Ray - 1:2.8.8-19 +- Use XDG_CONFIG_HOME instead of home for config files + (http://sourceforge.net/p/xchat/bugs/1506/) +- Use name and generic name correctly in desktop file + (http://sourceforge.net/p/xchat/bugs/1397/) + +* Fri Jun 07 2013 Debarshi Ray - 1:2.8.8-18 +- Add hi-res icons (http://sourceforge.net/p/xchat/bugs/1504/) + +* Fri Feb 15 2013 Fedora Release Engineering - 1:2.8.8-17 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + +* Tue Nov 27 2012 Debarshi Ray - 1:2.8.8-16 +- Make sure default settings work with gnome-shell (#880672) + +* Sun Jul 22 2012 Fedora Release Engineering - 1:2.8.8-15 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Mon Jun 11 2012 Petr Pisar - 1:2.8.8-14 +- Perl 5.16 rebuild + +* Sat Feb 25 2012 Bruno Wolff III - 1:2.8.8-13 +- Adjust to glib changes so that xchat will build again + +* Sat Jan 14 2012 Fedora Release Engineering - 1:2.8.8-12 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild + +* Tue Dec 06 2011 Adam Jackson - 1:2.8.8-11 +- Rebuild for new libpng + +* Fri Jun 17 2011 Marcela Mašláňová - 1:2.8.8-10 +- Perl mass rebuild + +* Thu Apr 07 2011 Christopher Aillon - 1:2.8.8-9 +- Link against libnotify (#693362) + +* Thu Apr 07 2011 Christopher Aillon - 1:2.8.8-8 +- Update the dynamic libnotify check for the newer soname (#693362) + +* Mon Feb 07 2011 Fedora Release Engineering - 1:2.8.8-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Fri Dec 10 2010 Kevin Kofler - 1:2.8.8-6 +- Requires: alsa-utils for aplay (#661957) + +* Mon Nov 15 2010 Owen Taylor - 1:2.8.8-5 +- Add patch to work with libnotify-0.7 + +* Tue Jul 27 2010 Mamoru Tasaka - 1:2.8.8-4 +- Rebuild against python 2.7 + +* Thu Jun 03 2010 Kevin Kofler - 1:2.8.8-3 +- Rebuild again for perl-5.12.0 + +* Thu Jun 03 2010 Kevin Kofler - 1:2.8.8-2 +- --enable-ntlm (no longer enabled by default) + +* Thu Jun 03 2010 Kevin Kofler - 1:2.8.8-1 +- Update to 2.8.8 (#597735) +- Use xz tarball (new in 2.8.8) +- Drop smallfixes, redhat-desktop (remaining part), shm-pixmaps and + connect-mnemonic patches (all fixed upstream) + +* Wed Jun 02 2010 Marcela Maslanova - 1:2.8.6-18 +- Mass rebuild with perl-5.12.0 + +* Wed Apr 21 2010 Kevin Kofler - 1:2.8.6-17 +- Add port numbers for Freenode (Debarshi Ray) + +* Fri Apr 09 2010 Rudolf Kastl - 1:2.8.6-16 +- Added IRCClient .desktop file subcategory (#485306) +- Added GTK .desktop file subcategory +- Added curly brackets to the name macro for consistency. + +* Wed Dec 16 2009 Kevin Fenzi - 1:2.8.6-15 +- Add patch to allow switching to next channel with activity. + +* Mon Dec 7 2009 Stepan Kasal - 1:2.8.6-14 +- rebuild against perl 5.10.1 + +* Thu Sep 10 2009 Christopher Aillon - 1:2.8.6-13 +- Drop the antiquated OPN reference + +* Fri Aug 21 2009 Tomas Mraz - 1:2.8.6-12 +- rebuilt with new openssl + +* Mon Jul 27 2009 Fedora Release Engineering - 1:2.8.6-11 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild + +* Sat Jul 18 2009 Kevin Kofler - 1:2.8.6-10 +- Fixed patch for the "C_onnect" issue (#512034, Edward Sheldrake) + +* Thu Jul 16 2009 Kevin Kofler - 1:2.8.6-9 +- Fix literal underscore in "C_onnect" button (#512034, Matthias Clasen) + +* Mon Jun 29 2009 Kevin Kofler - 1:2.8.6-8 +- Change Name in xchat.desktop to XChat IRC (#293841) + +* Thu Feb 26 2009 Fedora Release Engineering - 1:2.8.6-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild + +* Tue Feb 10 2009 Kevin Kofler - 1:2.8.6-6 +- fix filtering of Provides on lib64 architectures + +* Fri Jan 16 2009 Kevin Kofler - 1:2.8.6-5 +- rebuild for new OpenSSL + +* Sun Nov 30 2008 Ignacio Vazquez-Abrams - 1:2.8.6-4 +- Rebuild for Python 2.6 + +* Mon Aug 11 2008 Kevin Kofler - 1:2.8.6-3 +- rebuild for fixed redhat-rpm-config (#450271) + +* Mon Jul 14 2008 Kevin Kofler - 1:2.8.6-2 +- apply xc286-smallfixes.diff from upstream +- don't #define GTK_DISABLE_DEPRECATED (fixes build against current GTK+) + +* Sun Jun 15 2008 Kevin Kofler - 1:2.8.6-1 +- update to 2.8.6 +- drop upstream patches (already applied in 2.8.6) +- set default charset to UTF-8 (2.8.6 changed it to Latin1) + +* Thu May 22 2008 Kevin Kofler - 1:2.8.4-16 +- fix more bugs in xchat-2.8.4-shm-pixmaps.patch (#282691) + +* Tue Apr 1 2008 Kevin Kofler - 1:2.8.4-15 +- remove --disable-panel which has been ignored since 2.0.0 +- add missing BR libntlm-devel (thanks to Karsten Hopp) + +* Mon Mar 3 2008 Tom "spot" Callaway - 1:2.8.4-14 +- rebuild for new perl + +* Mon Feb 18 2008 Christopher Aillon - 1:2.8.4-13 +- Rebuild to celebrate my birthday (and GCC 4.3) + +* Tue Feb 5 2008 Tom "spot" Callaway - 1:2.8.4-12 +- rebuild for new perl + +* Sat Jan 19 2008 Kevin Kofler - 1:2.8.4-11 +- fix bug in xchat-2.8.4-shm-pixmaps.patch (Adam Jackson, #429218) + +* Thu Jan 3 2008 Christopher Aillon 1:2.8.4-10 +- Rebuild + +* Thu Dec 20 2007 Adam Jackson 1:2.8.4-9 +- xchat-2.8.4-shm-pixmaps.patch: MIT-SHM pixmaps are optional, and when + using EXA they are not available. Check that the server supports them + before trying to create them so we don't crash. + +* Wed Dec 19 2007 Kevin Kofler - 1:2.8.4-8 +- apply xc284-fix-scrollbfdleak.diff from upstream + +* Wed Dec 5 2007 Christopher Aillon - 1:2.8.4-7 +- Fix the icon key in the .desktop file to validate + +* Sat Oct 13 2007 Kevin Kofler - 1:2.8.4-6 +- drop obsolete xchat-2.4.4-unrealize.patch (fixed upstream for a while) +- drop broken xchat-2.4.3-im_context_filter_keypress.patch (#295331) + +* Wed Sep 26 2007 Kevin Kofler - 1:2.8.4-5 +- apply xc284-improvescrollback.diff from upstream + +* Thu Aug 23 2007 Remi Collet - 1:2.8.4-4.fc8.1 +- F-8 rebuild (BuildID) + +* Sat Aug 11 2007 Kevin Kofler - 1:2.8.4-4 +- add missing BR perl(ExtUtils::Embed) + +* Fri Aug 3 2007 Kevin Kofler - 1:2.8.4-3 +- specify GPL version in License tag + +* Tue Jul 10 2007 Kevin Kofler - 1:2.8.4-2 +- apply xc284-scrollbmkdir.diff from upstream + +* Wed Jul 4 2007 Kevin Kofler - 1:2.8.4-1 +- update to 2.8.4 +- drop xc282-fixtrayzombies.diff (already in 2.8.4) +- rebase redhat-desktop and tray-icon patches + +* Fri Jun 22 2007 Kevin Kofler - 1:2.8.2-12 +- install the .desktop file with --vendor="" to keep the old name + +* Thu Jun 21 2007 Kevin Kofler - 1:2.8.2-11 +- add missing BR desktop-file-utils + +* Thu Jun 21 2007 Kevin Kofler - 1:2.8.2-10 +- remove Application; and X-Red-Hat-Extras; categories from .desktop file + (merge review #226551) +- install the .desktop file properly (merge review #226551) + +* Tue Jun 12 2007 Kevin Kofler - 1:2.8.2-9 +- build against system libsexy instead of static sexy-spell-entry now that this + is possible (Core-Extras merge) + +* Sat Jun 2 2007 Kevin Kofler - 1:2.8.2-8 +- disable tray icon by default (#241923) + +* Thu May 31 2007 Kevin Kofler - 1:2.8.2-7 +- revert to redhat-desktop patch pending further discussion + +* Thu May 31 2007 Kevin Kofler - 1:2.8.2-6 +- apply xc282-fixtrayzombies.diff from upstream + +* Wed May 30 2007 Kevin Kofler - 1:2.8.2-5 +- remove Requires: gtkspell as gtkspell is not currently being used + +* Mon May 28 2007 Kevin Kofler - 1:2.8.2-4 +- set explicit libdir for Tcl so it's found on lib64 arches (Remi Collet) +- move Tcl plugin into subpackage + (not an incompatible change as this was not built in f7-final at all) + +* Mon May 28 2007 Kevin Kofler - 1:2.8.2-3 +- use versioned Provides/Obsoletes to allow future package split + +* Mon May 28 2007 Kevin Kofler - 1:2.8.2-2 +- merge updates by Remi Collet and Marius Feraru (#224180) +- mention Tcl in description +- add release and user name to buildroot +- follow desktop-entry-spec on Name and GenericName as required by the Packaging + Guidelines +- drop BR gtkspell-devel as it's not currently used + +* Thu Apr 5 2007 Remi Collet - 1:2.8.2-1.fc6.remi +- update to 2.8.2 + +* Sat Mar 24 2007 Matthias Clasen - 1:2.6.6-9 +- Own /usr/lib/xchat (#166731) + +* Thu Jan 25 2007 Marius Feraru - 1:2.8.0-1.n0i.1 +- version 2.8.0 +- disabled some patches: nonblock, locale (fi, es) +- enabled fast tinting +- fixed "exchant" typo +- switched to using the "make install" (DESTDIR works) +- simplified gconf schema disabling method +- dropped plugins mover +- updated "Get rid of static libs" +- dropped xchat-remote +- updated build requirements +- dropped "default-webbrowser" patches (xchat tries to do it better now) +- do not provide "perl.so", "python.so", etc +- own everything under %%{_libdir}/xchat +- converted spec file to UTF8 +- fixed desktop entry category (dropping "Application") +- keep plugins documentation + +* Tue Jan 16 2007 Remi Collet - 1:2.8.0-2.fc6.remi +- add Provides/Osboletes for extensions (split RPM available on xchat.org). +- longer description +- enable tcl extension +- Requires gtk >= 2.10.0 + +* Mon Jan 15 2007 Remi Collet - 1:2.8.0-1.fc6.remi +- update to 2.8.0 +- add upstream patches (xc280-fix-back.diff, xc280-fix-ja.diff) + +* Fri Nov 3 2006 Matthias Clasen - 1:2.6.6-8 +- Silence %%pre (#213838) + +* Wed Oct 18 2006 Matthias Clasen - 1:2.6.6-7 +- Fix scripts according to packaging guidelines + +* Tue Oct 17 2006 Matthias Clasen - 1:2.6.6-6 +- Tighten up Requires (#203813) + +* Sat Oct 7 2006 David Woodhouse - 1:2.6.6-5 +- Fix nonblocking SSL socket behaviour + +* Mon Aug 28 2006 Warren Togami - 1:2.6.6-4 +- add upstream 2.6.6 es patch + +* Wed Aug 23 2006 Warren Togami - 1:2.6.6-3 +- enable optional spell checking if you install enchant + because gtkspell is currently unusable (#201116) + +* Thu Aug 17 2006 Warren Togami - 1:2.6.6-2 +- disable gtkspell because it breaks Input Method commit +- apply upstream fi patch + +* Wed Aug 2 2006 Marc Deslauriers - 1:2.6.6-1 +- Update to 2.6.6 +- Removed upstreamed dbus patch +- Enabled gtkspell support + +* Wed Jul 19 2006 Matthias Clasen - 1:2.6.0-6 +- Rebuild against dbus + +* Mon May 22 2006 Jesse Keating - 1:2.6.0-5 +- Adding missing buildreq (bz:191577, thanks Paul F.) + +* Sun Feb 12 2006 Christopher Aillon - 1:2.6.0-4 +- Rebuild + +* Tue Feb 07 2006 Jesse Keating - 1:2.6.0-3.2 +- rebuilt for new gcc4.1 snapshot and glibc changes + +* Fri Dec 09 2005 Jesse Keating - 1:2.6.0-3.1 +- rebuilt + +* Thu Dec 01 2005 John (J5) Palmieri - 1:2.6.0-3 +- rebuild for new dbus + +* Tue Nov 15 2005 Florian La Roche 1:2.6.0-2 +- Require(post): GConf2 + +* Thu Nov 10 2005 Christopher Aillon 1:2.6.0-1 +- Update to 2.6.0 + +* Wed Nov 9 2005 Christopher Aillon 1:2.4.5-2 +- Rebuild against newer openssl + +* Mon Sep 19 2005 Christopher Aillon 1:2.4.5-1 +- X-Chat 2.4.5 + +* Wed Aug 17 2005 Matthias Clasen 1:2.4.4-3 +- Fix a bug that could lead to occasional crashes + +* Mon Aug 15 2005 Christopher Aillon 1:2.4.4-2 +- Rebuild + +* Sun Jun 26 2005 Christopher Aillon 1:2.4.4-1 +- Update to xchat-2.4.4 + +* Sun May 15 2005 Warren Togami 1:2.4.3-3 +- Prevent interception of down arrow during Input Method (#144588 tagoh) + +* Thu Apr 14 2005 Warren Togami 1:2.4.3-2 +- fix plugins on lib64 (#113188 Ville Skytta) + +* Sun Apr 03 2005 Warren Togami 1:2.4.3-1 +- 2.4.3, use perl MODULE_COMPAT + +* Mon Mar 28 2005 Christopher Aillon 1:2.4.2-3 +- Fix crash when right clicking users whose away msg is unknown. + +* Fri Mar 25 2005 Christopher Aillon 1:2.4.2-2 +- Add user's away message to right click menu, if known + +* Thu Mar 17 2005 Christopher Aillon 1:2.4.2-1 +- Update to 2.4.2 + +* Sat Mar 5 2005 Christopher Aillon 1:2.4.1-4 +- Rebuild against GCC 4.0 + +* Tue Jan 18 2005 Chip Turner 1:2.4.1-3 +- rebuild for new perl + +* Tue Jan 4 2005 Christopher Aillon 1:2.4.1-2 +- Add Dan Reed's CTCP patch to support multiline messages (#136545) + +* Tue Nov 23 2004 Christopher Aillon 1:2.4.1-1 +- Update to 2.4.1 + +* Mon Sep 20 2004 Daniel Reed 1:2.4.0-3 +- #132967 Remove GenericName + +* Tue Aug 17 2004 Daniel Reed 1:2.4.0-2 +- #125846 Change xchat.desktop names to "IRC" + +* Sun Aug 15 2004 Christopher Aillon 1:2.4.0-1 +- Update to 2.4.0 +- Fix simplify-to-use-gnome-open and simplify-to-use-htmlview patches + to not conflict every time upstream modifies the urlhandler list. +- Remove focus and tab completion patches (no longer needed) + +* Mon Jul 26 2004 Christopher Aillon 1:2.0.10-3 +- Update upstream patch to fix tab completion crash +- Add upstream patch to fix focus crash on some window managers. + +* Fri Jul 9 2004 Mike A. Harris 1:2.0.10-2 +- Added upstream xc2010-fixtabcomp.diff patch to fix SEGV in tab completion + +* Sat Jul 03 2004 Christopher Aillon 1:2.0.10-1 +- Update to 2.0.10 + +* Wed Jun 23 2004 Christopher Aillon 1:2.0.9-1 +- Update to 2.0.9 +- Fixed the URL handler menu patches to apply. + +* Tue Jun 15 2004 Elliot Lee +- rebuilt + +* Tue Mar 9 2004 Mike A. Harris 1:2.0.7-5 +- Bump and rebuild for Fedora devel, to sync up with new perl +- Remove require_autoconf conditional, and conditionalized autoconf BuildRequires + +* Fri Mar 5 2004 Mike A. Harris 1:2.0.7-4 +- Added xchat-2.0.7-simplify-to-use-gnome-open-for-default-webbrowser.patch + and xchat-2.0.7-simplify-to-use-htmlview-for-default-webbrowser.patch to + simplify the default URL handler menu to point only to the default system + web browser by using gnome-open on Fedora Core 2 and later, or htmlview + on earlier OS releases. This is added to improve user friendliness (#82331) + +* Tue Mar 02 2004 Elliot Lee +- rebuilt + +* Tue Feb 17 2004 Mike A. Harris 1:2.0.7-1.FC1.0 +- Rebuild xchat 2.0.7-3 as 2.0.7-1.FC1.0 for release as an enhancement erratum + for Fedora Core 1. Also fixes AMD64 64bit issues reported in bug (#114237) + +* Fri Feb 13 2004 Elliot Lee 1:2.0.7-3 +- rebuilt + +* Mon Jan 26 2004 Jeremy Katz 1:2.0.7-2 +- rebuild for new perl version + +* Sat Jan 10 2004 Mike A. Harris 1:2.0.7-1 +- Updated to xchat 2.0.7 +- Removed already integrated patches, including: xc204-fixperlui.diff, + xchat-2.0.4-screen-position-fix.patch, xchat-2.0.4-exec-shield-GNU-stack.patch +- Added a new rpm macro require_autoconf, which is disabled (0) by default, as + it seems no longer necessary to run autoconf prior to ./configure, so we no + longer need to BuildRequire autoconf 2.54 either. + +* Fri Oct 24 2003 Mike A. Harris 2.0.4-4 +- Added xchat-2.0.4-exec-shield-GNU-stack.patch from Arjan, to allow xchat to + be be protected by exec shield if the system has exec-shield enabled. + +* Fri Sep 19 2003 Mike A. Harris 2.0.4-3.EL +- Rebuilt 2.0.4-3 for Taroon as 2.0.4-3.EL + +* Fri Sep 19 2003 Mike A. Harris 2.0.4-3 +- Added xchat-2.0.4-screen-position-fix.patch to fix problem where xchat + doesn't remember it's screen location between invocations (#103896) + +* Sat Aug 30 2003 Mike A. Harris 2.0.4-2 +- Updated xchat-2.0.4-redhat-desktop-file.patch + +* Thu Aug 28 2003 Mike A. Harris 2.0.4-1 +- Updated to xchat 2.0.4 +- Removed unneeded patches xc203-fixtint.diff, xc203-fix-cps.diff +- Added upstream patch xc204-fixperlui.diff +- Updated autoconf dependancy to version 2.54 and greater as xchat wont + compile otherwise. Meaning Red Hat Linux 9 or higher is needed. + +* Tue Jul 22 2003 Nalin Dahyabhai 2.0.3-4 +- rebuild + +* Mon Jul 14 2003 Chip Turner +- rebuild for new perl 5.8.1 + +* Thu Jul 10 2003 Mike A. Harris 2.0.3-2 +- Added xc203-fix-cps.diff patch from upstream to fix cps calculation +- TCL plugin was getting built even though we don't want it, so now we pass + --enable-tcl or --disable-tcl explicitly, depending on with_tclplugin macro + +* Mon Jun 30 2003 Mike A. Harris 2.0.3-1.EL +- Rebuilt 2.0.3-1 as 2.0.3-1.EL for Red Hat Enterprise Linux development + +* Mon Jun 30 2003 Mike A. Harris 2.0.3-1 +- Updated to xchat 2.0.3 +- Dropped old patches: xc202-fixdetach.diff, xc202-fixurlg.diff, + xchat-2.0.2-lib64-cleanup-for-python.patch +- Added upstream patch: xc203-fixtint.diff + +* Wed Jun 04 2003 Elliot Lee +- rebuilt + +* Thu May 29 2003 Mike A. Harris 2.0.2-7 +- Added back BuildRequires autoconf, and call autoconf prior to ./configure + as it seems to make xchat build successfully. Have not bothered to figure + out why calling autoconf is needed. Something for a rainy day. + +* Thu May 29 2003 Mike A. Harris 2.0.2-6 +- Removed gnome-libs BuildRequires as it is bogus now +- Removed autoconf BuildRequires and usage, as it should be unneeded +- Added new BuildRequires on gettext, bison >= 1.35, glib2-devel >= 2.0.3, + gtk2-devel >= 2.0.3, /bin/sed (#91676 - Warren Togami) +- Removed dead patches: xchat-1.8.9-perlcrypt.patch, xchat-1.8.9-korean-fontset.patch + +* Wed May 21 2003 Mike A. Harris 2.0.2-5 +- Removed xchat.desktop file, as it was earlier replacedwith a patch +- Converted xchat-2.0.2-redhat-desktop-file.patch to be UTF-8 clean now, + instead of the various random legacy mix of encodings it was, updating + the following: es, ko, uk, zh_TW + +* Tue May 20 2003 Mike A. Harris 2.0.2-4 +- Replace explicit perl package name-epoch-version Requires added in 2.0.2-3 + with a more robust and generic solution of querying perl for the archlibexp + dir during building, and requiring it instead + +* Tue May 20 2003 Bill Nottingham 2.0.2-3 +- rebuild against new (old?) perl, add epoch to dependency + +* Sat May 17 2003 Mike A. Harris 2.0.2-1 +- Updated to new xchat 2.0.2 based on GTK2 +- Dropped unneeded patches xchat-1.8.1-konqueror.patch, + xchat-1.8.4-fix-USE_GNOME.patch +- Updated xchat-2.0.2-freenode.patch to refer to Openprojects.net +- Removed doc/xchat.sgml doc/*.html scripts-python scripts-perl from %%doc +- Added xchat-2.0.2-redhat-desktop-file.patch to patch the supplied xchat + desktop file, instead of replacing it and trying to stay in sync +- Added xchat-2.0.2-lib64-cleanup-for-python.patch which fixes build problems + on lib64 archs, and replaces xchat-multilib.patch +- Added with_tclplugin macro and default it to disabled + +* Mon Mar 17 2003 Mike A. Harris 1.8.11-8 +- Added xchat-1.8.11-nickall.patch which was written by Fabio Olive Leite, + sent to me by Rik van Riel + +* Wed Feb 19 2003 Bill Nottingham 1.8.11-7 +- ship single desktop in %%{_datadir}/applications, not /etc/X11/applnk + +* Fri Jan 31 2003 Mike A. Harris 1.8.11-6 +- Added xchat-1.8.11-freenode.patch to rename all openprojects.net entries + to freenode.net in the default server list. Patch courtesy of Dan Burcaw + from bug (#81704) + +* Wed Jan 22 2003 Mike A. Harris 1.8.11-5 +- Removed double .desktop file (#81874,82315) + +* Wed Jan 22 2003 Tim Powers 1.8.11-4 +- rebuilt + +* Tue Jan 7 2003 Mike A. Harris 1.8.11-3 +- Add bugfix from xchat.org xc1811fixststint.diff + +* Tue Jan 7 2003 Mike A. Harris 1.8.11-2 +- Remove CVS files from source dirs so they're not installed into doc dirs. + +* Tue Jan 7 2003 Mike A. Harris 1.8.11-1 +- Update to xchat 1.8.11 bugfix release, fixes various runtime crashes +- Remove now included patches: xchat-1.8.10-urlhandler-open-in-new-tab.patch, + xchat-1.8.10-beep-beep-beep.patch + +* Tue Jan 7 2003 Nalin Dahyabhai 1.8.10-13 +- Pick up OpenSSL configuration from pkgconfig, if available +- Add openssl-devel and pkgconfig as buildreqs + +* Wed Dec 11 2002 Elliot Lee 1.8.10-12 +- Fix broken libpython path on multilibbed systems (patch13) +- _smp_mflags + +* Tue Nov 26 2002 Mike A. Harris 1.8.10-11 +- Added xchat-1.8.10-urlhandler-open-in-new-tab.patch to offer the option of + opening a URL in a new tab of an existing browser window rather than a new + window + +* Sat Nov 23 2002 Mike A. Harris 1.8.10-10 +- Added BuildRequires: python-devel to hopefully pick up a missing dep + causing package build failure in timp's nightly builds. +- Removed dead patches +- Updated package summary and description to be more user friendly by + rewording, and removing scary words like GNOME, GTK and other irrelevance + +* Wed Nov 13 2002 Mike A. Harris 1.8.10-9 +- Made sure {_sysconfdir}/X11/applnk/Internet/xchat.desktop gets packaged +- Removed some conditional weirdness in %%files list. This may break xchat + erratum releases on Red Hat Linux 7.x. May need to be fixed in future. + +* Fri Aug 23 2002 Mike A. Harris 1.8.10-7 +- Added Requires line so that xchat requires the exact version of perl + be installed, that was used to compile it, since the embedded perl + interpreter will break, if you upgrade perl + +* Thu Aug 15 2002 Mike A. Harris 1.8.10-6 +- Fix Bill's beep beep beep bug (#71651) + +* Wed Aug 14 2002 Jonathan Blandford 1.8.10-5 +- actually install the desktop file. + +* Fri Aug 9 2002 Mike A. Harris 1.8.10-3 +- Added http://xchat.org/files/source/1.8/patches/xc1810fixme.diff to fix + bug with using /ME in a /QUERY window. (#71179) + +* Wed Aug 7 2002 Mike A. Harris 1.8.10-2 +- Updated to xchat 1.8.10 to fix a few bugs where a remote ircd could cause + the xchat client to crash. This is a bugfix only release. + +* Tue Aug 6 2002 Mike A. Harris 1.8.9-10 +- Added Korean fontset support to fix bug (#69771) + +* Mon Aug 5 2002 Mike A. Harris 1.8.9-9 +- Enabled python scripting which was somehow disabled somewhere along the + line by default in upstream sources, and we missed catching it. (#70816) + +* Sun Aug 4 2002 Mike A. Harris 1.8.9-8 +- Created new-style net-xchat.desktop file (#69541) + +* Fri Jun 21 2002 Tim Powers 1.8.9-7 +- automated rebuild + +* Tue Jun 18 2002 Mike A. Harris 1.8.9-6 +- updated the package description +- Added CFLAGS and LDFLAGS export vars before configure to fix rpath problem + +* Sun May 26 2002 Tim Powers +- automated rebuild + +* Mon May 20 2002 Mike A. Harris 1.8.9-2 +- Updated to xchat 1.8.9 + +* Mon Apr 8 2002 Mike A. Harris 1.8.8-5 +- Re-enabled GNOME support due to user complaints of pixmaps missing, key + bindings, and other fairly important features no longer working. + +* Tue Mar 27 2002 Mike A. Harris 1.8.8-4 +- Disabled GNOME support since it doesn't seem too useful anyways, and forces + all xchat users to install GNOME libs even if they use KDE. (#59626) +- Updated URL and source lines in spec. + +* Wed Mar 6 2002 Mike A. Harris 1.8.8-1 +- Updated to xchat 1.8.8 + +* Tue Feb 26 2002 Mike A. Harris 1.8.7-6 +- Built in new buildroot + +* Tue Feb 5 2002 Mike A. Harris 1.8.7-5 +- Added xchat-1.8.7-use-sysconf-to-detect-cpus.patch to use glibc's sysconf() + to detect the number of processors available. + +* Mon Feb 4 2002 Mike A. Harris 1.8.7-4 +- Enabled IPv6 support as per the request for enhancement (#52124) + +* Thu Jan 24 2002 Mike A. Harris 1.8.7-3 +- Rebuilt in new build environment + +* Thu Jan 10 2002 Mike A. Harris 1.8.7-2 +- Updated to xchat 1.8.7 +- New release fixes security vulnerability in CTCP reply +- Built erratum for all supported releases (1.8.7-1.62.0, 1.8.7-1.70.0, + 1.8.7-1.71.0, 1.8.7-1.72.0) +- Removed konqueror patch as it is integrated now. + +* Sat Jan 5 2002 Mike A. Harris 1.8.6-2 +- Enabled ssl support with --enable-openssl +- Also built releases 1.72.0, 1.71.0, 1.70.0, 1.62.0 for erratum release + +* Mon Dec 10 2001 Mike A. Harris 1.8.6-1 +- Updated to xchat 1.8.6 + +* Tue Nov 13 2001 Mike A. Harris 1.8.5-1 +- Updated to xchat 1.8.5 +- Added f to rm -r in install and clean sections + +* Sun Oct 7 2001 Mike A. Harris 1.8.4-1 +- Updated to 1.8.4, now using tar.bz2 +- Removed kanjiconv-fix patch as it is integrated now +- Added xchat-1.8.4-fix-USE_GNOME.patch to fix simple ifdef USE_GNOME typo + +* Fri Jul 13 2001 Akira TAGOH 1.8.1-2 +- fixed check locale. +- don't save kanji_conv. + always check locale. however anyone can change the option from + the settings menu. + +* Thu Jul 12 2001 Havoc Pennington +- upgrade to 1.8.1 +- remove autoconnect patch since it's upstream +- remove japanese patch, upstream seems to have applied + parts of it and changelog says there's upstream support. + (this patch was pretty huge to maintain in an SRPM anyway...) +- put scripts-python scripts-perl in docs bug #28521 +- remove patch to include locale.h, gone upstream +- upgrade konqueror patch + +* Thu Jul 12 2001 Havoc Pennington +- nevermind, BuildRequires gnome-libs, that should + close #48923 + +* Thu Jul 12 2001 Havoc Pennington +- fix file list to not include absolute path "/usr/share/..." + no idea how that ever worked at all. closes #48923 + +* Mon Jun 25 2001 Karsten Hopp +- use konqueror, not kfmclient on URLs + +* Fri Feb 23 2001 Trond Eivind Glomsrød +- langify +- use %%{_tmppath} +- make it compile + +* Tue Feb 13 2001 Akira TAGOH +- Added Japanese patch. + +* Tue Feb 13 2001 Havoc Pennington +- patch that may fix autoconnections (bug 27093) + +* Mon Jan 22 2001 Havoc Pennington +- 1.6.3 +- remove patch to desktop file (Internet->Application), seems to + have gone upstream + +* Sat Dec 9 2000 Havoc Pennington +- Remove security fix which has been merged upstream +- upgrade to 1.6.1 + +* Sat Aug 19 2000 Havoc Pennington +- Don't use /bin/sh to interpret URLs from the net + +* Fri Aug 11 2000 Jonathan Blandford +- Updated Epoch + +* Thu Jul 13 2000 Prospector +- automatic rebuild + +* Mon Jun 19 2000 Havoc Pennington +- Install HTML docs + +* Fri Jun 16 2000 Preston Brown +- fix desktop entry + +* Fri May 19 2000 Havoc Pennington +- rebuild for the Winston tree, update to 1.4.2