Thu, 22 Aug 2002 03:13:39 +0000
[gaim-migrate @ 3436]
That was so broken.
| 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 |
| 1 | 33 | #include <stdio.h> |
| 34 | #include <stdlib.h> | |
| 35 | #include <unistd.h> | |
| 36 | #include <string.h> | |
| 37 | ||
| 38 | ||
| 39 | ||
| 40 | ||
| 41 | #include <gtk/gtk.h> | |
| 42 | #include <gdk/gdkprivate.h> | |
| 43 | #include <gdk/gdkx.h> | |
| 44 | #include "gaim.h" | |
| 45 | ||
| 46 | #ifndef _WIN32 | |
| 47 | ||
| 48 | ||
| 49 | ||
| 50 | ||
| 51 | #include <X11/Xlib.h> | |
| 52 | #include <X11/Xatom.h> | |
| 53 | ||
| 54 | ||
| 55 | static const char *progname = "gaim"; | |
| 56 | static const char *expected_mozilla_version = "1.1"; | |
| 57 | ||
| 58 | #define MOZILLA_VERSION_PROP "_MOZILLA_VERSION" | |
| 59 | #define MOZILLA_LOCK_PROP "_MOZILLA_LOCK" | |
| 60 | #define MOZILLA_COMMAND_PROP "_MOZILLA_COMMAND" | |
| 61 | #define MOZILLA_RESPONSE_PROP "_MOZILLA_RESPONSE" | |
| 62 | ||
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
63 | static GdkAtom XA_MOZILLA_VERSION = 0; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
64 | static GdkAtom XA_MOZILLA_LOCK = 0; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
65 | static GdkAtom XA_MOZILLA_COMMAND = 0; |
| 1 | 66 | static GdkAtom XA_MOZILLA_RESPONSE = 0; |
| 67 | ||
| 68 | ||
| 69 | static int netscape_lock; | |
| 70 | ||
| 71 | ||
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
72 | static Window VirtualRootWindowOfScreen(screen) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
73 | Screen *screen; |
| 1 | 74 | { |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
75 | static Screen *save_screen = (Screen *) 0; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
76 | static Window root = (Window) 0; |
| 1 | 77 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
78 | if (screen != save_screen) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
79 | Display *dpy = DisplayOfScreen(screen); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
80 | Atom __SWM_VROOT = None; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
81 | unsigned int i; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
82 | Window rootReturn, parentReturn, *children; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
83 | unsigned int numChildren; |
| 1 | 84 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
85 | root = RootWindowOfScreen(screen); |
| 1 | 86 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
87 | /* go look for a virtual root */ |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
88 | __SWM_VROOT = XInternAtom(dpy, "__SWM_VROOT", False); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
89 | if (XQueryTree(dpy, root, &rootReturn, &parentReturn, &children, &numChildren)) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
90 | for (i = 0; i < numChildren; i++) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
91 | Atom actual_type; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
92 | int actual_format; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
93 | unsigned long nitems, bytesafter; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
94 | Window *newRoot = (Window *) 0; |
| 1 | 95 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
96 | if (XGetWindowProperty(dpy, children[i], |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
97 | __SWM_VROOT, 0, 1, False, XA_WINDOW, |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
98 | &actual_type, &actual_format, |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
99 | &nitems, &bytesafter, |
|
2372
c24942700dfd
[gaim-migrate @ 2385]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2099
diff
changeset
|
100 | (unsigned char **)&newRoot) == Success |
|
c24942700dfd
[gaim-migrate @ 2385]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2099
diff
changeset
|
101 | && newRoot) { |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
102 | root = *newRoot; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
103 | break; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
104 | } |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
105 | } |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
106 | if (children) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
107 | XFree((char *)children); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
108 | } |
| 1 | 109 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
110 | save_screen = screen; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
111 | } |
| 1 | 112 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
113 | return root; |
| 1 | 114 | } |
| 115 | ||
| 116 | /* The following code is Copyright (C) 1989 X Consortium */ | |
| 117 | ||
| 118 | static Window TryChildren(); | |
| 119 | ||
| 120 | /* Find a window with WM_STATE, else return win itself, as per ICCCM */ | |
| 121 | ||
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
122 | static Window GClientWindow(dpy, win) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
123 | Display *dpy; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
124 | Window win; |
| 1 | 125 | { |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
126 | Atom WM_STATE; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
127 | Atom type = None; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
128 | int format; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
129 | unsigned long nitems, after; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
130 | unsigned char *data; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
131 | Window inf; |
| 1 | 132 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
133 | WM_STATE = XInternAtom(dpy, "WM_STATE", True); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
134 | if (!WM_STATE) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
135 | return win; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
136 | XGetWindowProperty(dpy, win, WM_STATE, 0, 0, False, AnyPropertyType, |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
137 | &type, &format, &nitems, &after, &data); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
138 | if (type) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
139 | XFree(data); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
140 | return win; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
141 | } |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
142 | |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
143 | inf = TryChildren(dpy, win, WM_STATE); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
144 | if (!inf) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
145 | inf = win; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
146 | |
| 26 | 147 | XFree(data); |
| 148 | ||
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
149 | return inf; |
| 1 | 150 | } |
| 151 | ||
| 152 | static | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
153 | Window TryChildren(dpy, win, WM_STATE) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
154 | Display *dpy; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
155 | Window win; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
156 | Atom WM_STATE; |
| 1 | 157 | { |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
158 | Window root, parent; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
159 | Window *children; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
160 | unsigned int nchildren; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
161 | unsigned int i; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
162 | Atom type = None; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
163 | int format; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
164 | unsigned long nitems, after; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
165 | unsigned char *data; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
166 | Window inf = 0; |
| 1 | 167 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
168 | if (!XQueryTree(dpy, win, &root, &parent, &children, &nchildren)) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
169 | return 0; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
170 | for (i = 0; !inf && (i < nchildren); i++) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
171 | XGetWindowProperty(dpy, children[i], WM_STATE, 0, 0, False, |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
172 | AnyPropertyType, &type, &format, &nitems, &after, &data); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
173 | if (type) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
174 | inf = children[i]; |
| 26 | 175 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
176 | XFree(data); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
177 | } |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
178 | for (i = 0; !inf && (i < nchildren); i++) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
179 | inf = TryChildren(dpy, children[i], WM_STATE); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
180 | if (children) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
181 | XFree((char *)children); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
182 | return inf; |
| 1 | 183 | } |
| 184 | ||
| 185 | /* END X Consortium code */ | |
| 186 | ||
| 187 | ||
| 188 | ||
| 189 | static void mozilla_remote_init_atoms() | |
| 190 | { | |
| 191 | if (!XA_MOZILLA_VERSION) | |
| 192 | XA_MOZILLA_VERSION = gdk_atom_intern(MOZILLA_VERSION_PROP, 0); | |
| 193 | if (!XA_MOZILLA_LOCK) | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
194 | XA_MOZILLA_LOCK = gdk_atom_intern(MOZILLA_LOCK_PROP, 0); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
195 | if (!XA_MOZILLA_COMMAND) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
196 | XA_MOZILLA_COMMAND = gdk_atom_intern(MOZILLA_COMMAND_PROP, 0); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
197 | if (!XA_MOZILLA_RESPONSE) |
| 1 | 198 | XA_MOZILLA_RESPONSE = gdk_atom_intern(MOZILLA_RESPONSE_PROP, 0); |
| 199 | } | |
| 200 | ||
| 201 | static GdkWindow *mozilla_remote_find_window() | |
| 202 | { | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
203 | int i; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
204 | Window root = VirtualRootWindowOfScreen(DefaultScreenOfDisplay(gdk_display)); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
205 | Window root2, parent, *kids; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
206 | unsigned int nkids; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
207 | Window result = 0; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
208 | Window tenative = 0; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
209 | unsigned char *tenative_version = 0; |
| 1 | 210 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
211 | if (!XQueryTree(gdk_display, root, &root2, &parent, &kids, &nkids)) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
212 | debug_printf("%s: XQueryTree failed on display %s\n", progname, |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
213 | DisplayString(gdk_display)); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
214 | return NULL; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
215 | } |
| 1 | 216 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
217 | /* root != root2 is possible with virtual root WMs. */ |
| 1 | 218 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
219 | if (!(kids && nkids)) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
220 | debug_printf("%s: root window has no children on display %s\n", |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
221 | progname, DisplayString(gdk_display)); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
222 | return NULL; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
223 | } |
| 1 | 224 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
225 | for (i = nkids - 1; i >= 0; i--) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
226 | Atom type; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
227 | int format; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
228 | unsigned long nitems, bytesafter; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
229 | unsigned char *version = 0; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
230 | Window w = GClientWindow(gdk_display, kids[i]); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
231 | int status = XGetWindowProperty(gdk_display, w, XA_MOZILLA_VERSION, |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
232 | 0, (65536 / sizeof(long)), |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
233 | False, XA_STRING, |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
234 | &type, &format, &nitems, &bytesafter, |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
235 | &version); |
| 26 | 236 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
237 | if (!version) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
238 | continue; |
| 26 | 239 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
240 | if (strcmp((char *)version, expected_mozilla_version) && !tenative) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
241 | tenative = w; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
242 | tenative_version = version; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
243 | continue; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
244 | } |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
245 | XFree(version); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
246 | if (status == Success && type != None) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
247 | result = w; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
248 | break; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
249 | } |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
250 | } |
| 1 | 251 | |
| 26 | 252 | XFree(kids); |
| 253 | ||
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
254 | if (result && tenative) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
255 | debug_printf("%s: warning: both version %s (0x%x) and version\n" |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
256 | "\t%s (0x%x) are running. Using version %s.\n", |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
257 | progname, tenative_version, (unsigned int)tenative, |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
258 | expected_mozilla_version, (unsigned int)result, expected_mozilla_version); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
259 | XFree(tenative_version); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
260 | return gdk_window_foreign_new(result); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
261 | } else if (tenative) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
262 | debug_printf("%s: warning: expected version %s but found version\n" |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
263 | "\t%s (0x%x) instead.\n", |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
264 | progname, expected_mozilla_version, |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
265 | tenative_version, (unsigned int)tenative); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
266 | XFree(tenative_version); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
267 | return gdk_window_foreign_new(tenative); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
268 | } else if (result) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
269 | return gdk_window_foreign_new(result); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
270 | } else { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
271 | debug_printf("%s: not running on display %s\n", progname, DisplayString(gdk_display)); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
272 | return NULL; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
273 | } |
| 1 | 274 | } |
| 275 | ||
| 276 | ||
| 277 | static char *lock_data = 0; | |
| 278 | ||
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
279 | static void mozilla_remote_obtain_lock(GdkWindow * window) |
| 1 | 280 | { |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
281 | Bool locked = False; |
| 1 | 282 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
283 | if (!lock_data) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
284 | lock_data = (char *)g_malloc(255); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
285 | sprintf(lock_data, "pid%d@", getpid()); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
286 | if (gethostname(lock_data + strlen(lock_data), 100)) { |
| 1 | 287 | return; |
| 288 | } | |
| 289 | } | |
| 290 | ||
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
291 | do { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
292 | int result; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
293 | GdkAtom actual_type; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
294 | gint actual_format; |
| 1 | 295 | gint nitems; |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
296 | unsigned char *data = 0; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
297 | |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
298 | result = gdk_property_get(window, XA_MOZILLA_LOCK, |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
299 | XA_STRING, 0, |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
300 | (65536 / sizeof(long)), 0, |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
301 | &actual_type, &actual_format, &nitems, &data); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
302 | if (result != Success || actual_type == None) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
303 | /* It's not now locked - lock it. */ |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
304 | debug_printf("%s: (writing " MOZILLA_LOCK_PROP |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
305 | " \"%s\" to 0x%x)\n", progname, lock_data, (unsigned int)window); |
| 1 | 306 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
307 | gdk_property_change(window, XA_MOZILLA_LOCK, XA_STRING, |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
308 | 8, PropModeReplace, |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
309 | (unsigned char *)lock_data, strlen(lock_data)); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
310 | locked = True; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
311 | } |
| 1 | 312 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
313 | if (!locked) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
314 | /* Then just fuck it. */ |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
315 | if (data) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
316 | g_free(data); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
317 | return; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
318 | } |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
319 | if (data) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
320 | g_free(data); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
321 | } while (!locked); |
| 1 | 322 | } |
| 323 | ||
| 324 | ||
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
325 | static void mozilla_remote_free_lock(GdkWindow * window) |
| 1 | 326 | { |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
327 | int result = 0; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
328 | GdkAtom actual_type; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
329 | gint actual_format; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
330 | gint nitems; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
331 | unsigned char *data = 0; |
| 1 | 332 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
333 | debug_printf("%s: (deleting " MOZILLA_LOCK_PROP |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
334 | " \"%s\" from 0x%x)\n", progname, lock_data, (unsigned int)window); |
| 1 | 335 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
336 | result = gdk_property_get(window, XA_MOZILLA_LOCK, XA_STRING, |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
337 | 0, (65536 / sizeof(long)), |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
338 | 1, &actual_type, &actual_format, &nitems, &data); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
339 | if (result != Success) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
340 | debug_printf("%s: unable to read and delete " MOZILLA_LOCK_PROP " property\n", progname); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
341 | return; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
342 | } else if (!data || !*data) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
343 | debug_printf("%s: invalid data on " MOZILLA_LOCK_PROP |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
344 | " of window 0x%x.\n", progname, (unsigned int)window); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
345 | return; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
346 | } else if (strcmp((char *)data, lock_data)) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
347 | debug_printf("%s: " MOZILLA_LOCK_PROP |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
348 | " was stolen! Expected \"%s\", saw \"%s\"!\n", progname, lock_data, data); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
349 | return; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
350 | } |
| 1 | 351 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
352 | if (data) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
353 | g_free(data); |
| 1 | 354 | } |
| 355 | ||
| 356 | ||
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
357 | static int mozilla_remote_command(GdkWindow * window, const char *command, Bool raise_p) |
| 1 | 358 | { |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
359 | int result = 0; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
360 | Bool done = False; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
361 | char *new_command = 0; |
| 1 | 362 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
363 | /* The -noraise option is implemented by passing a "noraise" argument |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
364 | to each command to which it should apply. |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
365 | */ |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
366 | if (!raise_p) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
367 | char *close; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
368 | new_command = g_malloc(strlen(command) + 20); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
369 | strcpy(new_command, command); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
370 | close = strrchr(new_command, ')'); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
371 | if (close) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
372 | strcpy(close, ", noraise)"); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
373 | else |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
374 | strcat(new_command, "(noraise)"); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
375 | command = new_command; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
376 | } |
| 1 | 377 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
378 | debug_printf("%s: (writing " MOZILLA_COMMAND_PROP " \"%s\" to 0x%x)\n", |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
379 | progname, command, (unsigned int)window); |
| 1 | 380 | |
| 381 | gdk_property_change(window, XA_MOZILLA_COMMAND, XA_STRING, 8, | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
382 | GDK_PROP_MODE_REPLACE, (unsigned char *)command, strlen(command)); |
| 1 | 383 | |
| 384 | while (!done) { | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
385 | GdkEvent *event; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
386 | |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
387 | event = gdk_event_get(); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
388 | |
| 1 | 389 | if (!event) |
| 390 | continue; | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
391 | |
| 1 | 392 | if (event->any.window != window) { |
| 393 | gtk_main_do_event(event); | |
| 394 | continue; | |
| 395 | } | |
| 396 | ||
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
397 | if (event->type == GDK_DESTROY && event->any.window == window) { |
| 1 | 398 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
399 | /* Print to warn user... */ |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
400 | debug_printf("%s: window 0x%x was destroyed.\n", progname, (unsigned int)window); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
401 | result = 6; |
|
1267
c1931e2dd01d
[gaim-migrate @ 1277]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
402 | done = True; |
| 1 | 403 | } else if (event->type == GDK_PROPERTY_NOTIFY && |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
404 | event->property.state == GDK_PROPERTY_NEW_VALUE && |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
405 | event->property.window == window && |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
406 | event->property.atom == XA_MOZILLA_RESPONSE) { |
| 1 | 407 | GdkAtom actual_type; |
| 408 | gint actual_format, nitems; | |
| 409 | unsigned char *data = 0; | |
| 410 | ||
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
411 | result = gdk_property_get(window, XA_MOZILLA_RESPONSE, |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
412 | XA_STRING, 0, |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
413 | (65536 / sizeof(long)), |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
414 | 1, &actual_type, &actual_format, &nitems, &data); |
| 1 | 415 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
416 | |
| 1 | 417 | if (result == Success && data && *data) { |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
418 | debug_printf("%s: (server sent " MOZILLA_RESPONSE_PROP |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
419 | " \"%s\" to 0x%x.)\n", |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
420 | progname, data, (unsigned int)window); |
| 1 | 421 | } |
| 422 | ||
| 423 | if (result != Success) { | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
424 | debug_printf("%s: failed reading " MOZILLA_RESPONSE_PROP |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
425 | " from window 0x%0x.\n", progname, (unsigned int)window); |
| 1 | 426 | result = 6; |
| 427 | done = True; | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
428 | } else if (!data || strlen((char *)data) < 5) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
429 | debug_printf("%s: invalid data on " MOZILLA_RESPONSE_PROP |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
430 | " property of window 0x%0x.\n", |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
431 | progname, (unsigned int)window); |
| 1 | 432 | result = 6; |
| 433 | done = True; | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
434 | } else if (*data == '1') { /* positive preliminary reply */ |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
435 | debug_printf("%s: %s\n", progname, data + 4); |
| 1 | 436 | /* keep going */ |
| 437 | done = False; | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
438 | } else if (!strncmp((char *)data, "200", 3)) { |
| 1 | 439 | result = 0; |
| 440 | done = True; | |
| 441 | } else if (*data == '2') { | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
442 | debug_printf("%s: %s\n", progname, data + 4); |
| 1 | 443 | result = 0; |
| 444 | done = True; | |
| 445 | } else if (*data == '3') { | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
446 | debug_printf("%s: internal error: " |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
447 | "server wants more information? (%s)\n", progname, data); |
| 1 | 448 | result = 3; |
| 449 | done = True; | |
| 450 | } else if (*data == '4' || *data == '5') { | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
451 | debug_printf("%s: %s\n", progname, data + 4); |
| 1 | 452 | result = (*data - '0'); |
| 453 | done = True; | |
| 454 | } else { | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
455 | debug_printf("%s: unrecognised " MOZILLA_RESPONSE_PROP |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
456 | " from window 0x%x: %s\n", |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
457 | progname, (unsigned int)window, data); |
| 1 | 458 | result = 6; |
| 459 | done = True; | |
| 460 | } | |
| 461 | ||
| 462 | if (data) | |
| 463 | g_free(data); | |
|
2372
c24942700dfd
[gaim-migrate @ 2385]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2099
diff
changeset
|
464 | } else if (event->type == GDK_PROPERTY_NOTIFY && |
|
c24942700dfd
[gaim-migrate @ 2385]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2099
diff
changeset
|
465 | event->property.window == window && |
|
c24942700dfd
[gaim-migrate @ 2385]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2099
diff
changeset
|
466 | event->property.state == GDK_PROPERTY_DELETE && |
|
c24942700dfd
[gaim-migrate @ 2385]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2099
diff
changeset
|
467 | event->property.atom == XA_MOZILLA_COMMAND) { |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
468 | debug_printf("%s: (server 0x%x has accepted " |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
469 | MOZILLA_COMMAND_PROP ".)\n", progname, (unsigned int)window); |
| 1 | 470 | } |
| 471 | gdk_event_free(event); | |
| 472 | } | |
| 473 | ||
| 474 | if (new_command) | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
475 | g_free(new_command); |
| 1 | 476 | |
| 477 | return result; | |
| 478 | } | |
| 479 | ||
| 480 | ||
| 481 | gint check_netscape(char *msg) | |
| 482 | { | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
483 | int status; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
484 | GdkWindow *window; |
| 1 | 485 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
486 | mozilla_remote_init_atoms(); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
487 | window = mozilla_remote_find_window(); |
| 1 | 488 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
489 | if (window && (((GdkWindowPrivate *) window)->destroyed == FALSE)) { |
| 1 | 490 | |
|
1944
d518ec7a4020
[gaim-migrate @ 1954]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1267
diff
changeset
|
491 | XSelectInput(gdk_display, GDK_WINDOW_XWINDOW(window), |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
492 | (PropertyChangeMask | StructureNotifyMask)); |
| 1 | 493 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
494 | |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
495 | mozilla_remote_obtain_lock(window); |
| 1 | 496 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
497 | status = mozilla_remote_command(window, msg, False); |
| 1 | 498 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
499 | if (status != 6) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
500 | mozilla_remote_free_lock(window); |
| 1 | 501 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
502 | netscape_lock = 0; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
503 | |
| 1 | 504 | g_free(msg); |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
505 | return FALSE; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
506 | } else |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
507 | return TRUE; |
| 1 | 508 | } |
| 509 | ||
| 510 | ||
| 511 | static void netscape_command(char *command) | |
| 512 | { | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
513 | int status; |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
514 | pid_t pid; |
| 1 | 515 | GdkWindow *window; |
| 516 | ||
| 517 | if (netscape_lock) | |
| 518 | return; | |
| 519 | ||
| 520 | netscape_lock = 1; | |
| 521 | ||
| 522 | ||
| 523 | ||
| 524 | mozilla_remote_init_atoms(); | |
| 525 | window = mozilla_remote_find_window(); | |
| 526 | ||
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
527 | if (window && (((GdkWindowPrivate *) window)->destroyed == FALSE)) { |
| 1 | 528 | |
|
1944
d518ec7a4020
[gaim-migrate @ 1954]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1267
diff
changeset
|
529 | XSelectInput(gdk_display, GDK_WINDOW_XWINDOW(window), |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
530 | (PropertyChangeMask | StructureNotifyMask)); |
| 1 | 531 | |
| 532 | mozilla_remote_obtain_lock(window); | |
| 533 | ||
| 534 | status = mozilla_remote_command(window, command, False); | |
| 535 | ||
| 536 | if (status != 6) | |
| 537 | mozilla_remote_free_lock(window); | |
| 538 | ||
| 539 | netscape_lock = 0; | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
540 | |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
541 | gdk_window_destroy(window); |
| 1 | 542 | } else { |
| 543 | pid = fork(); | |
| 544 | if (pid == 0) { | |
| 545 | char *args[2]; | |
| 546 | int e; | |
| 547 | ||
| 548 | args[0] = g_strdup("netscape"); | |
| 549 | args[1] = NULL; | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
550 | e = execvp(args[0], args); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
551 | printf("Hello%d\n", getppid()); |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
552 | |
| 1 | 553 | _exit(0); |
| 554 | } else { | |
| 555 | char *tmp = g_strdup(command); | |
| 556 | gtk_timeout_add(200, (GtkFunction)check_netscape, tmp); | |
| 557 | } | |
| 558 | } | |
| 559 | ||
| 560 | } | |
| 561 | ||
| 3393 | 562 | #if !GTK_CHECK_VERSION(1,3,0) |
| 563 | /* From Glib 2.0 */ | |
| 564 | /** | |
| 565 | * g_shell_quote: | |
| 566 | * @unquoted_string: a literal string | |
| 567 | * | |
| 568 | * Quotes a string so that the shell (/bin/sh) will interpret the | |
| 569 | * quoted string to mean @unquoted_string. If you pass a filename to | |
| 570 | * the shell, for example, you should first quote it with this | |
| 571 | * function. The return value must be freed with g_free(). The | |
| 572 | * quoting style used is undefined (single or double quotes may be | |
| 573 | * used). | |
| 574 | * | |
| 575 | * Return value: quoted string | |
| 576 | **/ | |
| 577 | gchar* | |
| 578 | g_shell_quote (const gchar *unquoted_string) | |
| 579 | { | |
| 580 | /* We always use single quotes, because the algorithm is cheesier. | |
| 581 | * We could use double if we felt like it, that might be more | |
| 582 | * human-readable. | |
| 583 | */ | |
| 584 | const gchar *p; | |
| 585 | GString *dest; | |
| 586 | ||
| 587 | g_return_val_if_fail (unquoted_string != NULL, NULL); | |
| 588 | ||
| 589 | dest = g_string_new ("'"); | |
| 590 | ||
| 591 | p = unquoted_string; | |
| 592 | ||
| 593 | /* could speed this up a lot by appending chunks of text at a | |
| 594 | * time. | |
| 595 | */ | |
| 596 | while (*p) | |
| 597 | { | |
| 598 | /* Replace literal ' with a close ', a \', and a open ' */ | |
| 599 | if (*p == '\'') | |
| 600 | g_string_append (dest, "'\\''"); | |
| 601 | else | |
| 602 | g_string_append_c (dest, *p); | |
| 603 | ++p; | |
| 604 | } | |
| 605 | /* close the quote */ | |
| 606 | g_string_append_c (dest, '\''); | |
| 607 | ||
| 608 | p = dest->str; | |
| 609 | g_string_free (dest, FALSE); | |
| 610 | return p; | |
| 611 | } | |
| 612 | #endif | |
| 613 | ||
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
614 | void open_url(GtkWidget *w, char *url) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
615 | { |
| 733 | 616 | |
| 1 | 617 | if (web_browser == BROWSER_NETSCAPE) { |
|
2828
a7dbfb5e54a4
[gaim-migrate @ 2841]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2827
diff
changeset
|
618 | char *command; |
| 1 | 619 | |
|
2827
e3d10df95e74
[gaim-migrate @ 2840]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2781
diff
changeset
|
620 | if (misc_options & OPT_MISC_BROWSER_POPUP) |
|
2828
a7dbfb5e54a4
[gaim-migrate @ 2841]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2827
diff
changeset
|
621 | command = g_strdup_printf("OpenURL(%s, new-window)", url); |
|
2827
e3d10df95e74
[gaim-migrate @ 2840]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2781
diff
changeset
|
622 | else |
|
2828
a7dbfb5e54a4
[gaim-migrate @ 2841]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2827
diff
changeset
|
623 | command = g_strdup_printf("OpenURL(%s)", url); |
| 1 | 624 | |
| 625 | netscape_command(command); | |
| 626 | g_free(command); | |
|
2827
e3d10df95e74
[gaim-migrate @ 2840]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2781
diff
changeset
|
627 | #ifdef USE_GNOME |
|
e3d10df95e74
[gaim-migrate @ 2840]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2781
diff
changeset
|
628 | } else if (web_browser == BROWSER_GNOME) { |
|
e3d10df95e74
[gaim-migrate @ 2840]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2781
diff
changeset
|
629 | gnome_url_show(url); |
|
e3d10df95e74
[gaim-migrate @ 2840]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2781
diff
changeset
|
630 | #endif /* USE_GNOME */ |
|
e3d10df95e74
[gaim-migrate @ 2840]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2781
diff
changeset
|
631 | } else { |
| 2566 | 632 | pid_t pid; |
| 633 | ||
| 634 | pid = fork(); | |
| 635 | ||
| 636 | if (pid == 0) { | |
| 637 | char *args[4]; | |
|
2827
e3d10df95e74
[gaim-migrate @ 2840]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2781
diff
changeset
|
638 | char command[1024]; |
| 3417 | 639 | char *quoted = NULL; |
| 640 | ||
|
2827
e3d10df95e74
[gaim-migrate @ 2840]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2781
diff
changeset
|
641 | if (web_browser == BROWSER_OPERA) { |
| 3320 | 642 | args[0] = "opera"; |
| 643 | args[1] = "-newwindow"; | |
|
2827
e3d10df95e74
[gaim-migrate @ 2840]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2781
diff
changeset
|
644 | args[2] = url; |
|
e3d10df95e74
[gaim-migrate @ 2840]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2781
diff
changeset
|
645 | args[3] = NULL; |
| 3320 | 646 | } else if (web_browser == BROWSER_KONQ) { |
| 647 | args[0] = "kfmclient"; | |
| 648 | args[1] = "openURL"; | |
|
2827
e3d10df95e74
[gaim-migrate @ 2840]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2781
diff
changeset
|
649 | args[2] = url; |
|
e3d10df95e74
[gaim-migrate @ 2840]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2781
diff
changeset
|
650 | args[3] = NULL; |
|
e3d10df95e74
[gaim-migrate @ 2840]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2781
diff
changeset
|
651 | } else if (web_browser == BROWSER_GALEON) { |
| 3320 | 652 | args[0] = "galeon"; |
| 653 | if (misc_options & OPT_MISC_BROWSER_POPUP) { | |
| 654 | args[1] = "-w"; | |
| 655 | args[2] = url; | |
| 656 | args[3] = NULL; | |
| 657 | } else { | |
| 658 | args[1] = url; | |
| 659 | args[2] = NULL; | |
| 660 | } | |
| 661 | } else if (web_browser == BROWSER_MOZILLA) { | |
| 662 | args[0] = "mozilla"; | |
|
2827
e3d10df95e74
[gaim-migrate @ 2840]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2781
diff
changeset
|
663 | args[1] = url; |
|
e3d10df95e74
[gaim-migrate @ 2840]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2781
diff
changeset
|
664 | args[2] = NULL; |
|
e3d10df95e74
[gaim-migrate @ 2840]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2781
diff
changeset
|
665 | } else if (web_browser == BROWSER_MANUAL) { |
| 3393 | 666 | g_snprintf(command, sizeof(command), web_command, quoted); |
| 3417 | 667 | quoted = g_shell_quote(command); |
|
2827
e3d10df95e74
[gaim-migrate @ 2840]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2781
diff
changeset
|
668 | args[0] = "sh"; |
|
e3d10df95e74
[gaim-migrate @ 2840]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2781
diff
changeset
|
669 | args[1] = "-c"; |
| 3417 | 670 | args[2] = quoted; |
|
2827
e3d10df95e74
[gaim-migrate @ 2840]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2781
diff
changeset
|
671 | args[3] = NULL; |
|
e3d10df95e74
[gaim-migrate @ 2840]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2781
diff
changeset
|
672 | } |
| 2566 | 673 | |
| 674 | execvp(args[0], args); | |
| 3417 | 675 | if (quoted) |
| 676 | g_free(quoted); | |
| 2566 | 677 | _exit(0); |
| 678 | } | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
679 | } |
| 1 | 680 | } |
| 681 | ||
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
682 | void add_bookmark(GtkWidget *w, char *url) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
683 | { |
| 1 | 684 | if (web_browser == BROWSER_NETSCAPE) { |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
685 | char *command = g_malloc(1024); |
| 1 | 686 | |
| 687 | g_snprintf(command, 1024, "AddBookmark(%s)", url); | |
| 688 | ||
| 689 | netscape_command(command); | |
| 690 | g_free(command); | |
| 691 | } | |
| 692 | } | |
| 693 | ||
| 694 | #else | |
| 695 | ||
| 696 | /* Sooner or later, I shall support Windows clicking! */ | |
| 697 | ||
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
698 | void add_bookmark(GtkWidget *w, char *url) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
699 | { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
700 | } |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
701 | void open_url_nw(GtkWidget *w, char *url) |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
702 | { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1181
diff
changeset
|
703 | } |
| 1 | 704 | |
| 705 | ||
|
2372
c24942700dfd
[gaim-migrate @ 2385]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2099
diff
changeset
|
706 | #endif /* _WIN32 */ |