src/gtkeventloop.c

Tue, 11 Apr 2006 16:06:24 +0000

author
Richard Laager <rlaager@pidgin.im>
date
Tue, 11 Apr 2006 16:06:24 +0000
changeset 13624
c6577def4e2a
parent 11065
895342350443
permissions
-rw-r--r--

[gaim-migrate @ 16009]
Use the GSlice allocator (for logs and log sets) when compiling with glib 2.10 or greater and eliminate some unnecessary memory zeroing. This cuts the log loading time in half for one of Luke's contacts.

8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
1 /**
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
2 * @file gtk_eventloop.c Gaim Event Loop API (gtk implementation)
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
3 * @ingroup gtkui
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
4 *
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
5 * gaim
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
6 *
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
7 * Gaim is the legal property of its developers, whose names are too numerous
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
8 * to list here. Please refer to the COPYRIGHT file distributed with this
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
9 * source distribution.
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
10 *
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
11 * This program is free software; you can redistribute it and/or modify
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
12 * it under the terms of the GNU General Public License as published by
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
13 * the Free Software Foundation; either version 2 of the License, or
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
14 * (at your option) any later version.
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
15 *
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
16 * This program is distributed in the hope that it will be useful,
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
19 * GNU General Public License for more details.
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
20 *
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
21 * You should have received a copy of the GNU General Public License
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
22 * along with this program; if not, write to the Free Software
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
24 */
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
25
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
26 #include <glib.h>
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
27 #include "gtkeventloop.h"
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
28 #include "eventloop.h"
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
29
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
30 #define GAIM_GTK_READ_COND (G_IO_IN | G_IO_HUP | G_IO_ERR)
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
31 #define GAIM_GTK_WRITE_COND (G_IO_OUT | G_IO_HUP | G_IO_ERR | G_IO_NVAL)
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
32
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
33 typedef struct _GaimGtkIOClosure {
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
34 GaimInputFunction function;
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
35 guint result;
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
36 gpointer data;
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
37
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
38 } GaimGtkIOClosure;
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
39
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
40 static void gaim_gtk_io_destroy(gpointer data)
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
41 {
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
42 g_free(data);
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
43 }
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
44
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
45 static gboolean gaim_gtk_io_invoke(GIOChannel *source, GIOCondition condition, gpointer data)
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
46 {
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
47 GaimGtkIOClosure *closure = data;
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
48 GaimInputCondition gaim_cond = 0;
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
49
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
50 if (condition & GAIM_GTK_READ_COND)
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
51 gaim_cond |= GAIM_INPUT_READ;
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
52 if (condition & GAIM_GTK_WRITE_COND)
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
53 gaim_cond |= GAIM_INPUT_WRITE;
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
54
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
55 #if 0
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
56 gaim_debug(GAIM_DEBUG_MISC, "gtk_eventloop",
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
57 "CLOSURE: callback for %d, fd is %d\n",
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
58 closure->result, g_io_channel_unix_get_fd(source));
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
59 #endif
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
60
11065
895342350443 [gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents: 8807
diff changeset
61 #ifdef _WIN32
895342350443 [gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents: 8807
diff changeset
62 if(! gaim_cond) {
895342350443 [gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents: 8807
diff changeset
63 #if DEBUG
895342350443 [gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents: 8807
diff changeset
64 gaim_debug(GAIM_DEBUG_MISC, "gtk_eventloop",
895342350443 [gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents: 8807
diff changeset
65 "CLOSURE received GIOCondition of 0x%x, which does not"
895342350443 [gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents: 8807
diff changeset
66 " match 0x%x (READ) or 0x%x (WRITE)\n",
895342350443 [gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents: 8807
diff changeset
67 condition, GAIM_GTK_READ_COND, GAIM_GTK_WRITE_COND);
895342350443 [gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents: 8807
diff changeset
68 #endif /* DEBUG */
895342350443 [gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents: 8807
diff changeset
69
895342350443 [gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents: 8807
diff changeset
70 return TRUE;
895342350443 [gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents: 8807
diff changeset
71 }
895342350443 [gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents: 8807
diff changeset
72 #endif /* _WIN32 */
895342350443 [gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents: 8807
diff changeset
73
895342350443 [gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents: 8807
diff changeset
74 closure->function(closure->data, g_io_channel_unix_get_fd(source),
895342350443 [gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents: 8807
diff changeset
75 gaim_cond);
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
76
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
77 return TRUE;
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
78 }
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
79
8280
f448633d3f3a [gaim-migrate @ 9004]
Scott Lamb
parents: 8273
diff changeset
80 static guint gaim_gtk_input_add(gint fd, GaimInputCondition condition, GaimInputFunction function,
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
81 gpointer data)
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
82 {
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
83 GaimGtkIOClosure *closure = g_new0(GaimGtkIOClosure, 1);
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
84 GIOChannel *channel;
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
85 GIOCondition cond = 0;
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
86
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
87 closure->function = function;
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
88 closure->data = data;
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
89
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
90 if (condition & GAIM_INPUT_READ)
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
91 cond |= GAIM_GTK_READ_COND;
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
92 if (condition & GAIM_INPUT_WRITE)
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
93 cond |= GAIM_GTK_WRITE_COND;
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
94
8280
f448633d3f3a [gaim-migrate @ 9004]
Scott Lamb
parents: 8273
diff changeset
95 channel = g_io_channel_unix_new(fd);
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
96 closure->result = g_io_add_watch_full(channel, G_PRIORITY_DEFAULT, cond,
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
97 gaim_gtk_io_invoke, closure, gaim_gtk_io_destroy);
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
98
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
99 #if 0
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
100 gaim_debug(GAIM_DEBUG_MISC, "gtk_eventloop",
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
101 "CLOSURE: adding input watcher %d for fd %d\n",
8280
f448633d3f3a [gaim-migrate @ 9004]
Scott Lamb
parents: 8273
diff changeset
102 closure->result, fd);
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
103 #endif
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
104
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
105 g_io_channel_unref(channel);
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
106 return closure->result;
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
107 }
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
108
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
109 static GaimEventLoopUiOps eventloop_ops =
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
110 {
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
111 g_timeout_add,
8470
100fc1feea95 [gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents: 8287
diff changeset
112 (guint (*)(guint))g_source_remove,
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
113 gaim_gtk_input_add,
8807
128d3dae0196 [gaim-migrate @ 9569]
Jon Oberheide
parents: 8470
diff changeset
114 (guint (*)(guint))g_source_remove
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
115 };
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
116
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
117 GaimEventLoopUiOps *
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
118 gaim_gtk_eventloop_get_ui_ops(void)
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
119 {
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
120 return &eventloop_ops;
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
121 }

mercurial