aboutsummaryrefslogtreecommitdiffstats
path: root/lib-src/emacsclient.c
diff options
context:
space:
mode:
authorKaroly Lorentey2007-01-01 17:38:32 +0000
committerKaroly Lorentey2007-01-01 17:38:32 +0000
commit65e86587ab836aaa86b12ce30b219bcb4fcbaa06 (patch)
tree7e13feee7387635f52df3613cf1bba4414781aab /lib-src/emacsclient.c
parent8c778e28bcf16b4baef6400a124ec2403941e940 (diff)
parent1fc8c92b50100da709c94a0faa47deed5603634f (diff)
downloademacs-65e86587ab836aaa86b12ce30b219bcb4fcbaa06.tar.gz
emacs-65e86587ab836aaa86b12ce30b219bcb4fcbaa06.zip
Merged from emacs@sv.gnu.org.
Patches applied: * emacs@sv.gnu.org/emacs--devo--0--patch-536 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-537 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-538 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-539 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-540 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-541 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-542 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-543 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-544 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-545 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-546 Update from erc--emacs--22 * emacs@sv.gnu.org/emacs--devo--0--patch-547 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-548 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-549 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-550 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-551 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-552 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-553 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-554 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-555 erc-iswitchb: Temporarily enable iswitchb mode * emacs@sv.gnu.org/emacs--devo--0--patch-556 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-557 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-558 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-559 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-560 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-561 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-562 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-563 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-564 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-565 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-566 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-567 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-568 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-569 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-570 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-571 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-572 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-573 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-574 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-575 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-576 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-577 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-578 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-579 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-580 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-581 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-582 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-583 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-584 Fix admin/quick-install-emacs to work with recent versions of autoconf * emacs@sv.gnu.org/gnus--rel--5.10--patch-171 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-172 Merge from emacs--devo--0 * emacs@sv.gnu.org/gnus--rel--5.10--patch-173 Merge from emacs--devo--0 * emacs@sv.gnu.org/gnus--rel--5.10--patch-174 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-175 Update from CVS: lisp/legacy-gnus-agent.el: Add Copyright notice. * emacs@sv.gnu.org/gnus--rel--5.10--patch-176 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-177 Merge from emacs--devo--0 * emacs@sv.gnu.org/gnus--rel--5.10--patch-178 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-179 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-180 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-181 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-182 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-183 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-184 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-185 Merge from emacs--devo--0 git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-590
Diffstat (limited to 'lib-src/emacsclient.c')
-rw-r--r--lib-src/emacsclient.c127
1 files changed, 100 insertions, 27 deletions
diff --git a/lib-src/emacsclient.c b/lib-src/emacsclient.c
index 64a0e00d5b9..f765f02b426 100644
--- a/lib-src/emacsclient.c
+++ b/lib-src/emacsclient.c
@@ -301,16 +301,15 @@ get_current_dir_name ()
301/* Message functions. */ 301/* Message functions. */
302 302
303#ifdef WINDOWSNT 303#ifdef WINDOWSNT
304/* I first tried to check for STDOUT. The check did not work,
305 I get a valid handle also in nonconsole apps.
306 Instead I test for console title, which seems to work. */
307int 304int
308w32_window_app() 305w32_window_app ()
309{ 306{
310 static int window_app = -1; 307 static int window_app = -1;
311 char szTitle[MAX_PATH]; 308 char szTitle[MAX_PATH];
312 309
313 if (window_app < 0) 310 if (window_app < 0)
311 /* Checking for STDOUT does not work; it's a valid handle also in
312 nonconsole apps. Testing for the console title seems to work. */
314 window_app = (GetConsoleTitleA (szTitle, MAX_PATH) == 0); 313 window_app = (GetConsoleTitleA (szTitle, MAX_PATH) == 0);
315 314
316 return window_app; 315 return window_app;
@@ -488,9 +487,7 @@ fail (void)
488 if (alternate_editor) 487 if (alternate_editor)
489 { 488 {
490 int i = optind - 1; 489 int i = optind - 1;
491#ifdef WINDOWSNT 490
492 main_argv[i] = (char *)alternate_editor;
493#endif
494 execvp (alternate_editor, main_argv + i); 491 execvp (alternate_editor, main_argv + i);
495 message (TRUE, "%s: error executing alternate editor \"%s\"\n", 492 message (TRUE, "%s: error executing alternate editor \"%s\"\n",
496 progname, alternate_editor); 493 progname, alternate_editor);
@@ -683,7 +680,7 @@ file_name_absolute_p (filename)
683} 680}
684 681
685#ifdef WINDOWSNT 682#ifdef WINDOWSNT
686/* Wrapper to make WSACleanup a cdecl, as required by atexit(). */ 683/* Wrapper to make WSACleanup a cdecl, as required by atexit. */
687void 684void
688__cdecl close_winsock () 685__cdecl close_winsock ()
689{ 686{
@@ -707,10 +704,47 @@ initialize_sockets ()
707#endif /* WINDOWSNT */ 704#endif /* WINDOWSNT */
708 705
709 706
707#ifdef WINDOWSNT
708
709/*
710 execvp wrapper for Windows. Quotes arguments with embedded spaces.
711
712 This is necessary due to the broken implementation of exec* routines in
713 the Microsoft libraries: they concatenate the arguments together without
714 quoting special characters, and pass the result to CreateProcess, with
715 predictably bad results. By contrast, Posix execvp passes the arguments
716 directly into the argv array of the child process.
717*/
718int
719w32_execvp (path, argv)
720 char *path;
721 char **argv;
722{
723 int i;
724
725 /* Required to allow a .BAT script as alternate editor. */
726 argv[0] = (char *) alternate_editor;
727
728 for (i = 0; argv[i]; i++)
729 if (strchr (argv[i], ' '))
730 {
731 char *quoted = alloca (strlen (argv[i]) + 3);
732 sprintf (quoted, "\"%s\"", argv[i]);
733 argv[i] = quoted;
734 }
735
736 return execvp (path, argv);
737}
738
739#undef execvp
740#define execvp w32_execvp
741
742#endif /* WINDOWSNT */
743
710/* 744/*
711 * Read the information needed to set up a TCP comm channel with 745 * Read the information needed to set up a TCP comm channel with
712 * the Emacs server: host, port, pid and authentication string. 746 * the Emacs server: host, port, pid and authentication string.
713*/ 747 */
714int 748int
715get_server_config (server, authentication) 749get_server_config (server, authentication)
716 struct sockaddr_in *server; 750 struct sockaddr_in *server;
@@ -1145,6 +1179,62 @@ set_socket ()
1145 exit (EXIT_FAILURE); 1179 exit (EXIT_FAILURE);
1146} 1180}
1147 1181
1182#ifdef WINDOWSNT
1183FARPROC set_fg; /* Pointer to AllowSetForegroundWindow. */
1184FARPROC get_wc; /* Pointer to RealGetWindowClassA. */
1185
1186BOOL CALLBACK
1187w32_find_emacs_process (hWnd, lParam)
1188 HWND hWnd;
1189 LPARAM lParam;
1190{
1191 DWORD pid;
1192 char class[6];
1193
1194 /* Reject any window not of class "Emacs". */
1195 if (! get_wc (hWnd, class, sizeof (class))
1196 || strcmp (class, "Emacs"))
1197 return TRUE;
1198
1199 /* We only need the process id, not the thread id. */
1200 (void) GetWindowThreadProcessId (hWnd, &pid);
1201
1202 /* Not the one we're looking for. */
1203 if (pid != (DWORD) emacs_pid) return TRUE;
1204
1205 /* OK, let's raise it. */
1206 set_fg (emacs_pid);
1207
1208 /* Stop enumeration. */
1209 return FALSE;
1210}
1211
1212/*
1213 * Search for a window of class "Emacs" and owned by a process with
1214 * process id = emacs_pid. If found, allow it to grab the focus.
1215 */
1216void
1217w32_give_focus ()
1218{
1219 HMODULE hUser32;
1220
1221 /* It should'nt happen when dealing with TCP sockets. */
1222 if (!emacs_pid) return;
1223
1224 if (!(hUser32 = LoadLibrary ("user32.dll"))) return;
1225
1226 /* Modern Windows restrict which processes can set the foreground window.
1227 emacsclient can allow Emacs to grab the focus by calling the function
1228 AllowSetForegroundWindow. Unfortunately, older Windows (W95, W98 and
1229 NT) lack this function, so we have to check its availability. */
1230 if ((set_fg = GetProcAddress (hUser32, "AllowSetForegroundWindow"))
1231 && (get_wc = GetProcAddress (hUser32, "RealGetWindowClassA")))
1232 EnumWindows (w32_find_emacs_process, (LPARAM) 0);
1233
1234 FreeLibrary (hUser32);
1235}
1236#endif
1237
1148int 1238int
1149main (argc, argv) 1239main (argc, argv)
1150 int argc; 1240 int argc;
@@ -1184,24 +1274,7 @@ main (argc, argv)
1184 } 1274 }
1185 1275
1186#ifdef WINDOWSNT 1276#ifdef WINDOWSNT
1187 /* 1277 w32_give_focus ();
1188 Modern Windows restrict which processes can set the foreground window.
1189 emacsclient can allow Emacs to grab the focus by calling the function
1190 AllowSetForegroundWindow(). Unfortunately, older Windows (W95, W98
1191 and NT) lack this function, so we have to check its availability.
1192 */
1193 if (emacs_pid)
1194 {
1195 HMODULE hUser32;
1196
1197 if (hUser32 = LoadLibrary ("user32.dll"))
1198 {
1199 FARPROC set_fg;
1200 if (set_fg = GetProcAddress (hUser32, "AllowSetForegroundWindow"))
1201 set_fg (emacs_pid);
1202 FreeLibrary (hUser32);
1203 }
1204 }
1205#endif 1278#endif
1206 1279
1207 /* First of all, send our version number for verification. */ 1280 /* First of all, send our version number for verification. */