diff options
| author | Karoly Lorentey | 2007-01-01 17:38:32 +0000 |
|---|---|---|
| committer | Karoly Lorentey | 2007-01-01 17:38:32 +0000 |
| commit | 65e86587ab836aaa86b12ce30b219bcb4fcbaa06 (patch) | |
| tree | 7e13feee7387635f52df3613cf1bba4414781aab /lib-src/emacsclient.c | |
| parent | 8c778e28bcf16b4baef6400a124ec2403941e940 (diff) | |
| parent | 1fc8c92b50100da709c94a0faa47deed5603634f (diff) | |
| download | emacs-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.c | 127 |
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. */ | ||
| 307 | int | 304 | int |
| 308 | w32_window_app() | 305 | w32_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. */ |
| 687 | void | 684 | void |
| 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 | */ | ||
| 718 | int | ||
| 719 | w32_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 | */ |
| 714 | int | 748 | int |
| 715 | get_server_config (server, authentication) | 749 | get_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 | ||
| 1183 | FARPROC set_fg; /* Pointer to AllowSetForegroundWindow. */ | ||
| 1184 | FARPROC get_wc; /* Pointer to RealGetWindowClassA. */ | ||
| 1185 | |||
| 1186 | BOOL CALLBACK | ||
| 1187 | w32_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 | */ | ||
| 1216 | void | ||
| 1217 | w32_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 | |||
| 1148 | int | 1238 | int |
| 1149 | main (argc, argv) | 1239 | main (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. */ |