pidgin/gtkeventloop.c

Fri, 14 Sep 2007 17:55:05 +0000

author
Daniel Atallah <datallah@pidgin.im>
date
Fri, 14 Sep 2007 17:55:05 +0000
changeset 20073
dbea205441ea
parent 19859
71d37b57eff2
child 20147
66f05a854eee
permissions
-rw-r--r--

Fix proxy settings to be loaded correctly when libpurple is initialized. This was broken because it relied on the prefs being loaded after proxy initialization so that the pref callbacks would be triggered and I changed the prefs loading to happen right at the beginning to fix other issues. Fixes #3092.

8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
1 /**
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15746
diff changeset
2 * @file gtk_eventloop.c Purple Event Loop API (gtk implementation)
16254
eeb2bba4dc94 Rename the Doxygen group from gtkui to pidgin.
Richard Laager <rlaager@pidgin.im>
parents: 15931
diff changeset
3 * @ingroup pidgin
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
4 *
15931
716b5fac1895 Re-sed the copyright notices so they don't all talk about Purple.
Richard Laager <rlaager@pidgin.im>
parents: 15884
diff changeset
5 * pidgin
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
6 *
15931
716b5fac1895 Re-sed the copyright notices so they don't all talk about Purple.
Richard Laager <rlaager@pidgin.im>
parents: 15884
diff changeset
7 * Pidgin is the legal property of its developers, whose names are too numerous
8273
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
19859
71d37b57eff2 The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents: 18075
diff changeset
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
8273
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"
14793
66e32c262451 [gaim-migrate @ 17487]
Daniel Atallah <datallah@pidgin.im>
parents: 14792
diff changeset
29 #ifdef _WIN32
14792
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents: 14253
diff changeset
30 #include "win32dep.h"
14793
66e32c262451 [gaim-migrate @ 17487]
Daniel Atallah <datallah@pidgin.im>
parents: 14792
diff changeset
31 #endif
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
32
15562
8c8249fe5e3c gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
33 #define PIDGIN_READ_COND (G_IO_IN | G_IO_HUP | G_IO_ERR)
8c8249fe5e3c gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
34 #define PIDGIN_WRITE_COND (G_IO_OUT | G_IO_HUP | G_IO_ERR | G_IO_NVAL)
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
35
15562
8c8249fe5e3c gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
36 typedef struct _PidginIOClosure {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15746
diff changeset
37 PurpleInputFunction function;
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
38 guint result;
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
39 gpointer data;
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
40
15562
8c8249fe5e3c gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
41 } PidginIOClosure;
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
42
15562
8c8249fe5e3c gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
43 static void pidgin_io_destroy(gpointer data)
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
44 {
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
45 g_free(data);
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
46 }
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
47
15562
8c8249fe5e3c gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
48 static gboolean pidgin_io_invoke(GIOChannel *source, GIOCondition condition, gpointer data)
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
49 {
15562
8c8249fe5e3c gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
50 PidginIOClosure *closure = data;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15746
diff changeset
51 PurpleInputCondition purple_cond = 0;
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
52
15562
8c8249fe5e3c gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
53 if (condition & PIDGIN_READ_COND)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15746
diff changeset
54 purple_cond |= PURPLE_INPUT_READ;
15562
8c8249fe5e3c gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
55 if (condition & PIDGIN_WRITE_COND)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15746
diff changeset
56 purple_cond |= PURPLE_INPUT_WRITE;
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
57
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
58 #if 0
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15746
diff changeset
59 purple_debug(PURPLE_DEBUG_MISC, "gtk_eventloop",
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
60 "CLOSURE: callback for %d, fd is %d\n",
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
61 closure->result, g_io_channel_unix_get_fd(source));
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
62 #endif
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
63
11065
895342350443 [gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents: 8807
diff changeset
64 #ifdef _WIN32
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15746
diff changeset
65 if(! purple_cond) {
15697
78ddac185d80 winpidgin warning fixes
Daniel Atallah <datallah@pidgin.im>
parents: 15562
diff changeset
66 #ifdef DEBUG
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15746
diff changeset
67 purple_debug(PURPLE_DEBUG_MISC, "gtk_eventloop",
11065
895342350443 [gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents: 8807
diff changeset
68 "CLOSURE received GIOCondition of 0x%x, which does not"
895342350443 [gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents: 8807
diff changeset
69 " match 0x%x (READ) or 0x%x (WRITE)\n",
15562
8c8249fe5e3c gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
70 condition, PIDGIN_READ_COND, PIDGIN_WRITE_COND);
11065
895342350443 [gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents: 8807
diff changeset
71 #endif /* DEBUG */
895342350443 [gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents: 8807
diff changeset
72
895342350443 [gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents: 8807
diff changeset
73 return TRUE;
895342350443 [gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents: 8807
diff changeset
74 }
895342350443 [gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents: 8807
diff changeset
75 #endif /* _WIN32 */
895342350443 [gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents: 8807
diff changeset
76
895342350443 [gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents: 8807
diff changeset
77 closure->function(closure->data, g_io_channel_unix_get_fd(source),
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15746
diff changeset
78 purple_cond);
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
79
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
80 return TRUE;
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
81 }
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
82
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15746
diff changeset
83 static guint pidgin_input_add(gint fd, PurpleInputCondition condition, PurpleInputFunction function,
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
84 gpointer data)
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
85 {
15562
8c8249fe5e3c gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
86 PidginIOClosure *closure = g_new0(PidginIOClosure, 1);
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
87 GIOChannel *channel;
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
88 GIOCondition cond = 0;
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
89
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
90 closure->function = function;
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
91 closure->data = data;
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
92
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15746
diff changeset
93 if (condition & PURPLE_INPUT_READ)
15562
8c8249fe5e3c gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
94 cond |= PIDGIN_READ_COND;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15746
diff changeset
95 if (condition & PURPLE_INPUT_WRITE)
15562
8c8249fe5e3c gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
96 cond |= PIDGIN_WRITE_COND;
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
97
14792
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents: 14253
diff changeset
98 #ifdef _WIN32
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15746
diff changeset
99 channel = wpurple_g_io_channel_win32_new_socket(fd);
14792
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents: 14253
diff changeset
100 #else
8280
f448633d3f3a [gaim-migrate @ 9004]
Scott Lamb
parents: 8273
diff changeset
101 channel = g_io_channel_unix_new(fd);
14792
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents: 14253
diff changeset
102 #endif
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
103 closure->result = g_io_add_watch_full(channel, G_PRIORITY_DEFAULT, cond,
15562
8c8249fe5e3c gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
104 pidgin_io_invoke, closure, pidgin_io_destroy);
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
105
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
106 #if 0
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15746
diff changeset
107 purple_debug(PURPLE_DEBUG_MISC, "gtk_eventloop",
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
108 "CLOSURE: adding input watcher %d for fd %d\n",
8280
f448633d3f3a [gaim-migrate @ 9004]
Scott Lamb
parents: 8273
diff changeset
109 closure->result, fd);
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
110 #endif
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
111
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
112 g_io_channel_unref(channel);
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
113 return closure->result;
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
114 }
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
115
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15746
diff changeset
116 static PurpleEventLoopUiOps eventloop_ops =
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
117 {
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
118 g_timeout_add,
15729
6932ac4e5b3d Change out source_remove and input_remove eventloop functions to return
Mark Doliner <markdoliner@pidgin.im>
parents: 15697
diff changeset
119 g_source_remove,
15562
8c8249fe5e3c gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
120 pidgin_input_add,
15746
017e33725857 Added a new GaimEventLoopUiOps item, input_get_error(). This function allows the UI to return the current error status on a socket/input. If the UI does not implement it (as Pidgin and gntgaim do not, since glib's handling of sockets is sane), it is just a wrapper around getsockopt(). Implemented or not, its return values should match those of getsockopt() with a level of SOL_SOCKET and an option of SO_ERROR. For curious souls, Adium will be using this to provide a working version of getsockopt(); the CoreFoundation CFSocket class which is used for socket read/write calls getsockopt() with SO_ERROR itself, thereby clearing the error flag [as documented in getsockopt()'s behavior], so depending upon it for determining if an error occurred leads to significant misbehavior.
Evan Schoenberg <evands@pidgin.im>
parents: 15729
diff changeset
121 g_source_remove,
16752
e6bcb1628c57 Patch from John 'rekkanoryo' Bailey to add the padding struct members in pidgin
Gary Kramlich <grim@reaperworld.com>
parents: 16254
diff changeset
122 NULL, /* input_get_error */
18075
1e4bb0043a98 It's GLIB_CHECK_VERSION, not GLIB_VERSION_CHECK.
Richard Laager <rlaager@pidgin.im>
parents: 18070
diff changeset
123 #if GLIB_CHECK_VERSION(2,14,0)
18070
79c7fe0d8e4b Wire everything up and document it.
Richard Laager <rlaager@pidgin.im>
parents: 18068
diff changeset
124 g_timeout_add_seconds,
79c7fe0d8e4b Wire everything up and document it.
Richard Laager <rlaager@pidgin.im>
parents: 18068
diff changeset
125 #else
16752
e6bcb1628c57 Patch from John 'rekkanoryo' Bailey to add the padding struct members in pidgin
Gary Kramlich <grim@reaperworld.com>
parents: 16254
diff changeset
126 NULL,
18070
79c7fe0d8e4b Wire everything up and document it.
Richard Laager <rlaager@pidgin.im>
parents: 18068
diff changeset
127 #endif
16752
e6bcb1628c57 Patch from John 'rekkanoryo' Bailey to add the padding struct members in pidgin
Gary Kramlich <grim@reaperworld.com>
parents: 16254
diff changeset
128 NULL,
e6bcb1628c57 Patch from John 'rekkanoryo' Bailey to add the padding struct members in pidgin
Gary Kramlich <grim@reaperworld.com>
parents: 16254
diff changeset
129 NULL,
e6bcb1628c57 Patch from John 'rekkanoryo' Bailey to add the padding struct members in pidgin
Gary Kramlich <grim@reaperworld.com>
parents: 16254
diff changeset
130 NULL
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
131 };
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
132
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15746
diff changeset
133 PurpleEventLoopUiOps *
15562
8c8249fe5e3c gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
134 pidgin_eventloop_get_ui_ops(void)
8273
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
135 {
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
136 return &eventloop_ops;
7882af5843e9 [gaim-migrate @ 8997]
Scott Lamb
parents:
diff changeset
137 }

mercurial