Sat, 26 Apr 2003 20:30:43 +0000
[gaim-migrate @ 5604]
Chats in the buddy list!
You can now put chat rooms in your buddy list, and double-click them to join
them, instead of having to do all that typing. I'm eventually gonna add
auto-join support, so that ugly hack involving pouncing can go away.
Someone should make some new artwork so we don't have 2 + icons next to
each other in the menus.
This also has some fixes to let gaim compile again, after the renaming of
the buddy list files.
This also fixes the problem with offline buddies not showing up in the list
sometimes for accounts that didn't log in at startup.
This probably fixes other stuff, but I can't remember any of it off the top
of my head.
I'm going to stop typing and let people play with this now.
| 1 | 1 | /* |
| 2 | * gaim | |
| 3 | * | |
| 4 | * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net> | |
| 5 | * | |
| 6 | * some code: (most in this file) | |
| 7 | * Copyright (C) 1996 Netscape Communications Corporation, all rights reserved. | |
| 8 | * Created: Jamie Zawinski <jwz@netscape.com>, 24-Dec-94. | |
| 9 | * | |
| 10 | * This program is free software; you can redistribute it and/or modify | |
| 11 | * it under the terms of the GNU General Public License as published by | |
| 12 | * the Free Software Foundation; either version 2 of the License, or | |
| 13 | * (at your option) any later version. | |
| 14 | * | |
| 15 | * This program is distributed in the hope that it will be useful, | |
| 16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 18 | * GNU General Public License for more details. | |
| 19 | * | |
| 20 | * You should have received a copy of the GNU General Public License | |
| 21 | * along with this program; if not, write to the Free Software | |
| 22 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 23 | * | |
| 24 | * This code is mainly taken from Netscape's sample implementation of | |
| 25 | * their protocol. Nifty. | |
| 26 | * | |
| 27 | */ | |
| 28 | ||
| 29 | ||
|
349
6f7d28b0f98d
[gaim-migrate @ 359]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
79
diff
changeset
|
30 | #ifdef HAVE_CONFIG_H |
|
2090
bab8b7e309db
[gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2077
diff
changeset
|
31 | #include <config.h> |
|
349
6f7d28b0f98d
[gaim-migrate @ 359]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
79
diff
changeset
|
32 | #endif |
| 3630 | 33 | #ifdef _WIN32 |
| 34 | #include <gdk/gdkwin32.h> | |
| 35 | #else | |
| 36 | #include <unistd.h> | |
| 4428 | 37 | #ifndef HOST_NAME_MAX |
| 38 | #define HOST_NAME_MAX 255 | |
| 39 | #endif | |
| 3630 | 40 | #include <gdk/gdkx.h> |
| 41 | #endif | |
| 1 | 42 | #include <stdio.h> |
| 43 | #include <stdlib.h> | |
| 44 | #include <string.h> | |
| 45 | ||
| 46 | ||
| 47 | ||
| 48 | ||
| 49 | #include <gtk/gtk.h> | |
| 50 | #include <gdk/gdkprivate.h> | |
| 51 | #include "gaim.h" | |
| 52 | ||
| 53 | #ifndef _WIN32 | |
| 54 | ||
| 55 | ||
| 56 | ||
| 57 | ||
| 58 | #include <X11/Xlib.h> | |
| 59 | #include <X11/Xatom.h> | |
| 60 | ||
| 61 | ||
| 62 | static const char *progname = "gaim"; | |
| 63 | static const char *expected_mozilla_version = "1.1"; | |
| 64 | ||
| 65 | #define MOZILLA_VERSION_PROP "_MOZILLA_VERSION" | |
| 66 | #define MOZILLA_LOCK_PROP "_MOZILLA_LOCK" | |
| 67 | #define MOZILLA_COMMAND_PROP "_MOZILLA_COMMAND" | |
| 68 | #define MOZILLA_RESPONSE_PROP "_MOZILLA_RESPONSE" | |
| 69 | ||
| 3466 | 70 | static GdkAtom GDKA_MOZILLA_VERSION = 0; |
| 71 | static GdkAtom GDKA_MOZILLA_LOCK = 0; | |
| 72 | static GdkAtom GDKA_MOZILLA_COMMAND = 0; | |
| 73 | static GdkAtom GDKA_MOZILLA_RESPONSE = 0; | |
| 1 | 74 | |
| 4428 | 75 | static char *window_check_mozilla_version(Window); |
| 76 | static const char *get_lock_data(); | |
| 77 | static GdkFilterReturn netscape_response_cb(XEvent *, GdkEvent *, GdkWindow *); | |
| 78 | static gboolean netscape_command(const char *); | |
| 1 | 79 | |
| 80 | static int netscape_lock; | |
| 81 | ||
| 82 | ||
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
83 | static Window VirtualRootWindowOfScreen(screen) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
84 | Screen *screen; |
| 1 | 85 | { |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
86 | static Screen *save_screen = (Screen *) 0; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
87 | static Window root = (Window) 0; |
| 1 | 88 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
89 | if (screen != save_screen) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
90 | Display *dpy = DisplayOfScreen(screen); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
91 | Atom __SWM_VROOT = None; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
92 | unsigned int i; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
93 | Window rootReturn, parentReturn, *children; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
94 | unsigned int numChildren; |
| 1 | 95 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
96 | root = RootWindowOfScreen(screen); |
| 1 | 97 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
98 | /* go look for a virtual root */ |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
99 | __SWM_VROOT = XInternAtom(dpy, "__SWM_VROOT", False); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
100 | if (XQueryTree(dpy, root, &rootReturn, &parentReturn, &children, &numChildren)) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
101 | for (i = 0; i < numChildren; i++) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
102 | Atom actual_type; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
103 | int actual_format; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
104 | unsigned long nitems, bytesafter; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
105 | Window *newRoot = (Window *) 0; |
| 1 | 106 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
107 | if (XGetWindowProperty(dpy, children[i], |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
108 | __SWM_VROOT, 0, 1, False, XA_WINDOW, |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
109 | &actual_type, &actual_format, |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
110 | &nitems, &bytesafter, |
|
2372
c24942700dfd
[gaim-migrate @ 2385]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2099
diff
changeset
|
111 | (unsigned char **)&newRoot) == Success |
|
c24942700dfd
[gaim-migrate @ 2385]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2099
diff
changeset
|
112 | && newRoot) { |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
113 | root = *newRoot; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
114 | break; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
115 | } |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
116 | } |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
117 | if (children) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
118 | XFree((char *)children); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
119 | } |
| 1 | 120 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
121 | save_screen = screen; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
122 | } |
| 1 | 123 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
124 | return root; |
| 1 | 125 | } |
| 126 | ||
| 127 | /* The following code is Copyright (C) 1989 X Consortium */ | |
| 128 | ||
| 129 | static Window TryChildren(); | |
| 130 | ||
| 131 | /* Find a window with WM_STATE, else return win itself, as per ICCCM */ | |
| 132 | ||
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
133 | static Window GClientWindow(dpy, win) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
134 | Display *dpy; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
135 | Window win; |
| 1 | 136 | { |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
137 | Atom WM_STATE; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
138 | Atom type = None; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
139 | int format; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
140 | unsigned long nitems, after; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
141 | unsigned char *data; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
142 | Window inf; |
| 1 | 143 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
144 | WM_STATE = XInternAtom(dpy, "WM_STATE", True); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
145 | if (!WM_STATE) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
146 | return win; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
147 | XGetWindowProperty(dpy, win, WM_STATE, 0, 0, False, AnyPropertyType, |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
148 | &type, &format, &nitems, &after, &data); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
149 | if (type) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
150 | XFree(data); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
151 | return win; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
152 | } |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
153 | |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
154 | inf = TryChildren(dpy, win, WM_STATE); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
155 | if (!inf) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
156 | inf = win; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
157 | |
| 26 | 158 | XFree(data); |
| 159 | ||
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
160 | return inf; |
| 1 | 161 | } |
| 162 | ||
| 163 | static | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
164 | Window TryChildren(dpy, win, WM_STATE) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
165 | Display *dpy; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
166 | Window win; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
167 | Atom WM_STATE; |
| 1 | 168 | { |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
169 | Window root, parent; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
170 | Window *children; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
171 | unsigned int nchildren; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
172 | unsigned int i; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
173 | Atom type = None; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
174 | int format; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
175 | unsigned long nitems, after; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
176 | unsigned char *data; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
177 | Window inf = 0; |
| 1 | 178 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
179 | if (!XQueryTree(dpy, win, &root, &parent, &children, &nchildren)) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
180 | return 0; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
181 | for (i = 0; !inf && (i < nchildren); i++) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
182 | XGetWindowProperty(dpy, children[i], WM_STATE, 0, 0, False, |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
183 | AnyPropertyType, &type, &format, &nitems, &after, &data); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
184 | if (type) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
185 | inf = children[i]; |
| 26 | 186 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
187 | XFree(data); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
188 | } |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
189 | for (i = 0; !inf && (i < nchildren); i++) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
190 | inf = TryChildren(dpy, children[i], WM_STATE); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
191 | if (children) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
192 | XFree((char *)children); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
193 | return inf; |
| 1 | 194 | } |
| 195 | ||
| 196 | /* END X Consortium code */ | |
| 197 | ||
| 198 | ||
| 199 | ||
| 200 | static void mozilla_remote_init_atoms() | |
| 201 | { | |
| 3466 | 202 | if (!GDKA_MOZILLA_VERSION) |
| 203 | GDKA_MOZILLA_VERSION = gdk_atom_intern(MOZILLA_VERSION_PROP, 0); | |
| 204 | if (!GDKA_MOZILLA_LOCK) | |
| 205 | GDKA_MOZILLA_LOCK = gdk_atom_intern(MOZILLA_LOCK_PROP, 0); | |
| 206 | if (!GDKA_MOZILLA_COMMAND) | |
| 207 | GDKA_MOZILLA_COMMAND = gdk_atom_intern(MOZILLA_COMMAND_PROP, 0); | |
| 208 | if (!GDKA_MOZILLA_RESPONSE) | |
| 209 | GDKA_MOZILLA_RESPONSE = gdk_atom_intern(MOZILLA_RESPONSE_PROP, 0); | |
| 1 | 210 | } |
| 211 | ||
| 4428 | 212 | static char *window_check_mozilla_version(Window window) { |
| 213 | ||
| 214 | Atom type; | |
| 215 | int format; | |
| 216 | unsigned long nitems, bytesafter; | |
| 217 | unsigned char *version = 0; | |
| 218 | gchar *retval = NULL; | |
| 219 | ||
| 220 | if (XGetWindowProperty(gdk_display, window, | |
| 221 | gdk_x11_atom_to_xatom(GDKA_MOZILLA_VERSION), | |
| 222 | 0, (65536 / sizeof(long)), | |
| 223 | False, XA_STRING, | |
| 224 | &type, &format, &nitems, &bytesafter, | |
| 225 | &version) != Success) { | |
| 226 | return NULL; | |
| 227 | } | |
| 228 | ||
| 229 | if (!version) { | |
| 230 | return NULL; | |
| 231 | } | |
| 232 | ||
| 233 | retval = g_strdup(version); | |
| 234 | XFree(version); | |
| 235 | ||
| 236 | return retval; | |
| 237 | } | |
| 238 | ||
| 1 | 239 | static GdkWindow *mozilla_remote_find_window() |
| 240 | { | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
241 | int i; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
242 | Window root = VirtualRootWindowOfScreen(DefaultScreenOfDisplay(gdk_display)); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
243 | Window root2, parent, *kids; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
244 | unsigned int nkids; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
245 | Window result = 0; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
246 | Window tenative = 0; |
| 4428 | 247 | unsigned char *tenative_version = 0, *version = 0; |
| 248 | static GdkWindow *remote_window = NULL; | |
| 249 | ||
| 250 | if (remote_window != NULL) { | |
| 251 | version = window_check_mozilla_version(GDK_WINDOW_XID(remote_window)); | |
| 252 | ||
| 253 | if (version != NULL) { | |
| 254 | g_free(version); | |
| 255 | return remote_window; | |
| 256 | } | |
| 257 | g_free(version); | |
| 258 | ||
| 259 | gdk_window_destroy(remote_window); | |
| 260 | remote_window = NULL; | |
| 261 | } | |
| 1 | 262 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
263 | if (!XQueryTree(gdk_display, root, &root2, &parent, &kids, &nkids)) { |
|
5213
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
264 | gaim_debug(GAIM_DEBUG_ERROR, "browser", |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
265 | "%s: XQueryTree failed on display %s\n", |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
266 | progname, DisplayString(gdk_display)); |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
267 | return NULL; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
268 | } |
| 1 | 269 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
270 | /* root != root2 is possible with virtual root WMs. */ |
| 1 | 271 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
272 | if (!(kids && nkids)) { |
|
5213
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
273 | gaim_debug(GAIM_DEBUG_ERROR, "browser", |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
274 | "%s: root window has no children on display %s\n", |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
275 | progname, DisplayString(gdk_display)); |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
276 | return NULL; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
277 | } |
| 1 | 278 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
279 | for (i = nkids - 1; i >= 0; i--) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
280 | Window w = GClientWindow(gdk_display, kids[i]); |
| 4428 | 281 | |
| 282 | version = window_check_mozilla_version(w); | |
| 26 | 283 | |
| 4428 | 284 | if (version == NULL) { |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
285 | continue; |
| 4428 | 286 | } |
| 26 | 287 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
288 | if (strcmp((char *)version, expected_mozilla_version) && !tenative) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
289 | tenative = w; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
290 | tenative_version = version; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
291 | continue; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
292 | } |
| 4428 | 293 | |
| 294 | g_free(version); | |
| 295 | ||
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
296 | result = w; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
297 | break; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
298 | } |
| 1 | 299 | |
| 26 | 300 | XFree(kids); |
| 301 | ||
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
302 | if (result && tenative) { |
|
5213
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
303 | gaim_debug(GAIM_DEBUG_WARNING, "browser", |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
304 | "%s: both version %s (0x%x) and version %s (%0x%x) " |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
305 | "are running. Using version %s.\n", |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
306 | progname, tenative_version, (unsigned int)tenative, |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
307 | expected_mozilla_version, (unsigned int)result, |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
308 | expected_mozilla_version); |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
309 | XFree(tenative_version); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
310 | return gdk_window_foreign_new(result); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
311 | } else if (tenative) { |
|
5213
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
312 | gaim_debug(GAIM_DEBUG_WARNING, "browser", |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
313 | "%s: expected version %s but found version %s (0x%x) " |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
314 | "instead.\n", |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
315 | progname, expected_mozilla_version, |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
316 | tenative_version, (unsigned int)tenative); |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
317 | XFree(tenative_version); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
318 | return gdk_window_foreign_new(tenative); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
319 | } else if (result) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
320 | return gdk_window_foreign_new(result); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
321 | } else { |
|
5213
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
322 | gaim_debug(GAIM_DEBUG_ERROR, "%s: not running on display %s\n", |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
323 | progname, DisplayString(gdk_display)); |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
324 | return NULL; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
325 | } |
| 1 | 326 | } |
| 327 | ||
| 328 | ||
| 4428 | 329 | static const char *get_lock_data() { |
| 330 | static char *lock_data = NULL; | |
| 1 | 331 | |
| 4428 | 332 | if (lock_data == NULL) { |
| 333 | char hostname[HOST_NAME_MAX + 1] = {0}; | |
| 334 | ||
| 335 | if (gethostname(hostname, HOST_NAME_MAX + 1) == 0) { | |
| 336 | lock_data = g_strdup_printf("pid%d@%s", getpid(), hostname); | |
| 337 | } else { | |
| 338 | lock_data = g_strdup_printf("pid%d", getpid()); | |
| 1 | 339 | } |
| 340 | } | |
| 341 | ||
| 4428 | 342 | return lock_data; |
| 343 | } | |
| 344 | ||
| 4551 | 345 | static void mozilla_remote_obtain_lock(GdkWindow * window) |
| 4428 | 346 | { |
| 347 | gboolean locked = False; | |
| 348 | const char *lock_data = get_lock_data(); | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
349 | GdkAtom actual_type; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
350 | gint actual_format; |
| 1 | 351 | gint nitems; |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
352 | unsigned char *data = 0; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
353 | |
| 4428 | 354 | gdk_x11_grab_server(); |
| 355 | if (!gdk_property_get(window, GDKA_MOZILLA_LOCK, | |
| 3466 | 356 | gdk_x11_xatom_to_atom (XA_STRING), 0, |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
357 | (65536 / sizeof(long)), 0, |
| 4428 | 358 | &actual_type, &actual_format, &nitems, &data)) { |
| 359 | ||
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
360 | /* It's not now locked - lock it. */ |
|
5213
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
361 | gaim_debug(GAIM_DEBUG_MISC, "browser", |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
362 | "%s: writing " MOZILLA_LOCK_PROP " \"%s\" to 0x%x\n", |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
363 | progname, lock_data, (unsigned int)window); |
| 1 | 364 | |
|
5213
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
365 | gdk_property_change(window, GDKA_MOZILLA_LOCK, |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
366 | gdk_x11_xatom_to_atom (XA_STRING), |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
367 | 8, PropModeReplace, |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
368 | (unsigned char *)lock_data, strlen(lock_data)); |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
369 | locked = True; |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
370 | } |
| 1 | 371 | |
|
5213
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
372 | if (data) |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
373 | g_free(data); |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
374 | |
| 4428 | 375 | gdk_x11_ungrab_server(); |
| 1 | 376 | } |
| 377 | ||
| 378 | ||
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
379 | static void mozilla_remote_free_lock(GdkWindow * window) |
| 1 | 380 | { |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
381 | int result = 0; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
382 | GdkAtom actual_type; |
| 4428 | 383 | gint actual_format; |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
384 | gint nitems; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
385 | unsigned char *data = 0; |
| 4428 | 386 | const char *lock_data = get_lock_data(); |
| 1 | 387 | |
|
5213
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
388 | gaim_debug(GAIM_DEBUG_MISC, "browser", |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
389 | "%s: deleting " MOZILLA_LOCK_PROP " \"%s\" from 0x%x\n", |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
390 | progname, lock_data, (unsigned int)window); |
| 1 | 391 | |
| 3466 | 392 | result = gdk_property_get(window, GDKA_MOZILLA_LOCK, |
| 393 | gdk_x11_xatom_to_atom (XA_STRING), | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
394 | 0, (65536 / sizeof(long)), |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
395 | 1, &actual_type, &actual_format, &nitems, &data); |
| 4428 | 396 | |
| 397 | if (result != TRUE) { | |
|
5213
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
398 | gaim_debug(GAIM_DEBUG_ERROR, "browser", |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
399 | "%s: Unable to read and delete " MOZILLA_LOCK_PROP |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
400 | " property\n", progname); |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
401 | return; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
402 | } else if (!data || !*data) { |
|
5213
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
403 | gaim_debug(GAIM_DEBUG_ERROR, "browser", |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
404 | "%s: Invalid data on " MOZILLA_LOCK_PROP |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
405 | " of wnidow 0x%x\n", progname, (unsigned int)window); |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
406 | return; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
407 | } else if (strcmp((char *)data, lock_data)) { |
|
5213
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
408 | gaim_debug(GAIM_DEBUG_ERROR, "browser", |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
409 | "%s: " MOZILLA_LOCK_PROP " was stolen! Expected \"%s\", " |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
410 | "saw \"%s\"!\n", progname, lock_data, data); |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
411 | return; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
412 | } |
| 1 | 413 | |
| 4428 | 414 | XFree(data); |
| 1 | 415 | } |
| 416 | ||
| 4428 | 417 | static GdkFilterReturn netscape_response_cb(XEvent *event, GdkEvent *translated, GdkWindow *window) |
| 418 | { | |
| 419 | Atom actual_type, mozilla_response; | |
| 420 | Window xid; | |
| 421 | int actual_format; | |
| 422 | unsigned long nitems, bytes_after; | |
| 423 | unsigned char *data = 0; | |
| 1 | 424 | |
| 4428 | 425 | if (window == NULL || GDK_WINDOW_OBJECT(window)->destroyed) { |
| 426 | do_error_dialog(_("Communication with the browser failed. Please close all " | |
| 427 | "windows and try again."), NULL, GAIM_ERROR); | |
|
5213
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
428 | gaim_debug(GAIM_DEBUG_WARNING, "browser", |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
429 | "netscape_response_cb called with NULL window.\n"); |
| 4428 | 430 | return GDK_FILTER_CONTINUE; |
| 431 | } | |
| 432 | ||
| 433 | mozilla_response = gdk_x11_atom_to_xatom(GDKA_MOZILLA_RESPONSE); | |
| 434 | xid = GDK_WINDOW_XID(window); | |
| 435 | ||
| 436 | /* If the event isn't what we want then let gtk handle it */ | |
| 437 | if (event->xany.type != PropertyNotify || | |
| 438 | event->xproperty.state != PropertyNewValue || | |
| 439 | event->xproperty.window != xid || | |
| 440 | event->xproperty.atom != mozilla_response) { | |
| 441 | return GDK_FILTER_CONTINUE; | |
| 442 | } | |
| 443 | ||
| 444 | if (XGetWindowProperty (gdk_display, xid, mozilla_response, | |
| 445 | 0, (65536 / sizeof (long)), | |
| 446 | True, | |
| 447 | XA_STRING, | |
| 448 | &actual_type, &actual_format, | |
| 449 | &nitems, &bytes_after, | |
| 450 | &data) != Success | |
| 451 | || data == NULL || (data[0] != '1' && data[0] != '2')) { | |
| 452 | ||
| 453 | do_error_dialog(_("Communication with the browser failed. Please close all " | |
| 454 | "windows and try again."), NULL, GAIM_ERROR); | |
| 455 | } | |
| 456 | ||
| 457 | if (data[0] == '1') { | |
| 458 | /* Netscape isn't ready yet */ | |
|
5213
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
459 | gaim_debug(GAIM_DEBUG_ERROR, "browser", |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
460 | "Remote Netscape window isn't ready yet.\n"); |
| 4428 | 461 | return GDK_FILTER_REMOVE; |
| 462 | } | |
| 463 | ||
| 464 | if (data[0] == '2') { | |
| 465 | /* Yay! It worked */ | |
|
5213
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
466 | gaim_debug(GAIM_DEBUG_INFO, "browser", |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
467 | "Successfully sent command to remote Netscape window.\n"); |
| 4428 | 468 | } |
| 469 | ||
| 470 | gdk_window_remove_filter(window, (GdkFilterFunc) netscape_response_cb, window); | |
| 471 | mozilla_remote_free_lock(window); | |
| 472 | netscape_lock = 0; | |
| 473 | return GDK_FILTER_REMOVE; | |
| 474 | } | |
| 475 | ||
| 476 | static void mozilla_remote_command(GdkWindow * window, const char *command, Bool raise_p) | |
| 1 | 477 | { |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
478 | char *new_command = 0; |
| 1 | 479 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
480 | /* The -noraise option is implemented by passing a "noraise" argument |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
481 | to each command to which it should apply. |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
482 | */ |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
483 | if (!raise_p) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
484 | char *close; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
485 | new_command = g_malloc(strlen(command) + 20); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
486 | strcpy(new_command, command); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
487 | close = strrchr(new_command, ')'); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
488 | if (close) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
489 | strcpy(close, ", noraise)"); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
490 | else |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
491 | strcat(new_command, "(noraise)"); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
492 | command = new_command; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
493 | } |
| 1 | 494 | |
|
5213
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
495 | gaim_debug(GAIM_DEBUG_MISC, "browser", |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
496 | "%s: Writing " MOZILLA_COMMAND_PROP " \"%s\" to 0x%x\n", |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
497 | progname, command, (unsigned int)window); |
| 1 | 498 | |
| 3466 | 499 | gdk_property_change(window, GDKA_MOZILLA_COMMAND, |
| 500 | gdk_x11_xatom_to_atom (XA_STRING), | |
| 501 | 8, GDK_PROP_MODE_REPLACE, (unsigned char *)command, strlen(command)); | |
| 1 | 502 | |
|
4431
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
503 | gdk_window_add_filter(window, (GdkFilterFunc) netscape_response_cb, window); |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
504 | } |
|
4430
95df701e8cdf
[gaim-migrate @ 4705]
Robert McQueen <robot101@debian.org>
parents:
4429
diff
changeset
|
505 | |
|
4431
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
506 | static gboolean netscape_command(const char *command) |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
507 | { |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
508 | GdkWindow *window = NULL; |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
509 | |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
510 | if (netscape_lock) { |
|
5213
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
511 | gaim_debug(GAIM_DEBUG_WARNING, "browser", |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
512 | "netscape_command() is currently in use.\n"); |
|
4431
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
513 | return FALSE; |
|
4430
95df701e8cdf
[gaim-migrate @ 4705]
Robert McQueen <robot101@debian.org>
parents:
4429
diff
changeset
|
514 | } |
|
95df701e8cdf
[gaim-migrate @ 4705]
Robert McQueen <robot101@debian.org>
parents:
4429
diff
changeset
|
515 | |
|
4431
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
516 | netscape_lock = 1; |
| 1 | 517 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
518 | mozilla_remote_init_atoms(); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
519 | window = mozilla_remote_find_window(); |
| 1 | 520 | |
|
4431
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
521 | if (window == NULL || (GDK_WINDOW_OBJECT(window)->destroyed == TRUE)) { |
|
5213
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
522 | gaim_debug(GAIM_DEBUG_ERROR, "browser", |
|
d56ea526b80c
[gaim-migrate @ 5583]
Christian Hammond <chipx86@chipx86.com>
parents:
4885
diff
changeset
|
523 | "Remote window absent or unsuitable.\n"); |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
524 | netscape_lock = 0; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
525 | return FALSE; |
| 1 | 526 | } |
| 527 | ||
|
4431
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
528 | mozilla_remote_command(window, command, False); |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
529 | |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
530 | netscape_lock = 0; |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
531 | return TRUE; |
| 1 | 532 | } |
| 533 | ||
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
534 | void open_url(GtkWidget *w, char *url) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
535 | { |
|
4431
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
536 | char *command = NULL; |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
537 | GError *error = NULL; |
| 4551 | 538 | |
|
4431
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
539 | switch (web_browser) { |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
540 | case BROWSER_NETSCAPE: { |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
541 | char *args = NULL; |
| 4551 | 542 | |
|
4431
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
543 | if (misc_options & OPT_MISC_BROWSER_POPUP) |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
544 | args = g_strdup_printf("OpenURL(%s, new-window)", url); |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
545 | else |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
546 | args = g_strdup_printf("OpenURL(%s)", url); |
| 4551 | 547 | |
| 548 | if (netscape_command(args)) { | |
|
4431
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
549 | g_free(args); |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
550 | return; |
|
2827
e3d10df95e74
[gaim-migrate @ 2840]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2781
diff
changeset
|
551 | } |
| 2566 | 552 | |
| 4551 | 553 | /* if netscape is running ... |
|
4431
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
554 | command = g_strdup_printf("netscape -remote %s", args); */ |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
555 | |
| 4551 | 556 | command = g_strdup_printf("netscape \"%s\"", url); |
|
4431
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
557 | g_free(args); |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
558 | } break; |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
559 | |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
560 | case BROWSER_OPERA: |
| 4551 | 561 | if (misc_options & OPT_MISC_BROWSER_POPUP) |
| 562 | command = g_strdup_printf("opera -newwindow \"%s\"", url); | |
| 563 | else | |
| 564 | command = g_strdup_printf("opera \"%s\"", url); | |
|
4431
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
565 | break; |
| 4551 | 566 | |
|
4431
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
567 | case BROWSER_KONQ: |
| 4551 | 568 | command = g_strdup_printf("kfmclient openURL \"%s\"", url); |
|
4431
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
569 | break; |
| 4551 | 570 | |
|
4431
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
571 | case BROWSER_GALEON: |
| 4551 | 572 | if (misc_options & OPT_MISC_BROWSER_POPUP) |
| 573 | command = g_strdup_printf("galeon -w \"%s\"", url); | |
| 574 | else | |
| 575 | command = g_strdup_printf("galeon \"%s\"", url); | |
|
4431
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
576 | break; |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
577 | |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
578 | case BROWSER_MOZILLA: |
| 4551 | 579 | command = g_strdup_printf("mozilla \"%s\"", url); |
|
4431
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
580 | break; |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
581 | |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
582 | case BROWSER_MANUAL: { |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
583 | char *space_free_url = NULL; |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
584 | |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
585 | if (!web_command[0]) { |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
586 | do_error_dialog(_("Unable to launch your browser because the 'Manual' browser command has been chosen, but no command has been set."), NULL, GAIM_ERROR); |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
587 | return; |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
588 | } |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
589 | |
| 4580 | 590 | space_free_url = g_strdup(url); |
| 591 | g_strdelimit(space_free_url, " ", '+'); | |
| 4885 | 592 | if(strstr(web_command, "%s")) |
| 593 | command = g_strdup_printf(web_command, space_free_url); | |
| 594 | else | |
| 595 | command = g_strdup_printf("%s %s", web_command, space_free_url); | |
| 596 | g_free(space_free_url); | |
| 597 | } break; | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
598 | } |
|
4431
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
599 | |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
600 | if (g_spawn_command_line_async(command, &error) == FALSE) { |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
601 | char *tmp = g_strdup_printf(_("There was an error launching your chosen browser: %s"), error->message); |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
602 | do_error_dialog(tmp, NULL, GAIM_ERROR); |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
603 | g_free(tmp); |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
604 | g_error_free(error); |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
605 | } |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
606 | |
|
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
607 | g_free(command); |
| 1 | 608 | } |
| 609 | ||
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
610 | void add_bookmark(GtkWidget *w, char *url) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
611 | { |
| 1 | 612 | if (web_browser == BROWSER_NETSCAPE) { |
|
4431
c0a9b9f3924f
[gaim-migrate @ 4706]
Robert McQueen <robot101@debian.org>
parents:
4430
diff
changeset
|
613 | char *command = g_strdup_printf("AddBookmark(%s)", url); |
| 1 | 614 | |
| 615 | netscape_command(command); | |
| 616 | g_free(command); | |
| 617 | } | |
| 618 | } | |
| 619 | ||
| 620 | #else | |
| 621 | ||
| 622 | /* Sooner or later, I shall support Windows clicking! */ | |
| 623 | ||
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
624 | void add_bookmark(GtkWidget *w, char *url) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
625 | { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
626 | } |
| 3630 | 627 | void open_url(GtkWidget *w, char *url) |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
628 | { |
| 3630 | 629 | ShellExecute(NULL, NULL, url, NULL, ".\\", 0); |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
630 | } |
| 1 | 631 | |
| 632 | ||
|
2372
c24942700dfd
[gaim-migrate @ 2385]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2099
diff
changeset
|
633 | #endif /* _WIN32 */ |