mirror of
https://github.com/moparisthebest/hexchat
synced 2024-12-02 06:02:16 -05:00
add Orville's patches until they got committed to upstream
This commit is contained in:
parent
9c8f37cc15
commit
23e53ae46c
705
xchat-wdk.patch
705
xchat-wdk.patch
@ -2008,8 +2008,8 @@ diff -ruN --strip-trailing-cr xchat-wdk.orig/src/fe-gtk/xtext.h xchat-wdk/src/fe
|
|||||||
#endif
|
#endif
|
||||||
diff -ruN --strip-trailing-cr xchat-wdk.orig/src/fe-text/fe-text.c xchat-wdk/src/fe-text/fe-text.c
|
diff -ruN --strip-trailing-cr xchat-wdk.orig/src/fe-text/fe-text.c xchat-wdk/src/fe-text/fe-text.c
|
||||||
--- xchat-wdk.orig/src/fe-text/fe-text.c 2008-08-29 13:24:17 +0200
|
--- xchat-wdk.orig/src/fe-text/fe-text.c 2008-08-29 13:24:17 +0200
|
||||||
+++ xchat-wdk/src/fe-text/fe-text.c 2010-12-28 14:57:33 +0100
|
+++ xchat-wdk/src/fe-text/fe-text.c 2011-01-10 08:55:20 +0100
|
||||||
@@ -22,9 +22,13 @@
|
@@ -22,60 +22,51 @@
|
||||||
#ifdef HAVE_STRINGS_H
|
#ifdef HAVE_STRINGS_H
|
||||||
#include <strings.h>
|
#include <strings.h>
|
||||||
#endif
|
#endif
|
||||||
@ -2017,70 +2017,677 @@ diff -ruN --strip-trailing-cr xchat-wdk.orig/src/fe-text/fe-text.c xchat-wdk/src
|
|||||||
+#define STDIN_FILENO 0
|
+#define STDIN_FILENO 0
|
||||||
+#define STDOUT_FILENO 1
|
+#define STDOUT_FILENO 1
|
||||||
+#else
|
+#else
|
||||||
|
+#include <unistd.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
+#endif
|
+#endif
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
-#include <unistd.h>
|
-#include <unistd.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
+#include <glib.h>
|
||||||
#include "../common/xchat.h"
|
#include "../common/xchat.h"
|
||||||
#include "../common/xchatc.h"
|
#include "../common/xchatc.h"
|
||||||
@@ -339,7 +343,11 @@
|
+#include "../common/cfgfiles.h"
|
||||||
te->callback = callback;
|
#include "../common/outbound.h"
|
||||||
te->userdata = userdata;
|
#include "../common/util.h"
|
||||||
|
#include "../common/fe.h"
|
||||||
|
#include "fe-text.h"
|
||||||
|
|
||||||
- gettimeofday (&now, NULL);
|
|
||||||
+#ifdef WIN32
|
-static GSList *tmr_list; /* timer list */
|
||||||
+ g_get_current_time (&now);
|
-static int tmr_list_count;
|
||||||
|
-static GSList *se_list; /* socket event list */
|
||||||
|
-static int se_list_count;
|
||||||
|
static int done = FALSE; /* finished ? */
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
send_command (char *cmd)
|
||||||
|
{
|
||||||
|
- handle_multiline (sess_list->data, cmd, TRUE, FALSE);
|
||||||
|
+ handle_multiline (current_tab, cmd, TRUE, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void
|
||||||
|
-read_stdin (void)
|
||||||
|
+static gboolean
|
||||||
|
+handle_line (GIOChannel *channel, GIOCondition cond, gpointer data)
|
||||||
|
{
|
||||||
|
- int len, i = 0;
|
||||||
|
- static int pos = 0;
|
||||||
|
- static char inbuf[1024];
|
||||||
|
- char tmpbuf[512];
|
||||||
|
-
|
||||||
|
- len = read (STDIN_FILENO, tmpbuf, sizeof tmpbuf - 1);
|
||||||
|
|
||||||
|
- while (i < len)
|
||||||
|
- {
|
||||||
|
- switch (tmpbuf[i])
|
||||||
|
- {
|
||||||
|
- case '\r':
|
||||||
|
- break;
|
||||||
|
-
|
||||||
|
- case '\n':
|
||||||
|
- inbuf[pos] = 0;
|
||||||
|
- pos = 0;
|
||||||
|
- send_command (inbuf);
|
||||||
|
- break;
|
||||||
|
+ gchar *str_return;
|
||||||
|
+ gsize length, terminator_pos;
|
||||||
|
+ GError *error = NULL;
|
||||||
|
+ GIOStatus result;
|
||||||
|
|
||||||
|
- default:
|
||||||
|
- inbuf[pos] = tmpbuf[i];
|
||||||
|
- if (pos < (sizeof inbuf - 2))
|
||||||
|
- pos++;
|
||||||
|
- }
|
||||||
|
- i++;
|
||||||
|
+ result = g_io_channel_read_line(channel, &str_return, &length, &terminator_pos, &error);
|
||||||
|
+ if (result == G_IO_STATUS_ERROR) {
|
||||||
|
+ return FALSE;
|
||||||
|
+ }
|
||||||
|
+ else {
|
||||||
|
+ send_command(str_return);
|
||||||
|
+ g_free(str_return);
|
||||||
|
+ return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -87,12 +78,13 @@
|
||||||
|
char buf[512];
|
||||||
|
|
||||||
|
sess->gui = malloc (4);
|
||||||
|
+ current_sess = sess;
|
||||||
|
|
||||||
|
if (!sess->server->front_session)
|
||||||
|
sess->server->front_session = sess;
|
||||||
|
if (!sess->server->server_session)
|
||||||
|
sess->server->server_session = sess;
|
||||||
|
- if (!current_tab)
|
||||||
|
+ if (!current_tab || focus)
|
||||||
|
current_tab = sess;
|
||||||
|
|
||||||
|
if (done_intro)
|
||||||
|
@@ -133,15 +125,21 @@
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
-timecat (char *buf)
|
||||||
|
+timecat (char *buf, time_t stamp)
|
||||||
|
{
|
||||||
|
char stampbuf[64];
|
||||||
|
|
||||||
|
- get_stamp_str (time (0), stampbuf, sizeof (stampbuf));
|
||||||
|
+ /* set the stamp to the current time if not provided */
|
||||||
|
+ if (!stamp)
|
||||||
|
+ stamp = time (0);
|
||||||
|
+
|
||||||
|
+ get_stamp_str (stamp, stampbuf, sizeof (stampbuf));
|
||||||
|
strcat (buf, stampbuf);
|
||||||
|
return strlen (stampbuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* Windows doesn't handle ANSI codes in cmd.exe, need to not display them */
|
||||||
|
+#ifndef WIN32
|
||||||
|
/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */
|
||||||
|
static const short colconv[] = { 0, 7, 4, 2, 1, 3, 5, 11, 13, 12, 6, 16, 14, 15, 10, 7 };
|
||||||
|
|
||||||
|
@@ -157,7 +155,7 @@
|
||||||
|
if (prefs.timestamp)
|
||||||
|
{
|
||||||
|
newtext[0] = 0;
|
||||||
|
- j += timecat (newtext);
|
||||||
|
+ j += timecat (newtext, stamp);
|
||||||
|
}
|
||||||
|
while (i < len)
|
||||||
|
{
|
||||||
|
@@ -165,7 +163,7 @@
|
||||||
|
{
|
||||||
|
dotime = FALSE;
|
||||||
|
newtext[j] = 0;
|
||||||
|
- j += timecat (newtext);
|
||||||
|
+ j += timecat (newtext, stamp);
|
||||||
|
}
|
||||||
|
switch (text[i])
|
||||||
|
{
|
||||||
|
@@ -179,8 +177,7 @@
|
||||||
|
j++;
|
||||||
|
newtext[j] = 'm';
|
||||||
|
j++;
|
||||||
|
- i--;
|
||||||
|
- goto jump2;
|
||||||
|
+ goto endloop;
|
||||||
|
}
|
||||||
|
k = 0;
|
||||||
|
comma = FALSE;
|
||||||
|
@@ -226,13 +223,16 @@
|
||||||
|
comma = TRUE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
- goto jump;
|
||||||
|
+ goto endloop;
|
||||||
|
}
|
||||||
|
k = 0;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
+ /* don't actually want hidden text */
|
||||||
|
+ case '\010': /* hidden */
|
||||||
|
+ break;
|
||||||
|
case '\026': /* REVERSE */
|
||||||
|
if (reverse)
|
||||||
|
{
|
||||||
|
@@ -296,120 +296,246 @@
|
||||||
|
newtext[j] = text[i];
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
- jump2:
|
||||||
|
i++;
|
||||||
|
- jump:
|
||||||
|
- i += 0;
|
||||||
|
+ endloop:
|
||||||
|
+ ;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ /* make sure last character is a new line */
|
||||||
|
+ if (text[i-1] != '\n')
|
||||||
|
+ newtext[j++] = '\n';
|
||||||
|
+
|
||||||
|
newtext[j] = 0;
|
||||||
|
write (STDOUT_FILENO, newtext, j);
|
||||||
|
free (newtext);
|
||||||
|
}
|
||||||
|
-
|
||||||
+#else
|
+#else
|
||||||
+ gettimeofday (&now, NULL);
|
+/* The win32 version for cmd.exe */
|
||||||
+#endif
|
void
|
||||||
te->next_call = now.tv_sec * 1000 + (now.tv_usec / 1000) + te->interval;
|
-fe_timeout_remove (int tag)
|
||||||
|
+fe_print_text (struct session *sess, char *text, time_t stamp)
|
||||||
|
{
|
||||||
|
- timerevent *te;
|
||||||
|
- GSList *list;
|
||||||
|
+ int dotime = FALSE;
|
||||||
|
+ int comma, k, i = 0, j = 0, len = strlen (text);
|
||||||
|
+
|
||||||
|
+ unsigned char *newtext = malloc (len + 1024);
|
||||||
|
|
||||||
tmr_list = g_slist_prepend (tmr_list, te);
|
- list = tmr_list;
|
||||||
@@ -417,7 +425,12 @@
|
- while (list)
|
||||||
|
+ if (prefs.timestamp)
|
||||||
|
{
|
||||||
|
- te = (timerevent *) list->data;
|
||||||
|
- if (te->tag == tag)
|
||||||
|
+ newtext[0] = 0;
|
||||||
|
+ j += timecat (newtext, stamp);
|
||||||
|
+ }
|
||||||
|
+ while (i < len)
|
||||||
|
+ {
|
||||||
|
+ if (dotime && text[i] != 0)
|
||||||
|
{
|
||||||
|
- tmr_list = g_slist_remove (tmr_list, te);
|
||||||
|
- free (te);
|
||||||
|
- return;
|
||||||
|
+ dotime = FALSE;
|
||||||
|
+ newtext[j] = 0;
|
||||||
|
+ j += timecat (newtext, stamp);
|
||||||
|
+ }
|
||||||
|
+ switch (text[i])
|
||||||
|
+ {
|
||||||
|
+ case 3:
|
||||||
|
+ i++;
|
||||||
|
+ if (!isdigit (text[i]))
|
||||||
|
+ {
|
||||||
|
+ goto endloop;
|
||||||
|
+ }
|
||||||
|
+ k = 0;
|
||||||
|
+ comma = FALSE;
|
||||||
|
+ while (i < len)
|
||||||
|
+ {
|
||||||
|
+ if (text[i] >= '0' && text[i] <= '9' && k < 2)
|
||||||
|
+ {
|
||||||
|
+ k++;
|
||||||
|
+ } else
|
||||||
|
+ {
|
||||||
|
+ switch (text[i])
|
||||||
|
+ {
|
||||||
|
+ case ',':
|
||||||
|
+ comma = TRUE;
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
+ goto endloop;
|
||||||
|
+ }
|
||||||
|
+ k = 0;
|
||||||
|
+
|
||||||
|
+ }
|
||||||
|
+ i++;
|
||||||
|
+ }
|
||||||
|
+ break;
|
||||||
|
+ /* don't actually want hidden text */
|
||||||
|
+ case '\010': /* hidden */
|
||||||
|
+ case '\026': /* REVERSE */
|
||||||
|
+ case '\037': /* underline */
|
||||||
|
+ case '\002': /* bold */
|
||||||
|
+ case '\017': /* reset all */
|
||||||
|
+ break;
|
||||||
|
+ case '\007':
|
||||||
|
+ if (!prefs.filterbeep)
|
||||||
|
+ {
|
||||||
|
+ newtext[j] = text[i];
|
||||||
|
+ j++;
|
||||||
|
+ }
|
||||||
|
+ break;
|
||||||
|
+ case '\t':
|
||||||
|
+ newtext[j] = ' ';
|
||||||
|
+ j++;
|
||||||
|
+ break;
|
||||||
|
+ case '\n':
|
||||||
|
+ newtext[j] = '\r';
|
||||||
|
+ j++;
|
||||||
|
+ if (prefs.timestamp)
|
||||||
|
+ dotime = TRUE;
|
||||||
|
+ default:
|
||||||
|
+ newtext[j] = text[i];
|
||||||
|
+ j++;
|
||||||
|
}
|
||||||
|
- list = list->next;
|
||||||
|
+ i++;
|
||||||
|
+ endloop:
|
||||||
|
+ ;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ /* make sure last character is a new line */
|
||||||
|
+ if (text[i-1] != '\n')
|
||||||
|
+ newtext[j++] = '\n';
|
||||||
|
+
|
||||||
|
+ newtext[j] = 0;
|
||||||
|
+ write (STDOUT_FILENO, newtext, j);
|
||||||
|
+ free (newtext);
|
||||||
|
+}
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+fe_timeout_remove (int tag)
|
||||||
|
+{
|
||||||
|
+ g_source_remove (tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
fe_timeout_add (int interval, void *callback, void *userdata)
|
||||||
|
{
|
||||||
|
- struct timeval now;
|
||||||
|
- timerevent *te = malloc (sizeof (timerevent));
|
||||||
|
-
|
||||||
|
- tmr_list_count++; /* this overflows at 2.2Billion, who cares!! */
|
||||||
|
-
|
||||||
|
- te->tag = tmr_list_count;
|
||||||
|
- te->interval = interval;
|
||||||
|
- te->callback = callback;
|
||||||
|
- te->userdata = userdata;
|
||||||
|
-
|
||||||
|
- gettimeofday (&now, NULL);
|
||||||
|
- te->next_call = now.tv_sec * 1000 + (now.tv_usec / 1000) + te->interval;
|
||||||
|
-
|
||||||
|
- tmr_list = g_slist_prepend (tmr_list, te);
|
||||||
|
-
|
||||||
|
- return te->tag;
|
||||||
|
+ return g_timeout_add (interval, (GSourceFunc) callback, userdata);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
fe_input_remove (int tag)
|
||||||
|
{
|
||||||
|
- socketevent *se;
|
||||||
|
- GSList *list;
|
||||||
|
-
|
||||||
|
- list = se_list;
|
||||||
|
- while (list)
|
||||||
|
- {
|
||||||
|
- se = (socketevent *) list->data;
|
||||||
|
- if (se->tag == tag)
|
||||||
|
- {
|
||||||
|
- se_list = g_slist_remove (se_list, se);
|
||||||
|
- free (se);
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
- list = list->next;
|
||||||
|
- }
|
||||||
|
+ g_source_remove (tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
fe_input_add (int sok, int flags, void *func, void *data)
|
||||||
|
{
|
||||||
|
- socketevent *se = malloc (sizeof (socketevent));
|
||||||
|
-
|
||||||
|
- se_list_count++; /* this overflows at 2.2Billion, who cares!! */
|
||||||
|
+ int tag, type = 0;
|
||||||
|
+ GIOChannel *channel;
|
||||||
|
|
||||||
|
- se->tag = se_list_count;
|
||||||
|
- se->sok = sok;
|
||||||
|
- se->rread = flags & FIA_READ;
|
||||||
|
- se->wwrite = flags & FIA_WRITE;
|
||||||
|
- se->eexcept = flags & FIA_EX;
|
||||||
|
- se->callback = func;
|
||||||
|
- se->userdata = data;
|
||||||
|
- se_list = g_slist_prepend (se_list, se);
|
||||||
|
+ channel = g_io_channel_unix_new (sok);
|
||||||
|
|
||||||
|
- return se->tag;
|
||||||
|
-}
|
||||||
|
+ if (flags & FIA_READ)
|
||||||
|
+ type |= G_IO_IN | G_IO_HUP | G_IO_ERR;
|
||||||
|
+ if (flags & FIA_WRITE)
|
||||||
|
+ type |= G_IO_OUT | G_IO_ERR;
|
||||||
|
+ if (flags & FIA_EX)
|
||||||
|
+ type |= G_IO_PRI;
|
||||||
|
+
|
||||||
|
+ tag = g_io_add_watch (channel, type, (GIOFunc) func, data);
|
||||||
|
+ g_io_channel_unref (channel);
|
||||||
|
+
|
||||||
|
+ return tag;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/* === command-line parameter parsing : requires glib 2.6 === */
|
||||||
|
+
|
||||||
|
+static char *arg_cfgdir = NULL;
|
||||||
|
+static gint arg_show_autoload = 0;
|
||||||
|
+static gint arg_show_config = 0;
|
||||||
|
+static gint arg_show_version = 0;
|
||||||
|
+
|
||||||
|
+static const GOptionEntry gopt_entries[] =
|
||||||
|
+{
|
||||||
|
+ {"no-auto", 'a', 0, G_OPTION_ARG_NONE, &arg_dont_autoconnect, N_("Don't auto connect to servers"), NULL},
|
||||||
|
+ {"cfgdir", 'd', 0, G_OPTION_ARG_STRING, &arg_cfgdir, N_("Use a different config directory"), "PATH"},
|
||||||
|
+ {"no-plugins", 'n', 0, G_OPTION_ARG_NONE, &arg_skip_plugins, N_("Don't auto load any plugins"), NULL},
|
||||||
|
+ {"plugindir", 'p', 0, G_OPTION_ARG_NONE, &arg_show_autoload, N_("Show plugin auto-load directory"), NULL},
|
||||||
|
+ {"configdir", 'u', 0, G_OPTION_ARG_NONE, &arg_show_config, N_("Show user config directory"), NULL},
|
||||||
|
+ {"url", 0, 0, G_OPTION_ARG_STRING, &arg_url, N_("Open an irc://server:port/channel URL"), "URL"},
|
||||||
|
+ {"version", 'v', 0, G_OPTION_ARG_NONE, &arg_show_version, N_("Show version information"), NULL},
|
||||||
|
+ {NULL}
|
||||||
|
+};
|
||||||
|
|
||||||
|
int
|
||||||
|
fe_args (int argc, char *argv[])
|
||||||
|
{
|
||||||
|
- if (argc > 1)
|
||||||
|
+ GError *error = NULL;
|
||||||
|
+ GOptionContext *context;
|
||||||
|
+
|
||||||
|
+#ifdef ENABLE_NLS
|
||||||
|
+ bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
|
||||||
|
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
|
||||||
|
+ textdomain (GETTEXT_PACKAGE);
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+ context = g_option_context_new (NULL);
|
||||||
|
+ g_option_context_add_main_entries (context, gopt_entries, GETTEXT_PACKAGE);
|
||||||
|
+ g_option_context_parse (context, &argc, &argv, &error);
|
||||||
|
+
|
||||||
|
+ if (error)
|
||||||
|
{
|
||||||
|
- if (!strcasecmp (argv[1], "--version") || !strcasecmp (argv[1], "-v"))
|
||||||
|
+ if (error->message)
|
||||||
|
+ printf ("%s\n", error->message);
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ g_option_context_free (context);
|
||||||
|
+
|
||||||
|
+ if (arg_show_version)
|
||||||
|
+ {
|
||||||
|
+ printf (PACKAGE_TARNAME" "PACKAGE_VERSION"\n");
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (arg_show_autoload)
|
||||||
|
+ {
|
||||||
|
+#ifdef WIN32
|
||||||
|
+ /* see the chdir() below */
|
||||||
|
+ char *sl, *exe = strdup (argv[0]);
|
||||||
|
+ sl = strrchr (exe, '\\');
|
||||||
|
+ if (sl)
|
||||||
|
{
|
||||||
|
- puts (PACKAGE_VERSION);
|
||||||
|
- return 0;
|
||||||
|
+ *sl = 0;
|
||||||
|
+ printf ("%s\\plugins\n", exe);
|
||||||
|
}
|
||||||
|
+#else
|
||||||
|
+ printf ("%s\n", XCHATLIBDIR"/plugins");
|
||||||
|
+#endif
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (arg_show_config)
|
||||||
|
+ {
|
||||||
|
+ printf ("%s\n", get_xdir_fs ());
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (arg_cfgdir) /* we want filesystem encoding */
|
||||||
|
+ {
|
||||||
|
+ xdir_fs = strdup (arg_cfgdir);
|
||||||
|
+ if (xdir_fs[strlen (xdir_fs) - 1] == '/')
|
||||||
|
+ xdir_fs[strlen (xdir_fs) - 1] = 0;
|
||||||
|
+ g_free (arg_cfgdir);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
fe_init (void)
|
||||||
|
{
|
||||||
|
- se_list = 0;
|
||||||
|
- se_list_count = 0;
|
||||||
|
- tmr_list = 0;
|
||||||
|
- tmr_list_count = 0;
|
||||||
|
+ /* the following should be default generated, not enfoced in binary */
|
||||||
|
prefs.autosave = 0;
|
||||||
|
prefs.use_server_tab = 0;
|
||||||
|
prefs.autodialog = 0;
|
||||||
|
+ /* except for these, there is no lag meter, there is no server list */
|
||||||
|
prefs.lagometer = 0;
|
||||||
|
prefs.slist_skip = 1;
|
||||||
|
}
|
||||||
|
@@ -417,129 +543,29 @@
|
||||||
void
|
void
|
||||||
fe_main (void)
|
fe_main (void)
|
||||||
{
|
{
|
||||||
- struct timeval timeout, now;
|
- struct timeval timeout, now;
|
||||||
+ struct timeval timeout;
|
- socketevent *se;
|
||||||
+#ifdef WIN32
|
- timerevent *te;
|
||||||
+ GTimeVal now;
|
- fd_set rd, wd, ex;
|
||||||
+#else
|
- GSList *list;
|
||||||
+ struct timeval now;
|
- guint64 shortest, delay;
|
||||||
+#endif
|
+ GIOChannel *keyboard_input;
|
||||||
socketevent *se;
|
|
||||||
timerevent *te;
|
|
||||||
fd_set rd, wd, ex;
|
|
||||||
@@ -428,7 +441,7 @@
|
|
||||||
new_ircwindow (NULL, NULL, SESS_SERVER, 0);
|
|
||||||
|
|
||||||
#ifdef ENABLE_NLS
|
- if (!sess_list)
|
||||||
|
- new_ircwindow (NULL, NULL, SESS_SERVER, 0);
|
||||||
|
+ main_loop = g_main_loop_new(NULL, FALSE);
|
||||||
|
|
||||||
|
-#ifdef ENABLE_NLS
|
||||||
- bindtextdomain (GETTEXT_PACKAGE, PREFIX"/share/locale");
|
- bindtextdomain (GETTEXT_PACKAGE, PREFIX"/share/locale");
|
||||||
+ bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
|
- bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
|
||||||
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
|
- textdomain (GETTEXT_PACKAGE);
|
||||||
textdomain (GETTEXT_PACKAGE);
|
+ /* Keyboard Entry Setup */
|
||||||
#endif
|
+#ifdef G_OS_WIN32
|
||||||
@@ -464,7 +477,11 @@
|
+ keyboard_input = g_io_channel_win32_new_fd(STDIN_FILENO);
|
||||||
shortest = te->next_call;
|
|
||||||
list = list->next;
|
|
||||||
}
|
|
||||||
+#ifdef WIN32
|
|
||||||
+ g_get_current_time (&now);
|
|
||||||
+#else
|
+#else
|
||||||
gettimeofday (&now, NULL);
|
+ keyboard_input = g_io_channel_unix_new(STDIN_FILENO);
|
||||||
+#endif
|
#endif
|
||||||
delay = shortest - ((now.tv_sec * 1000) + (now.tv_usec / 1000));
|
|
||||||
timeout.tv_sec = delay / 1000;
|
- while (!done)
|
||||||
timeout.tv_usec = (delay % 1000) * 1000;
|
- {
|
||||||
@@ -514,7 +531,11 @@
|
- FD_ZERO (&rd);
|
||||||
|
- FD_ZERO (&wd);
|
||||||
|
- FD_ZERO (&ex);
|
||||||
|
-
|
||||||
|
- list = se_list;
|
||||||
|
- while (list)
|
||||||
|
- {
|
||||||
|
- se = (socketevent *) list->data;
|
||||||
|
- if (se->rread)
|
||||||
|
- FD_SET (se->sok, &rd);
|
||||||
|
- if (se->wwrite)
|
||||||
|
- FD_SET (se->sok, &wd);
|
||||||
|
- if (se->eexcept)
|
||||||
|
- FD_SET (se->sok, &ex);
|
||||||
|
- list = list->next;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- FD_SET (STDIN_FILENO, &rd); /* for reading keyboard */
|
||||||
|
+ g_io_add_watch(keyboard_input, G_IO_IN, handle_line, NULL);
|
||||||
|
|
||||||
|
- /* find the shortest timeout event */
|
||||||
|
- shortest = 0;
|
||||||
|
- list = tmr_list;
|
||||||
|
- while (list)
|
||||||
|
- {
|
||||||
|
- te = (timerevent *) list->data;
|
||||||
|
- if (te->next_call < shortest || shortest == 0)
|
||||||
|
- shortest = te->next_call;
|
||||||
|
- list = list->next;
|
||||||
|
- }
|
||||||
|
- gettimeofday (&now, NULL);
|
||||||
|
- delay = shortest - ((now.tv_sec * 1000) + (now.tv_usec / 1000));
|
||||||
|
- timeout.tv_sec = delay / 1000;
|
||||||
|
- timeout.tv_usec = (delay % 1000) * 1000;
|
||||||
|
-
|
||||||
|
- select (FD_SETSIZE, &rd, &wd, &ex, &timeout);
|
||||||
|
-
|
||||||
|
- if (FD_ISSET (STDIN_FILENO, &rd))
|
||||||
|
- read_stdin ();
|
||||||
|
-
|
||||||
|
- /* set all checked flags to false */
|
||||||
|
- list = se_list;
|
||||||
|
- while (list)
|
||||||
|
- {
|
||||||
|
- se = (socketevent *) list->data;
|
||||||
|
- se->checked = 0;
|
||||||
|
- list = list->next;
|
||||||
|
- }
|
||||||
|
+ g_main_loop_run(main_loop);
|
||||||
|
|
||||||
|
- /* check all the socket callbacks */
|
||||||
|
- list = se_list;
|
||||||
|
- while (list)
|
||||||
|
- {
|
||||||
|
- se = (socketevent *) list->data;
|
||||||
|
- se->checked = 1;
|
||||||
|
- if (se->rread && FD_ISSET (se->sok, &rd))
|
||||||
|
- {
|
||||||
|
- se->callback (NULL, 1, se->userdata);
|
||||||
|
- } else if (se->wwrite && FD_ISSET (se->sok, &wd))
|
||||||
|
- {
|
||||||
|
- se->callback (NULL, 2, se->userdata);
|
||||||
|
- } else if (se->eexcept && FD_ISSET (se->sok, &ex))
|
||||||
|
- {
|
||||||
|
- se->callback (NULL, 4, se->userdata);
|
||||||
|
- }
|
||||||
|
- list = se_list;
|
||||||
|
- if (list)
|
||||||
|
- {
|
||||||
|
- se = (socketevent *) list->data;
|
||||||
|
- while (se->checked)
|
||||||
|
- {
|
||||||
|
- list = list->next;
|
||||||
|
- if (!list)
|
||||||
|
- break;
|
||||||
|
- se = (socketevent *) list->data;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- /* now check our list of timeout events, some might need to be called! */
|
||||||
|
- gettimeofday (&now, NULL);
|
||||||
|
- list = tmr_list;
|
||||||
|
- while (list)
|
||||||
|
- {
|
||||||
|
- te = (timerevent *) list->data;
|
||||||
|
- list = list->next;
|
||||||
|
- if (now.tv_sec * 1000 + (now.tv_usec / 1000) >= te->next_call)
|
||||||
|
- {
|
||||||
|
- /* if the callback returns 0, it must be removed */
|
||||||
|
- if (te->callback (te->userdata) == 0)
|
||||||
|
- {
|
||||||
|
- fe_timeout_remove (te->tag);
|
||||||
|
- } else
|
||||||
|
- {
|
||||||
|
- te->next_call = now.tv_sec * 1000 + (now.tv_usec / 1000) + te->interval;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- }
|
||||||
|
+ return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* now check our list of timeout events, some might need to be called! */
|
void
|
||||||
+#ifdef WIN32
|
fe_exit (void)
|
||||||
+ g_get_current_time (&now);
|
|
||||||
+#else
|
|
||||||
gettimeofday (&now, NULL);
|
|
||||||
+#endif
|
|
||||||
list = tmr_list;
|
|
||||||
while (list)
|
|
||||||
{
|
{
|
||||||
|
done = TRUE;
|
||||||
|
+ g_main_loop_quit(main_loop);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
@@ -793,10 +819,23 @@
|
||||||
|
void
|
||||||
|
fe_idle_add (void *func, void *data)
|
||||||
|
{
|
||||||
|
+ g_idle_add (func, data);
|
||||||
|
}
|
||||||
|
void
|
||||||
|
fe_ctrl_gui (session *sess, fe_gui_action action, int arg)
|
||||||
|
{
|
||||||
|
+ /* only one action type handled for now, but could add more */
|
||||||
|
+ switch (action)
|
||||||
|
+ {
|
||||||
|
+ /* gui focus is really the only case xchat-text needs to wory about */
|
||||||
|
+ case FE_GUI_FOCUS:
|
||||||
|
+ current_sess = sess;
|
||||||
|
+ current_tab = sess;
|
||||||
|
+ sess->server->front_session = sess;
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
int
|
||||||
|
fe_gui_info (session *sess, int info_type)
|
||||||
|
diff -ruN --strip-trailing-cr xchat-wdk.orig/src/fe-text/fe-text.h xchat-wdk/src/fe-text/fe-text.h
|
||||||
|
--- xchat-wdk.orig/src/fe-text/fe-text.h 2002-11-28 11:41:32 +0100
|
||||||
|
+++ xchat-wdk/src/fe-text/fe-text.h 2011-01-10 08:55:20 +0100
|
||||||
|
@@ -1,29 +1 @@
|
||||||
|
-
|
||||||
|
-typedef int (*socket_callback) (void *source, int condition, void *user_data);
|
||||||
|
-typedef int (*timer_callback) (void *user_data);
|
||||||
|
-
|
||||||
|
-struct socketeventRec
|
||||||
|
-{
|
||||||
|
- socket_callback callback;
|
||||||
|
- void *userdata;
|
||||||
|
- int sok;
|
||||||
|
- int tag;
|
||||||
|
- int rread:1;
|
||||||
|
- int wwrite:1;
|
||||||
|
- int eexcept:1;
|
||||||
|
- int checked:1;
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
-typedef struct socketeventRec socketevent;
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-struct timerRec
|
||||||
|
-{
|
||||||
|
- timer_callback callback;
|
||||||
|
- void *userdata;
|
||||||
|
- int interval;
|
||||||
|
- int tag;
|
||||||
|
- guint64 next_call; /* miliseconds */
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
-typedef struct timerRec timerevent;
|
||||||
|
+GMainLoop *main_loop;
|
||||||
|
Loading…
Reference in New Issue
Block a user