Tue, 07 Jul 2009 17:44:13 +0000
Plug a leak of an account dropdown selection dialog or two.
The optmenu was being assigned to the wrong field, meaning it would be
created twice (the latter when pidgin_request_fields hits that field). On
top of that, the dropdown was being created even when the field isn't
visible (which, in the case of one active account and the New IM dialog,
it isn't).
Fixes a bunch of failed assertions in the debug log like:
g_log: purple_request_field_account_set_value: assertion `field->type == PURPLE_REQUEST_FIELD_ACCOUNT' failed
| 8273 | 1 | /** |
| 15884 | 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 |
|
20147
66f05a854eee
applied changes from 8a731bbd0197fbcc91a705c2d8f528154216defa
Richard Laager <rlaager@pidgin.im>
parents:
19859
diff
changeset
|
4 | */ |
|
66f05a854eee
applied changes from 8a731bbd0197fbcc91a705c2d8f528154216defa
Richard Laager <rlaager@pidgin.im>
parents:
19859
diff
changeset
|
5 | |
|
66f05a854eee
applied changes from 8a731bbd0197fbcc91a705c2d8f528154216defa
Richard Laager <rlaager@pidgin.im>
parents:
19859
diff
changeset
|
6 | /* pidgin |
| 8273 | 7 | * |
|
15931
716b5fac1895
Re-sed the copyright notices so they don't all talk about Purple.
Richard Laager <rlaager@pidgin.im>
parents:
15884
diff
changeset
|
8 | * Pidgin is the legal property of its developers, whose names are too numerous |
| 8273 | 9 | * to list here. Please refer to the COPYRIGHT file distributed with this |
| 10 | * source distribution. | |
| 11 | * | |
| 12 | * This program is free software; you can redistribute it and/or modify | |
| 13 | * it under the terms of the GNU General Public License as published by | |
| 14 | * the Free Software Foundation; either version 2 of the License, or | |
| 15 | * (at your option) any later version. | |
| 16 | * | |
| 17 | * This program is distributed in the hope that it will be useful, | |
| 18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 20 | * GNU General Public License for more details. | |
| 21 | * | |
| 22 | * You should have received a copy of the GNU General Public License | |
| 23 | * 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
|
24 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
| 8273 | 25 | */ |
| 26 | ||
| 27 | #include <glib.h> | |
| 28 | #include "gtkeventloop.h" | |
| 29 | #include "eventloop.h" | |
|
14793
66e32c262451
[gaim-migrate @ 17487]
Daniel Atallah <datallah@pidgin.im>
parents:
14792
diff
changeset
|
30 | #ifdef _WIN32 |
|
14792
02a5df4343f7
[gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
14253
diff
changeset
|
31 | #include "win32dep.h" |
|
14793
66e32c262451
[gaim-migrate @ 17487]
Daniel Atallah <datallah@pidgin.im>
parents:
14792
diff
changeset
|
32 | #endif |
| 8273 | 33 | |
|
15562
8c8249fe5e3c
gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents:
15435
diff
changeset
|
34 | #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
|
35 | #define PIDGIN_WRITE_COND (G_IO_OUT | G_IO_HUP | G_IO_ERR | G_IO_NVAL) |
| 8273 | 36 | |
|
15562
8c8249fe5e3c
gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents:
15435
diff
changeset
|
37 | typedef struct _PidginIOClosure { |
| 15884 | 38 | PurpleInputFunction function; |
| 8273 | 39 | guint result; |
| 40 | gpointer data; | |
| 41 | ||
|
15562
8c8249fe5e3c
gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents:
15435
diff
changeset
|
42 | } PidginIOClosure; |
| 8273 | 43 | |
|
15562
8c8249fe5e3c
gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents:
15435
diff
changeset
|
44 | static void pidgin_io_destroy(gpointer data) |
| 8273 | 45 | { |
| 46 | g_free(data); | |
| 47 | } | |
| 48 | ||
|
15562
8c8249fe5e3c
gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents:
15435
diff
changeset
|
49 | static gboolean pidgin_io_invoke(GIOChannel *source, GIOCondition condition, gpointer data) |
| 8273 | 50 | { |
|
15562
8c8249fe5e3c
gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents:
15435
diff
changeset
|
51 | PidginIOClosure *closure = data; |
| 15884 | 52 | PurpleInputCondition purple_cond = 0; |
| 8273 | 53 | |
|
15562
8c8249fe5e3c
gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents:
15435
diff
changeset
|
54 | if (condition & PIDGIN_READ_COND) |
| 15884 | 55 | purple_cond |= PURPLE_INPUT_READ; |
|
15562
8c8249fe5e3c
gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents:
15435
diff
changeset
|
56 | if (condition & PIDGIN_WRITE_COND) |
| 15884 | 57 | purple_cond |= PURPLE_INPUT_WRITE; |
| 8273 | 58 | |
| 59 | #if 0 | |
| 15884 | 60 | purple_debug(PURPLE_DEBUG_MISC, "gtk_eventloop", |
| 8273 | 61 | "CLOSURE: callback for %d, fd is %d\n", |
| 62 | closure->result, g_io_channel_unix_get_fd(source)); | |
| 63 | #endif | |
| 64 | ||
|
11065
895342350443
[gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents:
8807
diff
changeset
|
65 | #ifdef _WIN32 |
| 15884 | 66 | if(! purple_cond) { |
|
15697
78ddac185d80
winpidgin warning fixes
Daniel Atallah <datallah@pidgin.im>
parents:
15562
diff
changeset
|
67 | #ifdef DEBUG |
| 15884 | 68 | purple_debug(PURPLE_DEBUG_MISC, "gtk_eventloop", |
|
11065
895342350443
[gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents:
8807
diff
changeset
|
69 | "CLOSURE received GIOCondition of 0x%x, which does not" |
|
895342350443
[gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents:
8807
diff
changeset
|
70 | " 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
|
71 | condition, PIDGIN_READ_COND, PIDGIN_WRITE_COND); |
|
11065
895342350443
[gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents:
8807
diff
changeset
|
72 | #endif /* DEBUG */ |
|
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 | return TRUE; |
|
895342350443
[gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents:
8807
diff
changeset
|
75 | } |
|
895342350443
[gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents:
8807
diff
changeset
|
76 | #endif /* _WIN32 */ |
|
895342350443
[gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents:
8807
diff
changeset
|
77 | |
|
895342350443
[gaim-migrate @ 13046]
Christopher O'Brien <siege@pidgin.im>
parents:
8807
diff
changeset
|
78 | closure->function(closure->data, g_io_channel_unix_get_fd(source), |
| 15884 | 79 | purple_cond); |
| 8273 | 80 | |
| 81 | return TRUE; | |
| 82 | } | |
| 83 | ||
| 15884 | 84 | static guint pidgin_input_add(gint fd, PurpleInputCondition condition, PurpleInputFunction function, |
| 8273 | 85 | gpointer data) |
| 86 | { | |
|
15562
8c8249fe5e3c
gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents:
15435
diff
changeset
|
87 | PidginIOClosure *closure = g_new0(PidginIOClosure, 1); |
| 8273 | 88 | GIOChannel *channel; |
| 89 | GIOCondition cond = 0; | |
|
23119
2f1afd977845
Add the ability on win32 to choose at runtime whether we use the GIOChannel
Daniel Atallah <datallah@pidgin.im>
parents:
20147
diff
changeset
|
90 | #ifdef _WIN32 |
|
2f1afd977845
Add the ability on win32 to choose at runtime whether we use the GIOChannel
Daniel Atallah <datallah@pidgin.im>
parents:
20147
diff
changeset
|
91 | static int use_glib_io_channel = -1; |
|
2f1afd977845
Add the ability on win32 to choose at runtime whether we use the GIOChannel
Daniel Atallah <datallah@pidgin.im>
parents:
20147
diff
changeset
|
92 | |
|
2f1afd977845
Add the ability on win32 to choose at runtime whether we use the GIOChannel
Daniel Atallah <datallah@pidgin.im>
parents:
20147
diff
changeset
|
93 | if (use_glib_io_channel == -1) |
|
2f1afd977845
Add the ability on win32 to choose at runtime whether we use the GIOChannel
Daniel Atallah <datallah@pidgin.im>
parents:
20147
diff
changeset
|
94 | use_glib_io_channel = (g_getenv("PIDGIN_GLIB_IO_CHANNEL") != NULL) ? 1 : 0; |
|
2f1afd977845
Add the ability on win32 to choose at runtime whether we use the GIOChannel
Daniel Atallah <datallah@pidgin.im>
parents:
20147
diff
changeset
|
95 | #endif |
| 8273 | 96 | |
| 97 | closure->function = function; | |
| 98 | closure->data = data; | |
| 99 | ||
| 15884 | 100 | if (condition & PURPLE_INPUT_READ) |
|
15562
8c8249fe5e3c
gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents:
15435
diff
changeset
|
101 | cond |= PIDGIN_READ_COND; |
| 15884 | 102 | if (condition & PURPLE_INPUT_WRITE) |
|
15562
8c8249fe5e3c
gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents:
15435
diff
changeset
|
103 | cond |= PIDGIN_WRITE_COND; |
| 8273 | 104 | |
|
14792
02a5df4343f7
[gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
14253
diff
changeset
|
105 | #ifdef _WIN32 |
|
23119
2f1afd977845
Add the ability on win32 to choose at runtime whether we use the GIOChannel
Daniel Atallah <datallah@pidgin.im>
parents:
20147
diff
changeset
|
106 | if (use_glib_io_channel == 0) |
|
2f1afd977845
Add the ability on win32 to choose at runtime whether we use the GIOChannel
Daniel Atallah <datallah@pidgin.im>
parents:
20147
diff
changeset
|
107 | channel = wpurple_g_io_channel_win32_new_socket(fd); |
|
2f1afd977845
Add the ability on win32 to choose at runtime whether we use the GIOChannel
Daniel Atallah <datallah@pidgin.im>
parents:
20147
diff
changeset
|
108 | else |
|
2f1afd977845
Add the ability on win32 to choose at runtime whether we use the GIOChannel
Daniel Atallah <datallah@pidgin.im>
parents:
20147
diff
changeset
|
109 | #endif |
| 8280 | 110 | channel = g_io_channel_unix_new(fd); |
|
23119
2f1afd977845
Add the ability on win32 to choose at runtime whether we use the GIOChannel
Daniel Atallah <datallah@pidgin.im>
parents:
20147
diff
changeset
|
111 | |
| 8273 | 112 | 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
|
113 | pidgin_io_invoke, closure, pidgin_io_destroy); |
| 8273 | 114 | |
| 115 | #if 0 | |
| 15884 | 116 | purple_debug(PURPLE_DEBUG_MISC, "gtk_eventloop", |
| 8273 | 117 | "CLOSURE: adding input watcher %d for fd %d\n", |
| 8280 | 118 | closure->result, fd); |
| 8273 | 119 | #endif |
| 120 | ||
| 121 | g_io_channel_unref(channel); | |
| 122 | return closure->result; | |
| 123 | } | |
| 124 | ||
| 15884 | 125 | static PurpleEventLoopUiOps eventloop_ops = |
| 8273 | 126 | { |
| 127 | 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
|
128 | g_source_remove, |
|
15562
8c8249fe5e3c
gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents:
15435
diff
changeset
|
129 | 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
|
130 | 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
|
131 | NULL, /* input_get_error */ |
|
18075
1e4bb0043a98
It's GLIB_CHECK_VERSION, not GLIB_VERSION_CHECK.
Richard Laager <rlaager@pidgin.im>
parents:
18070
diff
changeset
|
132 | #if GLIB_CHECK_VERSION(2,14,0) |
|
18070
79c7fe0d8e4b
Wire everything up and document it.
Richard Laager <rlaager@pidgin.im>
parents:
18068
diff
changeset
|
133 | g_timeout_add_seconds, |
|
79c7fe0d8e4b
Wire everything up and document it.
Richard Laager <rlaager@pidgin.im>
parents:
18068
diff
changeset
|
134 | #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
|
135 | NULL, |
|
18070
79c7fe0d8e4b
Wire everything up and document it.
Richard Laager <rlaager@pidgin.im>
parents:
18068
diff
changeset
|
136 | #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
|
137 | NULL, |
|
e6bcb1628c57
Patch from John 'rekkanoryo' Bailey to add the padding struct members in pidgin
Gary Kramlich <grim@reaperworld.com>
parents:
16254
diff
changeset
|
138 | NULL, |
|
e6bcb1628c57
Patch from John 'rekkanoryo' Bailey to add the padding struct members in pidgin
Gary Kramlich <grim@reaperworld.com>
parents:
16254
diff
changeset
|
139 | NULL |
| 8273 | 140 | }; |
| 141 | ||
| 15884 | 142 | PurpleEventLoopUiOps * |
|
15562
8c8249fe5e3c
gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents:
15435
diff
changeset
|
143 | pidgin_eventloop_get_ui_ops(void) |
| 8273 | 144 | { |
| 145 | return &eventloop_ops; | |
| 146 | } |