/* Client process that communicates with GNU Emacs acting as server.
-Copyright (C) 1986-1987, 1994, 1999-2015 Free Software Foundation, Inc.
+Copyright (C) 1986-1987, 1994, 1999-2016 Free Software Foundation, Inc.
This file is part of GNU Emacs.
GNU Emacs is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
# define CLOSE_SOCKET closesocket
# define INITIALIZE() (initialize_sockets ())
-char *w32_getenv (char *);
+char *w32_getenv (const char *);
#define egetenv(VAR) w32_getenv(VAR)
#else /* !WINDOWSNT */
/* Name used to invoke this program. */
const char *progname;
-/* The second argument to main. */
+/* The second argument to main. */
char **main_argv;
/* Nonzero means don't wait for a response from Emacs. --no-wait. */
int nowait = 0;
-/* Nonzero means don't print messages for successful operations. --quiet. */
+/* Nonzero means don't print messages for successful operations. --quiet. */
int quiet = 0;
/* Nonzero means args are expressions to be evaluated. --eval. */
/* The parent window ID, if we are opening a frame via XEmbed. */
char *parent_id = NULL;
-/* Nonzero means open a new Emacs frame on the current terminal. */
+/* Nonzero means open a new Emacs frame on the current terminal. */
int tty = 0;
/* If non-NULL, the name of an editor to fallback to if the server
int emacs_pid = 0;
/* If non-NULL, a string that should form a frame parameter alist to
- be used for the new frame */
+ be used for the new frame. */
const char *frame_parameters = NULL;
static _Noreturn void print_help_and_exit (void);
#ifdef WINDOWSNT
/* Like strdup but get a fatal error if memory is exhausted. */
+char *xstrdup (const char *);
char *
xstrdup (const char *s)
#define REG_ROOT "SOFTWARE\\GNU\\Emacs"
+char *w32_get_resource (HKEY, const char *, LPDWORD);
+
/* Retrieve an environment variable from the Emacs subkeys of the registry.
Return NULL if the variable was not found, or it was empty.
This code is based on w32_get_resource (w32.c). */
char *
-w32_get_resource (HKEY predefined, char *key, LPDWORD type)
+w32_get_resource (HKEY predefined, const char *key, LPDWORD type)
{
HKEY hrootkey = NULL;
char *result = NULL;
{
result = (char *) xmalloc (cbData);
- if ((RegQueryValueEx (hrootkey, key, NULL, type, result, &cbData) != ERROR_SUCCESS)
+ if ((RegQueryValueEx (hrootkey, key, NULL, type, (LPBYTE)result, &cbData) != ERROR_SUCCESS)
|| (*result == 0))
{
free (result);
environment variables in the registry if they don't appear in the
environment. */
char *
-w32_getenv (char *envvar)
+w32_getenv (const char *envvar)
{
char *value;
DWORD dwType;
return NULL;
}
+int w32_window_app (void);
int
w32_window_app (void)
predictably bad results. By contrast, POSIX execvp passes the arguments
directly into the argv array of the child process. */
+int w32_execvp (const char *, char **);
+extern int execvp (const char*, char **);
+
int
w32_execvp (const char *path, char **argv)
{
int i;
- extern int execvp (const char*, char **);
/* Required to allow a .BAT script as alternate editor. */
argv[0] = (char *) alternate_editor;
#define execvp w32_execvp
/* Emulation of ttyname for Windows. */
-char *
+const char *ttyname (int);
+const char *
ttyname (int fd)
{
return "CONOUT$";
break;
default:
- message (true, "Try `%s --help' for more information\n", progname);
+ message (true, "Try '%s --help' for more information\n", progname);
exit (EXIT_FAILURE);
break;
}
#ifdef WINDOWSNT
/* Wrapper to make WSACleanup a cdecl, as required by atexit. */
+void __cdecl close_winsock (void);
void __cdecl
close_winsock (void)
{
}
/* Initialize the WinSock2 library. */
+void initialize_sockets (void);
void
initialize_sockets (void)
{
/* Open up an AF_INET socket. */
if ((s = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
{
+ /* Since we have an alternate to try out, this is not an error
+ yet; popping out a modal dialog at this stage would make -a
+ option totally useless for emacsclientw -- the user will
+ still get an error message if the alternate editor fails. */
+#ifdef WINDOWSNT
+ if(!(w32_window_app () && alternate_editor))
+#endif
sock_err_message ("socket");
return INVALID_SOCKET;
}
/* Set up the socket. */
if (connect (s, (struct sockaddr *) &server, sizeof server) < 0)
{
+#ifdef WINDOWSNT
+ if(!(w32_window_app () && alternate_editor))
+#endif
sock_err_message ("connect");
return INVALID_SOCKET;
}
int use_tmpdir = 0;
int saved_errno;
const char *server_name = local_socket_name;
- const char *tmpdir IF_LINT ( = NULL);
+ const char *tmpdir;
char *tmpdir_storage = NULL;
char *socket_name_storage = NULL;
FARPROC set_fg; /* Pointer to AllowSetForegroundWindow. */
FARPROC get_wc; /* Pointer to RealGetWindowClassA. */
+void w32_set_user_model_id (void);
+
void
w32_set_user_model_id (void)
{
HMODULE shell;
- HRESULT (WINAPI * set_user_model) (wchar_t * id);
+ HRESULT (WINAPI * set_user_model) (const wchar_t * id);
/* On Windows 7 and later, we need to set the user model ID
to associate emacsclient launched files with Emacs frames
}
}
+BOOL CALLBACK w32_find_emacs_process (HWND, LPARAM);
+
BOOL CALLBACK
w32_find_emacs_process (HWND hWnd, LPARAM lParam)
{
/* Search for a window of class "Emacs" and owned by a process with
process id = emacs_pid. If found, allow it to grab the focus. */
+void w32_give_focus (void);
void
w32_give_focus (void)
it is ready to accept client connections, by asserting an event
whose name is known to the daemon (defined by nt/inc/ms-w32.h). */
- if (!CreateProcess (NULL, "emacs --daemon", NULL, NULL, FALSE,
+ if (!CreateProcess (NULL, (LPSTR)"emacs --daemon", NULL, NULL, FALSE,
CREATE_NO_WINDOW, NULL, NULL, &si, &pi))
{
char* msg = NULL;
if ((wait_result = WaitForSingleObject (w32_daemon_event, INFINITE))
!= WAIT_OBJECT_0)
{
- char *msg = NULL;
+ const char *msg = NULL;
switch (wait_result)
{
if ((argc - optind < 1) && !eval && current_frame)
{
message (true, "%s: file name or argument required\n"
- "Try `%s --help' for more information\n",
+ "Try '%s --help' for more information\n",
progname, progname);
exit (EXIT_FAILURE);
}