Merge cygw32
This commit is contained in:
commit
7148eba270
58 changed files with 1928 additions and 826 deletions
|
@ -1,3 +1,12 @@
|
|||
2012-10-08 Daniel Colascione <dancol@dancol.org>
|
||||
|
||||
* configure.ac: Add --with-w32 as a window system option. Limit
|
||||
it to Cygwin for now. Integrate w32 into the refactored window
|
||||
system configuration and set TERM_HEADER to w32term.h when w32 is
|
||||
configured.
|
||||
|
||||
(CYGWIN_OBJ): Add cygw32.o.
|
||||
|
||||
2012-10-07 Jan Djärv <jan.h.d@swipnet.se>
|
||||
|
||||
* configure.ac: Check that OSX is 10.4 or newer.
|
||||
|
|
82
configure.ac
82
configure.ac
|
@ -177,6 +177,7 @@ OPTION_DEFAULT_ON([toolkit-scroll-bars],[don't use Motif or Xaw3d scroll bars])
|
|||
OPTION_DEFAULT_ON([xaw3d],[don't use Xaw3d])
|
||||
OPTION_DEFAULT_ON([xim],[don't use X11 XIM])
|
||||
OPTION_DEFAULT_OFF([ns],[use NeXTstep (Cocoa or GNUstep) windowing system])
|
||||
OPTION_DEFAULT_OFF([w32], [use native Windows GUI])
|
||||
|
||||
OPTION_DEFAULT_ON([gpm],[don't use -lgpm for mouse support on a GNU/Linux console])
|
||||
OPTION_DEFAULT_ON([dbus],[don't compile with D-Bus support])
|
||||
|
@ -1534,6 +1535,7 @@ fail;
|
|||
AC_DEFINE(NS_HAVE_NSINTEGER, 1, [Define to 1 if `NSInteger' is defined.])
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_SUBST(TEMACS_LDFLAGS2)
|
||||
|
||||
INSTALL_ARCH_INDEP_EXTRA=install-etc
|
||||
|
@ -1574,6 +1576,30 @@ AC_SUBST(NS_OBJ)
|
|||
AC_SUBST(NS_OBJC_OBJ)
|
||||
AC_SUBST(LIB_STANDARD)
|
||||
|
||||
HAVE_W32=no
|
||||
W32_OBJ=
|
||||
W32_LIBS=
|
||||
if test "${with_w32}" != no; then
|
||||
if test "${opsys}" != "cygwin"; then
|
||||
AC_MSG_ERROR([Using w32 with an autotools build is only supported for Cygwin.])
|
||||
fi
|
||||
AC_CHECK_HEADER([windows.h], [HAVE_W32=yes],
|
||||
[AC_MSG_ERROR([`--with-w32' was specified, but windows.h
|
||||
cannot be found.])])
|
||||
AC_DEFINE(HAVE_NTGUI, 1, [Define to use native Windows GUI.])
|
||||
W32_OBJ="w32fns.o w32menu.o w32reg.o w32font.o w32term.o"
|
||||
W32_OBJ="$W32_OBJ w32xfns.o w32select.o w32uniscribe.o"
|
||||
W32_LIBS="$W32_LIBS -lkernel32 -luser32 -lgdi32 -lole32 -lcomdlg32"
|
||||
W32_LIBS="$W32_LIBS -lusp10 -lcomctl32 -lwinspool"
|
||||
fi
|
||||
AC_SUBST(W32_OBJ)
|
||||
AC_SUBST(W32_LIBS)
|
||||
|
||||
if test "${HAVE_W32}" = "yes"; then
|
||||
window_system=w32
|
||||
with_xft=no
|
||||
fi
|
||||
|
||||
## $window_system is now set to the window system we will
|
||||
## ultimately use.
|
||||
|
||||
|
@ -1610,6 +1636,9 @@ dnl use the toolkit if we have gtk, or X11R5 or newer.
|
|||
nextstep )
|
||||
term_header=nsterm.h
|
||||
;;
|
||||
w32 )
|
||||
term_header=w32term.h
|
||||
;;
|
||||
esac
|
||||
|
||||
if test -n "${term_header}"; then
|
||||
|
@ -2310,6 +2339,9 @@ if test "${with_toolkit_scroll_bars}" != "no"; then
|
|||
elif test "${HAVE_NS}" = "yes"; then
|
||||
AC_DEFINE(USE_TOOLKIT_SCROLL_BARS)
|
||||
USE_TOOLKIT_SCROLL_BARS=yes
|
||||
elif test "${HAVE_W32}" = "yes"; then
|
||||
AC_DEFINE(USE_TOOLKIT_SCROLL_BARS)
|
||||
USE_TOOLKIT_SCROLL_BARS=yes
|
||||
fi
|
||||
fi
|
||||
|
||||
|
@ -2476,6 +2508,41 @@ AC_SUBST(M17N_FLT_LIBS)
|
|||
### Use -lXpm if available, unless `--with-xpm=no'.
|
||||
HAVE_XPM=no
|
||||
LIBXPM=
|
||||
|
||||
if test "${HAVE_W32}" = "yes"; then
|
||||
if test "${with_xpm}" != "no"; then
|
||||
SAVE_CPPFLAGS="$CPPFLAGS"
|
||||
SAVE_LDFLAGS="$LDFLAGS"
|
||||
CPPFLAGS="$CPPFLAGS -I/usr/include/noX"
|
||||
LDFLAGS="$LDFLAGS -L/usr/lib/noX"
|
||||
AC_CHECK_HEADER(X11/xpm.h,
|
||||
[AC_CHECK_LIB(Xpm, XpmReadFileToImage, HAVE_XPM=yes)])
|
||||
if test "${HAVE_XPM}" = "yes"; then
|
||||
AC_MSG_CHECKING(for XpmReturnAllocPixels preprocessor define)
|
||||
AC_EGREP_CPP(no_return_alloc_pixels,
|
||||
[#include "X11/xpm.h"
|
||||
#ifndef XpmReturnAllocPixels
|
||||
no_return_alloc_pixels
|
||||
#endif
|
||||
], HAVE_XPM=no, HAVE_XPM=yes)
|
||||
|
||||
if test "${HAVE_XPM}" = "yes"; then
|
||||
REAL_CPPFLAGS="$REAL_CPPFLAGS -I/usr/include/noX"
|
||||
AC_MSG_RESULT(yes)
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
CPPFLAGS="$SAVE_CPPFLAGS"
|
||||
LDFLAGS="$SAVE_LDFLAGS"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "${HAVE_XPM}" = "yes"; then
|
||||
AC_DEFINE(HAVE_XPM, 1, [Define to 1 if you have the Xpm libary (-lXpm).])
|
||||
LIBXPM=-lXpm
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "${HAVE_X11}" = "yes"; then
|
||||
if test "${with_xpm}" != "no"; then
|
||||
AC_CHECK_HEADER(X11/xpm.h,
|
||||
|
@ -2502,12 +2569,13 @@ no_return_alloc_pixels
|
|||
LIBXPM=-lXpm
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_SUBST(LIBXPM)
|
||||
|
||||
### Use -ljpeg if available, unless `--with-jpeg=no'.
|
||||
HAVE_JPEG=no
|
||||
LIBJPEG=
|
||||
if test "${HAVE_X11}" = "yes"; then
|
||||
if test "${HAVE_X11}" = "yes" || test "${HAVE_W32}" = "yes"; then
|
||||
if test "${with_jpeg}" != "no"; then
|
||||
dnl Checking for jpeglib.h can lose because of a redefinition of
|
||||
dnl HAVE_STDLIB_H.
|
||||
|
@ -2535,7 +2603,7 @@ AC_SUBST(LIBJPEG)
|
|||
### Use -lpng if available, unless `--with-png=no'.
|
||||
HAVE_PNG=no
|
||||
LIBPNG=
|
||||
if test "${HAVE_X11}" = "yes"; then
|
||||
if test "${HAVE_X11}" = "yes" || test "${HAVE_W32}" = "yes"; then
|
||||
if test "${with_png}" != "no"; then
|
||||
# Debian unstable as of July 2003 has multiple libpngs, and puts png.h
|
||||
# in /usr/include/libpng.
|
||||
|
@ -2568,7 +2636,7 @@ AC_SUBST(LIBPNG)
|
|||
### Use -ltiff if available, unless `--with-tiff=no'.
|
||||
HAVE_TIFF=no
|
||||
LIBTIFF=
|
||||
if test "${HAVE_X11}" = "yes"; then
|
||||
if test "${HAVE_X11}" = "yes" || test "${HAVE_W32}" = "yes"; then
|
||||
if test "${with_tiff}" != "no"; then
|
||||
AC_CHECK_HEADER(tiffio.h,
|
||||
[tifflibs="-lz -lm"
|
||||
|
@ -2588,7 +2656,8 @@ AC_SUBST(LIBTIFF)
|
|||
### Use -lgif or -lungif if available, unless `--with-gif=no'.
|
||||
HAVE_GIF=no
|
||||
LIBGIF=
|
||||
if test "${HAVE_X11}" = "yes" && test "${with_gif}" != "no"; then
|
||||
if test "${HAVE_X11}" = "yes" && test "${with_gif}" != "no" \
|
||||
|| test "${HAVE_W32}" = "yes"; then
|
||||
AC_CHECK_HEADER(gif_lib.h,
|
||||
# EGifPutExtensionLast only exists from version libungif-4.1.0b1.
|
||||
# Earlier versions can crash Emacs.
|
||||
|
@ -2670,6 +2739,9 @@ if test "${HAVE_NS}" = "yes"; then
|
|||
OTHER_FILES=ns-app
|
||||
fi
|
||||
|
||||
if test "${HAVE_W32}" = "yes"; then
|
||||
HAVE_MENUS=yes
|
||||
fi
|
||||
|
||||
### Use session management (-lSM -lICE) if available
|
||||
HAVE_X_SM=no
|
||||
|
@ -4205,7 +4277,7 @@ fi
|
|||
AC_SUBST(RALLOC_OBJ)
|
||||
|
||||
if test "$opsys" = "cygwin"; then
|
||||
CYGWIN_OBJ="sheap.o"
|
||||
CYGWIN_OBJ="sheap.o cygw32.o"
|
||||
## Cygwin differs because of its unexec().
|
||||
PRE_ALLOC_OBJ=
|
||||
POST_ALLOC_OBJ=lastfile.o
|
||||
|
|
10
etc/NEWS
10
etc/NEWS
|
@ -78,6 +78,11 @@ directories to the search path. You must add them yourself if you want them.
|
|||
(from the bin and libexec directories, respectively). The former is
|
||||
no longer relevant, the latter is replaced by lisp (in vc-sccs.el).
|
||||
|
||||
---
|
||||
** The native Windows user interface is available for Cygwin. Passing
|
||||
--with-w32 will configure a Cygwin emacs to use the Windows user
|
||||
interface instead of the default, X11.
|
||||
|
||||
|
||||
* Startup Changes in Emacs 24.3
|
||||
|
||||
|
@ -882,6 +887,11 @@ is detected.
|
|||
Emacs now supports mouse highlight, help-echo (in the echo area), and
|
||||
mouse-autoselect-window.
|
||||
|
||||
** Two new functions are available in Cygwin builds of Emacs:
|
||||
cygwin-convert-path-from-windows and cygwin-convert-path-to-windows.
|
||||
These functions allows lisp code to access the Cygwin path mapping
|
||||
machinery to convert between Cygwin and Windows-native paths.
|
||||
|
||||
** On MS-Windows Vista and later Emacs now supports symbolic links.
|
||||
|
||||
* Changes in Emacs 24.2
|
||||
|
|
|
@ -1,3 +1,16 @@
|
|||
2012-10-08 Daniel Colascione <dancol@dancol.org>
|
||||
|
||||
* emacsclient.c: Include windows.h when HAVE_NTGUI.
|
||||
(alt_display): New variable. We send the display held by this
|
||||
variable when the primary display is either unsupported or not
|
||||
present.
|
||||
(longopts): Allow display everywhere.
|
||||
(w32_set_user_model_id): Move lower in file, inside HAVE_NTGUI
|
||||
section.
|
||||
(decode_options): Use alt_display. Explain why.
|
||||
(main): Retry connection with alt_display if connection with main
|
||||
display fails.
|
||||
|
||||
2012-10-01 Fabrice Popineau <fabrice.popineau@gmail.com>
|
||||
|
||||
* make-docfile.c (write_globals): Special-case
|
||||
|
|
|
@ -44,6 +44,10 @@ char *w32_getenv (char *);
|
|||
|
||||
#else /* !WINDOWSNT */
|
||||
|
||||
# ifdef HAVE_NTGUI
|
||||
# include <windows.h>
|
||||
# endif /* HAVE_NTGUI */
|
||||
|
||||
# include "syswait.h"
|
||||
|
||||
# ifdef HAVE_INET_SOCKETS
|
||||
|
@ -140,6 +144,9 @@ int current_frame = 1;
|
|||
/* The display on which Emacs should work. --display. */
|
||||
const char *display = NULL;
|
||||
|
||||
/* The alternate display we should try if Emacs does not support display. */
|
||||
const char *alt_display = NULL;
|
||||
|
||||
/* The parent window ID, if we are opening a frame via XEmbed. */
|
||||
char *parent_id = NULL;
|
||||
|
||||
|
@ -182,9 +189,7 @@ struct option longopts[] =
|
|||
{ "socket-name", required_argument, NULL, 's' },
|
||||
#endif
|
||||
{ "server-file", required_argument, NULL, 'f' },
|
||||
#ifndef WINDOWSNT
|
||||
{ "display", required_argument, NULL, 'd' },
|
||||
#endif
|
||||
{ "parent-id", required_argument, NULL, 'p' },
|
||||
{ 0, 0, 0, 0 }
|
||||
};
|
||||
|
@ -385,32 +390,6 @@ w32_getenv (char *envvar)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
w32_set_user_model_id (void)
|
||||
{
|
||||
HMODULE shell;
|
||||
HRESULT (WINAPI * set_user_model) (wchar_t * id);
|
||||
|
||||
/* On Windows 7 and later, we need to set the user model ID
|
||||
to associate emacsclient launched files with Emacs frames
|
||||
in the UI. */
|
||||
shell = LoadLibrary ("shell32.dll");
|
||||
if (shell)
|
||||
{
|
||||
set_user_model
|
||||
= (void *) GetProcAddress (shell,
|
||||
"SetCurrentProcessExplicitAppUserModelID");
|
||||
/* If the function is defined, then we are running on Windows 7
|
||||
or newer, and the UI uses this to group related windows
|
||||
together. Since emacs, runemacs, emacsclient are related, we
|
||||
want them grouped even though the executables are different,
|
||||
so we need to set a consistent ID between them. */
|
||||
if (set_user_model)
|
||||
set_user_model (L"GNU.Emacs");
|
||||
|
||||
FreeLibrary (shell);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
w32_window_app (void)
|
||||
|
@ -605,16 +584,29 @@ decode_options (int argc, char **argv)
|
|||
Without the -c option, we used to set `display' to $DISPLAY by
|
||||
default, but this changed the default behavior and is sometimes
|
||||
inconvenient. So we force users to use "--display $DISPLAY" if
|
||||
they want Emacs to connect to their current display. */
|
||||
they want Emacs to connect to their current display.
|
||||
|
||||
Some window systems have a notion of default display not
|
||||
reflected in the DISPLAY variable. If the user didn't give us an
|
||||
explicit display, try this platform-specific after trying the
|
||||
display in DISPLAY (if any). */
|
||||
if (!current_frame && !tty && !display)
|
||||
{
|
||||
display = egetenv ("DISPLAY");
|
||||
#ifdef NS_IMPL_COCOA
|
||||
/* Under Cocoa, we don't really use displays the same way as in X,
|
||||
so provide a dummy. */
|
||||
if (!display || strlen (display) == 0)
|
||||
display = "ns";
|
||||
/* Set these here so we use a default_display only when the user
|
||||
didn't give us an explicit display. */
|
||||
#if defined (NS_IMPL_COCOA)
|
||||
alt_display = "ns";
|
||||
#elif defined (HAVE_NTGUI)
|
||||
alt_display = "w32";
|
||||
#endif
|
||||
|
||||
display = egetenv ("DISPLAY");
|
||||
}
|
||||
|
||||
if (!display)
|
||||
{
|
||||
display = alt_display;
|
||||
alt_display = NULL;
|
||||
}
|
||||
|
||||
/* A null-string display is invalid. */
|
||||
|
@ -1415,10 +1407,37 @@ set_socket (int no_exit_if_error)
|
|||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
#ifdef WINDOWSNT
|
||||
#ifdef HAVE_NTGUI
|
||||
FARPROC set_fg; /* Pointer to AllowSetForegroundWindow. */
|
||||
FARPROC get_wc; /* Pointer to RealGetWindowClassA. */
|
||||
|
||||
void
|
||||
w32_set_user_model_id (void)
|
||||
{
|
||||
HMODULE shell;
|
||||
HRESULT (WINAPI * set_user_model) (wchar_t * id);
|
||||
|
||||
/* On Windows 7 and later, we need to set the user model ID
|
||||
to associate emacsclient launched files with Emacs frames
|
||||
in the UI. */
|
||||
shell = LoadLibrary ("shell32.dll");
|
||||
if (shell)
|
||||
{
|
||||
set_user_model
|
||||
= (void *) GetProcAddress (shell,
|
||||
"SetCurrentProcessExplicitAppUserModelID");
|
||||
/* If the function is defined, then we are running on Windows 7
|
||||
or newer, and the UI uses this to group related windows
|
||||
together. Since emacs, runemacs, emacsclient are related, we
|
||||
want them grouped even though the executables are different,
|
||||
so we need to set a consistent ID between them. */
|
||||
if (set_user_model)
|
||||
set_user_model (L"GNU.Emacs");
|
||||
|
||||
FreeLibrary (shell);
|
||||
}
|
||||
}
|
||||
|
||||
BOOL CALLBACK
|
||||
w32_find_emacs_process (HWND hWnd, LPARAM lParam)
|
||||
{
|
||||
|
@ -1467,7 +1486,7 @@ w32_give_focus (void)
|
|||
&& (get_wc = GetProcAddress (user32, "RealGetWindowClassA")))
|
||||
EnumWindows (w32_find_emacs_process, (LPARAM) 0);
|
||||
}
|
||||
#endif
|
||||
#endif /* HAVE_NTGUI */
|
||||
|
||||
/* Start the emacs daemon and try to connect to it. */
|
||||
|
||||
|
@ -1537,11 +1556,13 @@ main (int argc, char **argv)
|
|||
main_argv = argv;
|
||||
progname = argv[0];
|
||||
|
||||
#ifdef WINDOWSNT
|
||||
/* On Windows 7 and later, we need to explicitly associate emacsclient
|
||||
with emacs so the UI behaves sensibly. */
|
||||
#ifdef HAVE_NTGUI
|
||||
/* On Windows 7 and later, we need to explicitly associate
|
||||
emacsclient with emacs so the UI behaves sensibly. This
|
||||
association does no harm if we're not actually connecting to an
|
||||
Emacs using a window display. */
|
||||
w32_set_user_model_id ();
|
||||
#endif
|
||||
#endif /* HAVE_NTGUI */
|
||||
|
||||
/* Process options. */
|
||||
decode_options (argc, argv);
|
||||
|
@ -1577,9 +1598,10 @@ main (int argc, char **argv)
|
|||
fail ();
|
||||
}
|
||||
|
||||
#ifdef WINDOWSNT
|
||||
#ifdef HAVE_NTGUI
|
||||
if (display && !strcmp (display, "w32"))
|
||||
w32_give_focus ();
|
||||
#endif
|
||||
#endif /* HAVE_NTGUI */
|
||||
|
||||
/* Send over our environment and current directory. */
|
||||
if (!current_frame)
|
||||
|
@ -1748,46 +1770,56 @@ main (int argc, char **argv)
|
|||
if (end_p != NULL)
|
||||
*end_p++ = '\0';
|
||||
|
||||
if (strprefix ("-emacs-pid ", p))
|
||||
{
|
||||
/* -emacs-pid PID: The process id of the Emacs process. */
|
||||
emacs_pid = strtol (p + strlen ("-emacs-pid"), NULL, 10);
|
||||
}
|
||||
else if (strprefix ("-window-system-unsupported ", p))
|
||||
{
|
||||
/* -window-system-unsupported: Emacs was compiled without X
|
||||
support. Try again on the terminal. */
|
||||
nowait = 0;
|
||||
tty = 1;
|
||||
goto retry;
|
||||
}
|
||||
else if (strprefix ("-print ", p))
|
||||
{
|
||||
/* -print STRING: Print STRING on the terminal. */
|
||||
str = unquote_argument (p + strlen ("-print "));
|
||||
if (needlf)
|
||||
printf ("\n");
|
||||
printf ("%s", str);
|
||||
needlf = str[0] == '\0' ? needlf : str[strlen (str) - 1] != '\n';
|
||||
}
|
||||
else if (strprefix ("-print-nonl ", p))
|
||||
{
|
||||
/* -print-nonl STRING: Print STRING on the terminal.
|
||||
Used to continue a preceding -print command. */
|
||||
str = unquote_argument (p + strlen ("-print-nonl "));
|
||||
printf ("%s", str);
|
||||
needlf = str[0] == '\0' ? needlf : str[strlen (str) - 1] != '\n';
|
||||
}
|
||||
else if (strprefix ("-error ", p))
|
||||
{
|
||||
/* -error DESCRIPTION: Signal an error on the terminal. */
|
||||
str = unquote_argument (p + strlen ("-error "));
|
||||
if (needlf)
|
||||
printf ("\n");
|
||||
fprintf (stderr, "*ERROR*: %s", str);
|
||||
needlf = str[0] == '\0' ? needlf : str[strlen (str) - 1] != '\n';
|
||||
exit_status = EXIT_FAILURE;
|
||||
}
|
||||
if (strprefix ("-emacs-pid ", p))
|
||||
{
|
||||
/* -emacs-pid PID: The process id of the Emacs process. */
|
||||
emacs_pid = strtol (p + strlen ("-emacs-pid"), NULL, 10);
|
||||
}
|
||||
else if (strprefix ("-window-system-unsupported ", p))
|
||||
{
|
||||
/* -window-system-unsupported: Emacs was compiled without support
|
||||
for whatever window system we tried. Try the alternate
|
||||
display, or, failing that, try the terminal. */
|
||||
if (alt_display)
|
||||
{
|
||||
display = alt_display;
|
||||
alt_display = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
nowait = 0;
|
||||
tty = 1;
|
||||
}
|
||||
|
||||
goto retry;
|
||||
}
|
||||
else if (strprefix ("-print ", p))
|
||||
{
|
||||
/* -print STRING: Print STRING on the terminal. */
|
||||
str = unquote_argument (p + strlen ("-print "));
|
||||
if (needlf)
|
||||
printf ("\n");
|
||||
printf ("%s", str);
|
||||
needlf = str[0] == '\0' ? needlf : str[strlen (str) - 1] != '\n';
|
||||
}
|
||||
else if (strprefix ("-print-nonl ", p))
|
||||
{
|
||||
/* -print-nonl STRING: Print STRING on the terminal.
|
||||
Used to continue a preceding -print command. */
|
||||
str = unquote_argument (p + strlen ("-print-nonl "));
|
||||
printf ("%s", str);
|
||||
needlf = str[0] == '\0' ? needlf : str[strlen (str) - 1] != '\n';
|
||||
}
|
||||
else if (strprefix ("-error ", p))
|
||||
{
|
||||
/* -error DESCRIPTION: Signal an error on the terminal. */
|
||||
str = unquote_argument (p + strlen ("-error "));
|
||||
if (needlf)
|
||||
printf ("\n");
|
||||
fprintf (stderr, "*ERROR*: %s", str);
|
||||
needlf = str[0] == '\0' ? needlf : str[strlen (str) - 1] != '\n';
|
||||
exit_status = EXIT_FAILURE;
|
||||
}
|
||||
#ifdef SIGSTOP
|
||||
else if (strprefix ("-suspend ", p))
|
||||
{
|
||||
|
|
|
@ -30,6 +30,73 @@
|
|||
* comint.el (comint-preinput-scroll-to-bottom): Preserve the
|
||||
frame-selected-windows.
|
||||
|
||||
2012-10-08 Daniel Colascione <dancol@dancol.org>
|
||||
|
||||
* battery.el (battery-status-function): Check for
|
||||
w32-battery-status itself, not system-time windows-nt.
|
||||
|
||||
* frame.el: Require cl-lib.
|
||||
(display-format-alist): New variable mapping frame types to
|
||||
functions that initialize them.
|
||||
(window-system-for-display): New function: interprets
|
||||
display-format-alist.
|
||||
(make-frame-on-display): Remove existing display-selection logic
|
||||
and just forward to make-frame, which will now DTRT.
|
||||
(make-frame): Restructure to use window-system-for-display to
|
||||
figure out how to create a frame on a given display.
|
||||
(display-mouse-p): Look for frame-type w32, not a particular
|
||||
system-type.
|
||||
|
||||
* loadup.el: Load w32 lisp code when we have the w32 feature.
|
||||
|
||||
* mouse.el (mouse-yank-primarY): Look for frame-type w32, not
|
||||
system-type windows-nt.
|
||||
|
||||
* server.el (server-create-window-system-frame): Look for window
|
||||
type.
|
||||
(server-proces-filter): Only force a window system when windows-nt
|
||||
_and_ w32. Explain why.
|
||||
|
||||
* simple.el (normal-erase-is-backspace-mode): Add w32 to the list
|
||||
of window systems we configure for the mode.
|
||||
|
||||
* startup.el (command-line): Mark window system is initialized
|
||||
after we've done it.
|
||||
|
||||
* common-win.el (x-select-text): Look for w32, not windows-nt.
|
||||
|
||||
* ns-win.el: Require cl-lib. Add ourselves to
|
||||
display-format-alist.
|
||||
(ns-initialize-window-system): Assert we're not initialized twice.
|
||||
|
||||
* w32-win.el: Enable lexical binding; require cl-lib; add
|
||||
ourselves to display-format-alist.
|
||||
(w32-handle-dropped-file): Convert incoming dropped files from
|
||||
Windows paths to Cygwin ones before passing them on to the rest of
|
||||
Emacs.
|
||||
(w32-drag-n-drop): New paramter new-frame. Simplify logic.
|
||||
(w32-initialize-window-system): Assert we're not initialized twice.
|
||||
|
||||
* x-win.el: Require cl-lib; add ourselves to display-format-alist.
|
||||
(x-initialize-window-system): Assert we're not initialized twice.
|
||||
|
||||
* w32-common-fns.el: New File.
|
||||
(w32-version, w32-using-nt, w32-get-clipboard-data)
|
||||
(w32-set-clipboard-data, x-set-selection, x-get-selection)
|
||||
(w32-charset-info-alist, x-last-selected, text)
|
||||
(x-get-selection-value, x-selection-value): Move here.
|
||||
|
||||
* w32-fns.el: Require w32-common-fns.
|
||||
(w32-version, w32-using-nt, w32-get-clipboard-data)
|
||||
(w32-set-clipboard-data, x-set-selection, x-get-selection)
|
||||
(w32-charset-info-alist, x-last-selected, text)
|
||||
(x-get-selection-value, x-selection-value): Move to
|
||||
w32-common-fns.
|
||||
|
||||
* w32-vars.el:
|
||||
(w32-allow-system-shell, w32-system-shells): Define only in
|
||||
non-cygwin case.
|
||||
|
||||
2012-10-07 Stefan Monnier <monnier@iro.umontreal.ca>
|
||||
|
||||
* subr.el (read-passwd-map): Don't use `defconst' (bug#12597).
|
||||
|
|
|
@ -60,7 +60,7 @@
|
|||
(> (buffer-size) 0)))
|
||||
(error nil)))
|
||||
'battery-pmset)
|
||||
((eq system-type 'windows-nt)
|
||||
((fboundp 'w32-battery-status)
|
||||
'w32-battery-status))
|
||||
"Function for getting battery status information.
|
||||
The function has to return an alist of conversion definitions.
|
||||
|
|
|
@ -96,7 +96,7 @@ ALTERNATIVE2 etc."
|
|||
;; This is defined originally in xfaces.c.
|
||||
(defcustom face-font-registry-alternatives
|
||||
(mapcar (lambda (arg) (mapcar 'purecopy arg))
|
||||
(if (eq system-type 'windows-nt)
|
||||
(if (featurep 'w32)
|
||||
'(("iso8859-1" "ms-oemlatin")
|
||||
("gb2312.1980" "gb2312" "gbk" "gb18030")
|
||||
("jisx0208.1990" "jisx0208.1983" "jisx0208.1978")
|
||||
|
|
|
@ -25,6 +25,8 @@
|
|||
;;; Commentary:
|
||||
|
||||
;;; Code:
|
||||
(eval-when-compile (require 'cl-lib))
|
||||
|
||||
(defvar frame-creation-function-alist
|
||||
(list (cons nil
|
||||
(if (fboundp 'tty-create-frame-with-faces)
|
||||
|
@ -45,6 +47,12 @@ Then, for frames on WINDOW-SYSTEM, any parameters specified in
|
|||
ALIST supersede the corresponding parameters specified in
|
||||
`default-frame-alist'.")
|
||||
|
||||
(defvar display-format-alist nil
|
||||
"Alist of patterns to decode display names.
|
||||
The car of each entry is a regular expression matching a display
|
||||
name string. The cdr is a symbol giving the window-system that
|
||||
handles the corresponding kind of display.")
|
||||
|
||||
;; The initial value given here used to ask for a minibuffer.
|
||||
;; But that's not necessary, because the default is to have one.
|
||||
;; By not specifying it here, we let an X resource specify it.
|
||||
|
@ -510,31 +518,19 @@ is not considered (see `next-frame')."
|
|||
0))
|
||||
(select-frame-set-input-focus (selected-frame)))
|
||||
|
||||
(declare-function x-initialize-window-system "term/x-win" ())
|
||||
(declare-function ns-initialize-window-system "term/ns-win" ())
|
||||
(defvar x-display-name) ; term/x-win
|
||||
(defun window-system-for-display (display)
|
||||
"Return the window system for DISPLAY.
|
||||
Return nil if we don't know how to interpret DISPLAY."
|
||||
(cl-loop for descriptor in display-format-alist
|
||||
for pattern = (car descriptor)
|
||||
for system = (cdr descriptor)
|
||||
when (string-match-p pattern display) return system))
|
||||
|
||||
(defun make-frame-on-display (display &optional parameters)
|
||||
"Make a frame on display DISPLAY.
|
||||
The optional argument PARAMETERS specifies additional frame parameters."
|
||||
(interactive "sMake frame on display: ")
|
||||
(cond ((featurep 'ns)
|
||||
(when (and (boundp 'ns-initialized) (not ns-initialized))
|
||||
(setq x-display-name display)
|
||||
(ns-initialize-window-system))
|
||||
(make-frame `((window-system . ns)
|
||||
(display . ,display) . ,parameters)))
|
||||
((eq system-type 'windows-nt)
|
||||
;; On Windows, ignore DISPLAY.
|
||||
(make-frame parameters))
|
||||
(t
|
||||
(unless (string-match-p "\\`[^:]*:[0-9]+\\(\\.[0-9]+\\)?\\'" display)
|
||||
(error "Invalid display, not HOST:SERVER or HOST:SERVER.SCREEN"))
|
||||
(when (and (boundp 'x-initialized) (not x-initialized))
|
||||
(setq x-display-name display)
|
||||
(x-initialize-window-system))
|
||||
(make-frame `((window-system . x)
|
||||
(display . ,display) . ,parameters)))))
|
||||
(make-frame (cons (cons 'display display) parameters)))
|
||||
|
||||
(declare-function x-close-connection "xfns.c" (terminal))
|
||||
|
||||
|
@ -616,6 +612,8 @@ neither or both.
|
|||
(window-system . nil) The frame should be displayed on a terminal device.
|
||||
(window-system . x) The frame should be displayed in an X window.
|
||||
|
||||
(display . \":0\") The frame should appear on display :0.
|
||||
|
||||
(terminal . TERMINAL) The frame should use the terminal object TERMINAL.
|
||||
|
||||
In addition, any parameter specified in `default-frame-alist',
|
||||
|
@ -626,11 +624,15 @@ this function runs the hook `before-make-frame-hook'. After
|
|||
creating the frame, it runs the hook `after-make-frame-functions'
|
||||
with one arg, the newly created frame.
|
||||
|
||||
If a display parameter is supplied and a window-system is not,
|
||||
guess the window-system from the display.
|
||||
|
||||
On graphical displays, this function does not itself make the new
|
||||
frame the selected frame. However, the window system may select
|
||||
the new frame according to its own rules."
|
||||
(interactive)
|
||||
(let* ((w (cond
|
||||
(let* ((display (cdr (assq 'display parameters)))
|
||||
(w (cond
|
||||
((assq 'terminal parameters)
|
||||
(let ((type (terminal-live-p (cdr (assq 'terminal parameters)))))
|
||||
(cond
|
||||
|
@ -640,6 +642,10 @@ the new frame according to its own rules."
|
|||
(t type))))
|
||||
((assq 'window-system parameters)
|
||||
(cdr (assq 'window-system parameters)))
|
||||
(display
|
||||
(or (window-system-for-display display)
|
||||
(error "Don't know how to interpret display \"%S\""
|
||||
display)))
|
||||
(t window-system)))
|
||||
(frame-creation-function (cdr (assq w frame-creation-function-alist)))
|
||||
(oldframe (selected-frame))
|
||||
|
@ -647,6 +653,11 @@ the new frame according to its own rules."
|
|||
frame)
|
||||
(unless frame-creation-function
|
||||
(error "Don't know how to create a frame on window system %s" w))
|
||||
|
||||
(unless (get w 'window-system-initialized)
|
||||
(funcall (cdr (assq w window-system-initialization-alist)))
|
||||
(put w 'window-system-initialized t))
|
||||
|
||||
;; Add parameters from `window-system-default-frame-alist'.
|
||||
(dolist (p (cdr (assq w window-system-default-frame-alist)))
|
||||
(unless (assq (car p) params)
|
||||
|
@ -1260,7 +1271,7 @@ frame's display)."
|
|||
(cond
|
||||
((eq frame-type 'pc)
|
||||
(msdos-mouse-p))
|
||||
((eq system-type 'windows-nt)
|
||||
((eq frame-type 'w32)
|
||||
(with-no-warnings
|
||||
(> w32-num-mouse-buttons 0)))
|
||||
((memq frame-type '(x ns))
|
||||
|
|
|
@ -2670,7 +2670,8 @@ See also `locale-charset-language-names', `locale-language-names',
|
|||
;; On Windows, override locale-coding-system,
|
||||
;; default-file-name-coding-system, keyboard-coding-system,
|
||||
;; terminal-coding-system with system codepage.
|
||||
(when (boundp 'w32-ansi-code-page)
|
||||
(when (and (eq system-type 'windows-nt)
|
||||
(boundp 'w32-ansi-code-page))
|
||||
(let ((code-page-coding (intern (format "cp%d" w32-ansi-code-page))))
|
||||
(when (coding-system-p code-page-coding)
|
||||
(unless frame (setq locale-coding-system code-page-coding))
|
||||
|
|
|
@ -237,15 +237,18 @@
|
|||
(load "term/common-win")
|
||||
(load "term/x-win")))
|
||||
|
||||
(if (eq system-type 'windows-nt)
|
||||
(if (or (eq system-type 'windows-nt)
|
||||
(featurep 'w32))
|
||||
(progn
|
||||
(load "w32-vars")
|
||||
(load "term/common-win")
|
||||
(load "w32-vars")
|
||||
(load "term/w32-win")
|
||||
(load "ls-lisp")
|
||||
(load "disp-table")
|
||||
(load "dos-w32")
|
||||
(load "w32-fns")))
|
||||
(load "w32-common-fns")
|
||||
(when (eq system-type 'windows-nt)
|
||||
(load "w32-fns")
|
||||
(load "ls-lisp")
|
||||
(load "dos-w32"))))
|
||||
(if (eq system-type 'ms-dos)
|
||||
(progn
|
||||
(load "dos-w32")
|
||||
|
|
|
@ -1151,7 +1151,7 @@ regardless of where you click."
|
|||
(or mouse-yank-at-point (mouse-set-point click))
|
||||
(let ((primary
|
||||
(cond
|
||||
((eq system-type 'windows-nt)
|
||||
((eq (framep (selected-frame)) 'w32)
|
||||
;; MS-Windows emulates PRIMARY in x-get-selection, but not
|
||||
;; in x-get-selection-value (the latter only accesses the
|
||||
;; clipboard). So try PRIMARY first, in case they selected
|
||||
|
|
|
@ -833,35 +833,40 @@ This handles splitting the command if it would be bigger than
|
|||
|
||||
(defun server-create-window-system-frame (display nowait proc parent-id
|
||||
&optional parameters)
|
||||
(add-to-list 'frame-inherited-parameters 'client)
|
||||
(if (not (fboundp 'make-frame-on-display))
|
||||
(progn
|
||||
;; This emacs does not support X.
|
||||
(server-log "Window system unsupported" proc)
|
||||
(server-send-string proc "-window-system-unsupported \n")
|
||||
nil)
|
||||
;; Flag frame as client-created, but use a dummy client.
|
||||
;; This will prevent the frame from being deleted when
|
||||
;; emacsclient quits while also preventing
|
||||
;; `server-save-buffers-kill-terminal' from unexpectedly
|
||||
;; killing emacs on that frame.
|
||||
(let* ((params `((client . ,(if nowait 'nowait proc))
|
||||
;; This is a leftover, see above.
|
||||
(environment . ,(process-get proc 'env))
|
||||
,@parameters))
|
||||
(display (or display
|
||||
(frame-parameter nil 'display)
|
||||
(getenv "DISPLAY")
|
||||
(error "Please specify display")))
|
||||
frame)
|
||||
(if parent-id
|
||||
(push (cons 'parent-id (string-to-number parent-id)) params))
|
||||
(setq frame (make-frame-on-display display params))
|
||||
(server-log (format "%s created" frame) proc)
|
||||
(select-frame frame)
|
||||
(process-put proc 'frame frame)
|
||||
(process-put proc 'terminal (frame-terminal frame))
|
||||
frame)))
|
||||
(let* ((display (or display
|
||||
(frame-parameter nil 'display)
|
||||
(error "Please specify display.")))
|
||||
(w (or (cdr (assq 'window-system parameters))
|
||||
(window-system-for-display display))))
|
||||
|
||||
(unless (assq w window-system-initialization-alist)
|
||||
(setq w nil))
|
||||
|
||||
(cond (w
|
||||
;; Flag frame as client-created, but use a dummy client.
|
||||
;; This will prevent the frame from being deleted when
|
||||
;; emacsclient quits while also preventing
|
||||
;; `server-save-buffers-kill-terminal' from unexpectedly
|
||||
;; killing emacs on that frame.
|
||||
(let* ((params `((client . ,(if nowait 'nowait proc))
|
||||
;; This is a leftover, see above.
|
||||
(environment . ,(process-get proc 'env))
|
||||
,@parameters))
|
||||
frame)
|
||||
(if parent-id
|
||||
(push (cons 'parent-id (string-to-number parent-id)) params))
|
||||
(add-to-list 'frame-inherited-parameters 'client)
|
||||
(setq frame (make-frame-on-display display params))
|
||||
(server-log (format "%s created" frame) proc)
|
||||
(select-frame frame)
|
||||
(process-put proc 'frame frame)
|
||||
(process-put proc 'terminal (frame-terminal frame))
|
||||
frame))
|
||||
|
||||
(t
|
||||
(server-log "Window system unsupported" proc)
|
||||
(server-send-string proc "-window-system-unsupported \n")
|
||||
nil))))
|
||||
|
||||
(defun server-goto-toplevel (proc)
|
||||
(condition-case nil
|
||||
|
@ -1121,9 +1126,13 @@ The following commands are accepted by the client:
|
|||
tty-type (pop args-left)
|
||||
dontkill (or dontkill
|
||||
(not use-current-frame)))
|
||||
;; On Windows, emacsclient always asks for a tty frame.
|
||||
;; If running a GUI server, force the frame type to GUI.
|
||||
(when (eq window-system 'w32)
|
||||
;; On Windows, emacsclient always asks for a tty
|
||||
;; frame. If running a GUI server, force the frame
|
||||
;; type to GUI. (Cygwin is perfectly happy with
|
||||
;; multi-tty support, so don't override the user's
|
||||
;; choice there.)
|
||||
(when (and (eq system-type 'windows-nt)
|
||||
(eq window-system 'w32))
|
||||
(push "-window-system" args-left)))
|
||||
|
||||
;; -position LINE[:COLUMN]: Set point to the given
|
||||
|
|
|
@ -6872,7 +6872,7 @@ call `normal-erase-is-backspace-mode' (which see) instead."
|
|||
(if (if (eq normal-erase-is-backspace 'maybe)
|
||||
(and (not noninteractive)
|
||||
(or (memq system-type '(ms-dos windows-nt))
|
||||
(memq window-system '(ns))
|
||||
(memq window-system '(w32 ns))
|
||||
(and (memq window-system '(x))
|
||||
(fboundp 'x-backspace-delete-keys-p)
|
||||
(x-backspace-delete-keys-p))
|
||||
|
|
|
@ -890,7 +890,8 @@ Amongst another things, it parses the command-line arguments."
|
|||
;; Initialize the window system. (Open connection, etc.)
|
||||
(funcall
|
||||
(or (cdr (assq initial-window-system window-system-initialization-alist))
|
||||
(error "Unsupported window system `%s'" initial-window-system))))
|
||||
(error "Unsupported window system `%s'" initial-window-system)))
|
||||
(put initial-window-system 'window-system-initialized t))
|
||||
;; If there was an error, print the error message and exit.
|
||||
(error
|
||||
(princ
|
||||
|
|
|
@ -57,7 +57,7 @@ clipboard as well.
|
|||
|
||||
On Nextstep, put TEXT in the pasteboard (`x-select-enable-clipboard'
|
||||
is not used)."
|
||||
(cond ((eq system-type 'windows-nt)
|
||||
(cond ((eq (framep (selected-frame)) 'w32)
|
||||
(if x-select-enable-clipboard
|
||||
(w32-set-clipboard-data text))
|
||||
(setq x-last-selected-text text))
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
;; this file, which works in close coordination with src/nsfns.m.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(eval-when-compile (require 'cl-lib))
|
||||
(or (featurep 'ns)
|
||||
(error "%s: Loading ns-win.el but not compiled for GNUstep/MacOS"
|
||||
(invocation-name)))
|
||||
|
@ -909,6 +909,7 @@ See the documentation of `create-fontset-from-fontset-spec' for the format.")
|
|||
;; defines functions and variables that we use now.
|
||||
(defun ns-initialize-window-system ()
|
||||
"Initialize Emacs for Nextstep (Cocoa / GNUstep) windowing."
|
||||
(cl-assert (not ns-initialized))
|
||||
|
||||
;; PENDING: not needed?
|
||||
(setq command-line-args (x-handle-args command-line-args))
|
||||
|
@ -936,6 +937,7 @@ See the documentation of `create-fontset-from-fontset-spec' for the format.")
|
|||
(x-apply-session-resources)
|
||||
(setq ns-initialized t))
|
||||
|
||||
(add-to-list 'display-format-alist '("\\`ns\\'" . ns))
|
||||
(add-to-list 'handle-args-function-alist '(ns . x-handle-args))
|
||||
(add-to-list 'frame-creation-function-alist '(ns . x-create-frame-with-faces))
|
||||
(add-to-list 'window-system-initialization-alist '(ns . ns-initialize-window-system))
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
;;; w32-win.el --- parse switches controlling interface with W32 window system
|
||||
;;; w32-win.el --- parse switches controlling interface with W32 window system -*- lexical-binding: t -*-
|
||||
|
||||
;; Copyright (C) 1993-1994, 2001-2012 Free Software Foundation, Inc.
|
||||
|
||||
|
@ -68,6 +68,7 @@
|
|||
;; (if (not (eq window-system 'w32))
|
||||
;; (error "%s: Loading w32-win.el but not compiled for w32" (invocation-name)))
|
||||
|
||||
(eval-when-compile (require 'cl-lib))
|
||||
(require 'frame)
|
||||
(require 'mouse)
|
||||
(require 'scroll-bar)
|
||||
|
@ -102,7 +103,22 @@
|
|||
;; (interactive "e")
|
||||
;; (princ event))
|
||||
|
||||
(defun w32-drag-n-drop (event)
|
||||
(defun w32-handle-dropped-file (window file-name)
|
||||
(let ((f (if (eq system-type 'cygwin)
|
||||
(cygwin-convert-path-from-windows file-name t)
|
||||
(subst-char-in-string ?\\ ?/ file-name)))
|
||||
(coding (or file-name-coding-system
|
||||
default-file-name-coding-system)))
|
||||
|
||||
(setq file-name
|
||||
(mapconcat 'url-hexify-string
|
||||
(split-string (encode-coding-string f coding)
|
||||
"/")
|
||||
"/")))
|
||||
(dnd-handle-one-url window 'private
|
||||
(concat "file:" file-name)))
|
||||
|
||||
(defun w32-drag-n-drop (event &optional new-frame)
|
||||
"Edit the files listed in the drag-n-drop EVENT.
|
||||
Switch to a buffer editing the last file dropped."
|
||||
(interactive "e")
|
||||
|
@ -116,26 +132,21 @@ Switch to a buffer editing the last file dropped."
|
|||
(y (cdr coords)))
|
||||
(if (and (> x 0) (> y 0))
|
||||
(set-frame-selected-window nil window))
|
||||
(mapc (lambda (file-name)
|
||||
(let ((f (subst-char-in-string ?\\ ?/ file-name))
|
||||
(coding (or file-name-coding-system
|
||||
default-file-name-coding-system)))
|
||||
(setq file-name
|
||||
(mapconcat 'url-hexify-string
|
||||
(split-string (encode-coding-string f coding)
|
||||
"/")
|
||||
"/")))
|
||||
(dnd-handle-one-url window 'private
|
||||
(concat "file:" file-name)))
|
||||
(car (cdr (cdr event)))))
|
||||
(raise-frame)))
|
||||
|
||||
(when new-frame
|
||||
(select-frame (make-frame)))
|
||||
(raise-frame)
|
||||
(setq window (selected-window))
|
||||
|
||||
(mapc (apply-partially #'w32-handle-dropped-file window)
|
||||
(car (cdr (cdr event)))))))
|
||||
|
||||
(defun w32-drag-n-drop-other-frame (event)
|
||||
"Edit the files listed in the drag-n-drop EVENT, in other frames.
|
||||
May create new frames, or reuse existing ones. The frame editing
|
||||
the last file dropped is selected."
|
||||
(interactive "e")
|
||||
(mapcar 'find-file-other-frame (car (cdr (cdr event)))))
|
||||
(w32-drag-n-drop event t))
|
||||
|
||||
;; Bind the drag-n-drop event.
|
||||
(global-set-key [drag-n-drop] 'w32-drag-n-drop)
|
||||
|
@ -230,6 +241,7 @@ See the documentation of `create-fontset-from-fontset-spec' for the format.")
|
|||
|
||||
(defun w32-initialize-window-system ()
|
||||
"Initialize Emacs for W32 GUI frames."
|
||||
(cl-assert (not w32-initialized))
|
||||
|
||||
;; Do the actual Windows setup here; the above code just defines
|
||||
;; functions and variables that we use now.
|
||||
|
@ -243,7 +255,7 @@ See the documentation of `create-fontset-from-fontset-spec' for the format.")
|
|||
;; so as not to choke when we use it in X resource queries.
|
||||
(replace-regexp-in-string "[.*]" "-" (invocation-name))))
|
||||
|
||||
(x-open-connection "" x-command-line-resources
|
||||
(x-open-connection "w32" x-command-line-resources
|
||||
;; Exit with a fatal error if this fails and we
|
||||
;; are the initial display
|
||||
(eq initial-window-system 'w32))
|
||||
|
@ -294,7 +306,7 @@ See the documentation of `create-fontset-from-fontset-spec' for the format.")
|
|||
(setq default-frame-alist
|
||||
(cons '(reverse . t) default-frame-alist)))))
|
||||
|
||||
;; Don't let Emacs suspend under w32 gui
|
||||
;; Don't let Emacs suspend under Windows.
|
||||
(add-hook 'suspend-hook 'x-win-suspend-error)
|
||||
|
||||
;; Turn off window-splitting optimization; w32 is usually fast enough
|
||||
|
@ -312,6 +324,7 @@ See the documentation of `create-fontset-from-fontset-spec' for the format.")
|
|||
(x-apply-session-resources)
|
||||
(setq w32-initialized t))
|
||||
|
||||
(add-to-list 'display-format-alist '("\\`w32\\'" . w32))
|
||||
(add-to-list 'handle-args-function-alist '(w32 . x-handle-args))
|
||||
(add-to-list 'frame-creation-function-alist '(w32 . x-create-frame-with-faces))
|
||||
(add-to-list 'window-system-initialization-alist '(w32 . w32-initialize-window-system))
|
||||
|
|
|
@ -67,6 +67,8 @@
|
|||
;; An alist of X options and the function which handles them. See
|
||||
;; ../startup.el.
|
||||
|
||||
(eval-when-compile (require 'cl-lib))
|
||||
|
||||
(if (not (fboundp 'x-create-frame))
|
||||
(error "%s: Loading x-win.el but not compiled for X" (invocation-name)))
|
||||
|
||||
|
@ -1338,6 +1340,8 @@ Request data types in the order specified by `x-select-request-type'."
|
|||
|
||||
(defun x-initialize-window-system ()
|
||||
"Initialize Emacs for X frames and open the first connection to an X server."
|
||||
(cl-assert (not x-initialized))
|
||||
|
||||
;; Make sure we have a valid resource name.
|
||||
(or (stringp x-resource-name)
|
||||
(let (i)
|
||||
|
@ -1451,6 +1455,7 @@ Request data types in the order specified by `x-select-request-type'."
|
|||
(x-apply-session-resources)
|
||||
(setq x-initialized t))
|
||||
|
||||
(add-to-list 'display-format-alist '("\\`[^:]*:[0-9]+\\(\\.[0-9]+\\)?\\'" . x))
|
||||
(add-to-list 'handle-args-function-alist '(x . x-handle-args))
|
||||
(add-to-list 'frame-creation-function-alist '(x . x-create-frame-with-faces))
|
||||
(add-to-list 'window-system-initialization-alist '(x . x-initialize-window-system))
|
||||
|
|
130
lisp/w32-common-fns.el
Normal file
130
lisp/w32-common-fns.el
Normal file
|
@ -0,0 +1,130 @@
|
|||
;;; w32-common-fns.el --- Lisp routines for Windows and Cygwin-w32
|
||||
|
||||
;; Copyright (C) 1994, 2001-2012 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.
|
||||
|
||||
;; GNU Emacs is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
;;;
|
||||
;;; This file contains functions that are used by both native NT Emacs
|
||||
;;; and Cygwin Emacs compiled to use the native Windows widget
|
||||
;;; library.
|
||||
|
||||
(defun w32-version ()
|
||||
"Return the MS-Windows version numbers.
|
||||
The value is a list of three integers: the major and minor version
|
||||
numbers, and the build number."
|
||||
(x-server-version))
|
||||
|
||||
(defun w32-using-nt ()
|
||||
"Return non-nil if running on a Windows NT descendant.
|
||||
That includes all Windows systems except for 9X/Me."
|
||||
(getenv "SystemRoot"))
|
||||
|
||||
(declare-function w32-get-clipboard-data "w32select.c")
|
||||
(declare-function w32-set-clipboard-data "w32select.c")
|
||||
(declare-function x-server-version "w32fns.c" (&optional display))
|
||||
|
||||
;;; Fix interface to (X-specific) mouse.el
|
||||
(defun x-set-selection (type data)
|
||||
"Make an X selection of type TYPE and value DATA.
|
||||
The argument TYPE (nil means `PRIMARY') says which selection, and
|
||||
DATA specifies the contents. TYPE must be a symbol. \(It can also
|
||||
be a string, which stands for the symbol with that name, but this
|
||||
is considered obsolete.) DATA may be a string, a symbol, an
|
||||
integer (or a cons of two integers or list of two integers).
|
||||
|
||||
The selection may also be a cons of two markers pointing to the same buffer,
|
||||
or an overlay. In these cases, the selection is considered to be the text
|
||||
between the markers *at whatever time the selection is examined*.
|
||||
Thus, editing done in the buffer after you specify the selection
|
||||
can alter the effective value of the selection.
|
||||
|
||||
The data may also be a vector of valid non-vector selection values.
|
||||
|
||||
The return value is DATA.
|
||||
|
||||
Interactively, this command sets the primary selection. Without
|
||||
prefix argument, it reads the selection in the minibuffer. With
|
||||
prefix argument, it uses the text of the region as the selection value.
|
||||
|
||||
Note that on MS-Windows, primary and secondary selections set by Emacs
|
||||
are not available to other programs."
|
||||
(put 'x-selections (or type 'PRIMARY) data))
|
||||
|
||||
(defun x-get-selection (&optional type _data-type)
|
||||
"Return the value of an X Windows selection.
|
||||
The argument TYPE (default `PRIMARY') says which selection,
|
||||
and the argument DATA-TYPE (default `STRING') says
|
||||
how to convert the data.
|
||||
|
||||
TYPE may be any symbol \(but nil stands for `PRIMARY'). However,
|
||||
only a few symbols are commonly used. They conventionally have
|
||||
all upper-case names. The most often used ones, in addition to
|
||||
`PRIMARY', are `SECONDARY' and `CLIPBOARD'.
|
||||
|
||||
DATA-TYPE is usually `STRING', but can also be one of the symbols
|
||||
in `selection-converter-alist', which see."
|
||||
(get 'x-selections (or type 'PRIMARY)))
|
||||
|
||||
;; x-selection-owner-p is used in simple.el
|
||||
(defun x-selection-owner-p (&optional type)
|
||||
(and (memq type '(nil PRIMARY SECONDARY))
|
||||
(get 'x-selections (or type 'PRIMARY))))
|
||||
|
||||
;; The "Windows" keys on newer keyboards bring up the Start menu
|
||||
;; whether you want it or not - make Emacs ignore these keystrokes
|
||||
;; rather than beep.
|
||||
(global-set-key [lwindow] 'ignore)
|
||||
(global-set-key [rwindow] 'ignore)
|
||||
|
||||
(defvar w32-charset-info-alist) ; w32font.c
|
||||
|
||||
|
||||
;;;; Selections
|
||||
|
||||
;; We keep track of the last text selected here, so we can check the
|
||||
;; current selection against it, and avoid passing back our own text
|
||||
;; from x-selection-value.
|
||||
(defvar x-last-selected-text nil)
|
||||
|
||||
(defun x-get-selection-value ()
|
||||
"Return the value of the current selection.
|
||||
Consult the selection. Treat empty strings as if they were unset."
|
||||
(if x-select-enable-clipboard
|
||||
(let (text)
|
||||
;; Don't die if x-get-selection signals an error.
|
||||
(condition-case c
|
||||
(setq text (w32-get-clipboard-data))
|
||||
(error (message "w32-get-clipboard-data:%s" c)))
|
||||
(if (string= text "") (setq text nil))
|
||||
(cond
|
||||
((not text) nil)
|
||||
((eq text x-last-selected-text) nil)
|
||||
((string= text x-last-selected-text)
|
||||
;; Record the newer string, so subsequent calls can use the 'eq' test.
|
||||
(setq x-last-selected-text text)
|
||||
nil)
|
||||
(t
|
||||
(setq x-last-selected-text text))))))
|
||||
|
||||
(defalias 'x-selection-value 'x-get-selection-value)
|
||||
|
||||
;; Arrange for the kill and yank functions to set and check the clipboard.
|
||||
(setq interprogram-cut-function 'x-select-text)
|
||||
(setq interprogram-paste-function 'x-get-selection-value)
|
||||
|
||||
(provide 'w32-common-fns)
|
105
lisp/w32-fns.el
105
lisp/w32-fns.el
|
@ -26,34 +26,20 @@
|
|||
|
||||
;;; Code:
|
||||
(require 'w32-vars)
|
||||
(require 'w32-common-fns)
|
||||
|
||||
(defvar explicit-shell-file-name)
|
||||
|
||||
;;;; Function keys
|
||||
|
||||
(declare-function set-message-beep "w32console.c")
|
||||
(declare-function w32-get-clipboard-data "w32select.c")
|
||||
(declare-function w32-get-locale-info "w32proc.c")
|
||||
(declare-function w32-get-valid-locale-ids "w32proc.c")
|
||||
(declare-function w32-set-clipboard-data "w32select.c")
|
||||
|
||||
;; Map all versions of a filename (8.3, longname, mixed case) to the
|
||||
;; same buffer.
|
||||
(setq find-file-visit-truename t)
|
||||
|
||||
(declare-function x-server-version "w32fns.c" (&optional display))
|
||||
|
||||
(defun w32-version ()
|
||||
"Return the MS-Windows version numbers.
|
||||
The value is a list of three integers: the major and minor version
|
||||
numbers, and the build number."
|
||||
(x-server-version))
|
||||
|
||||
(defun w32-using-nt ()
|
||||
"Return non-nil if running on a Windows NT descendant.
|
||||
That includes all Windows systems except for 9X/Me."
|
||||
(and (eq system-type 'windows-nt) (getenv "SystemRoot")))
|
||||
|
||||
(defun w32-shell-name ()
|
||||
"Return the name of the shell being used."
|
||||
(or (bound-and-true-p shell-file-name)
|
||||
|
@ -240,53 +226,6 @@ requires it (see `w32-shell-dos-semantics')."
|
|||
(setq start (match-end 0))))
|
||||
name)))
|
||||
|
||||
;;; Fix interface to (X-specific) mouse.el
|
||||
(defun x-set-selection (type data)
|
||||
"Make an X selection of type TYPE and value DATA.
|
||||
The argument TYPE (nil means `PRIMARY') says which selection, and
|
||||
DATA specifies the contents. TYPE must be a symbol. \(It can also
|
||||
be a string, which stands for the symbol with that name, but this
|
||||
is considered obsolete.) DATA may be a string, a symbol, an
|
||||
integer (or a cons of two integers or list of two integers).
|
||||
|
||||
The selection may also be a cons of two markers pointing to the same buffer,
|
||||
or an overlay. In these cases, the selection is considered to be the text
|
||||
between the markers *at whatever time the selection is examined*.
|
||||
Thus, editing done in the buffer after you specify the selection
|
||||
can alter the effective value of the selection.
|
||||
|
||||
The data may also be a vector of valid non-vector selection values.
|
||||
|
||||
The return value is DATA.
|
||||
|
||||
Interactively, this command sets the primary selection. Without
|
||||
prefix argument, it reads the selection in the minibuffer. With
|
||||
prefix argument, it uses the text of the region as the selection value.
|
||||
|
||||
Note that on MS-Windows, primary and secondary selections set by Emacs
|
||||
are not available to other programs."
|
||||
(put 'x-selections (or type 'PRIMARY) data))
|
||||
|
||||
(defun x-get-selection (&optional type _data-type)
|
||||
"Return the value of an X Windows selection.
|
||||
The argument TYPE (default `PRIMARY') says which selection,
|
||||
and the argument DATA-TYPE (default `STRING') says
|
||||
how to convert the data.
|
||||
|
||||
TYPE may be any symbol \(but nil stands for `PRIMARY'). However,
|
||||
only a few symbols are commonly used. They conventionally have
|
||||
all upper-case names. The most often used ones, in addition to
|
||||
`PRIMARY', are `SECONDARY' and `CLIPBOARD'.
|
||||
|
||||
DATA-TYPE is usually `STRING', but can also be one of the symbols
|
||||
in `selection-converter-alist', which see."
|
||||
(get 'x-selections (or type 'PRIMARY)))
|
||||
|
||||
;; x-selection-owner-p is used in simple.el
|
||||
(defun x-selection-owner-p (&optional type)
|
||||
(and (memq type '(nil PRIMARY SECONDARY))
|
||||
(get 'x-selections (or type 'PRIMARY))))
|
||||
|
||||
(defun set-w32-system-coding-system (coding-system)
|
||||
"Set the coding system used by the Windows system to CODING-SYSTEM.
|
||||
This is used for things like passing font names with non-ASCII
|
||||
|
@ -311,14 +250,6 @@ This function is provided for backward compatibility, since
|
|||
;; Set to a system sound if you want a fancy bell.
|
||||
(set-message-beep nil)
|
||||
|
||||
;; The "Windows" keys on newer keyboards bring up the Start menu
|
||||
;; whether you want it or not - make Emacs ignore these keystrokes
|
||||
;; rather than beep.
|
||||
(global-set-key [lwindow] 'ignore)
|
||||
(global-set-key [rwindow] 'ignore)
|
||||
|
||||
(defvar w32-charset-info-alist) ; w32font.c
|
||||
|
||||
(defun w32-add-charset-info (xlfd-charset windows-charset codepage)
|
||||
"Function to add character sets to display with Windows fonts.
|
||||
Creates entries in `w32-charset-info-alist'.
|
||||
|
@ -379,40 +310,6 @@ bit output with no translation."
|
|||
(make-obsolete-variable 'w32-charset-to-codepage-alist
|
||||
'w32-charset-info-alist "21.1")
|
||||
|
||||
|
||||
;;;; Selections
|
||||
|
||||
;; We keep track of the last text selected here, so we can check the
|
||||
;; current selection against it, and avoid passing back our own text
|
||||
;; from x-selection-value.
|
||||
(defvar x-last-selected-text nil)
|
||||
|
||||
(defun x-get-selection-value ()
|
||||
"Return the value of the current selection.
|
||||
Consult the selection. Treat empty strings as if they were unset."
|
||||
(if x-select-enable-clipboard
|
||||
(let (text)
|
||||
;; Don't die if x-get-selection signals an error.
|
||||
(condition-case c
|
||||
(setq text (w32-get-clipboard-data))
|
||||
(error (message "w32-get-clipboard-data:%s" c)))
|
||||
(if (string= text "") (setq text nil))
|
||||
(cond
|
||||
((not text) nil)
|
||||
((eq text x-last-selected-text) nil)
|
||||
((string= text x-last-selected-text)
|
||||
;; Record the newer string, so subsequent calls can use the 'eq' test.
|
||||
(setq x-last-selected-text text)
|
||||
nil)
|
||||
(t
|
||||
(setq x-last-selected-text text))))))
|
||||
|
||||
(defalias 'x-selection-value 'x-get-selection-value)
|
||||
|
||||
;; Arrange for the kill and yank functions to set and check the clipboard.
|
||||
(setq interprogram-cut-function 'x-select-text)
|
||||
(setq interprogram-paste-function 'x-get-selection-value)
|
||||
|
||||
|
||||
;;;; Support for build process
|
||||
|
||||
|
|
|
@ -44,17 +44,19 @@ X does. See `w32-fixed-font-alist' for the font menu definition."
|
|||
"Include proportional fonts in the default font dialog.")
|
||||
(make-obsolete-variable 'w32-list-proportional-fonts "no longer used." "23.1")
|
||||
|
||||
(defcustom w32-allow-system-shell nil
|
||||
"Disable startup warning when using \"system\" shells."
|
||||
:type 'boolean
|
||||
:group 'w32)
|
||||
(unless (eq system-type 'cygwin)
|
||||
(defcustom w32-allow-system-shell nil
|
||||
"Disable startup warning when using \"system\" shells."
|
||||
:type 'boolean
|
||||
:group 'w32))
|
||||
|
||||
(defcustom w32-system-shells '("cmd" "cmd.exe" "command" "command.com"
|
||||
"4nt" "4nt.exe" "4dos" "4dos.exe"
|
||||
"tcc" "tcc.exe" "ndos" "ndos.exe")
|
||||
"List of strings recognized as Windows system shells."
|
||||
:type '(repeat string)
|
||||
:group 'w32)
|
||||
(unless (eq system-type 'cygwin)
|
||||
(defcustom w32-system-shells '("cmd" "cmd.exe" "command" "command.com"
|
||||
"4nt" "4nt.exe" "4dos" "4dos.exe"
|
||||
"tcc" "tcc.exe" "ndos" "ndos.exe")
|
||||
"List of strings recognized as Windows system shells."
|
||||
:type '(repeat string)
|
||||
:group 'w32))
|
||||
|
||||
;; Want "menu" custom type for this.
|
||||
(defcustom w32-fixed-font-alist
|
||||
|
|
138
src/ChangeLog
138
src/ChangeLog
|
@ -1,3 +1,141 @@
|
|||
2012-10-08 Daniel Colascione <dancol@dancol.org>
|
||||
|
||||
* xfaces.c, xdisp.c, window.c, w32xfns.c, w32term.h, w32term.c,
|
||||
w32select.h w32select.c, w32proc.c, w32menu.c, w32inevt.c,
|
||||
w32help.c, w32font.c, w32font.c, w32fns.c, w32console.c, w32.h,
|
||||
w32.c, unexw32.c, termhooks.h, process.c, menu.c, keyboard.h,
|
||||
keyboard.c, image.c, frame.h, frame.c, fontset.c, font.h, font.c,
|
||||
emacs.c, dispextern.h, cygw32.h, cygw32.c, conf_post.h,
|
||||
Makefile.in: use HAVE_NTGUI for W32 GUI and WINDOWSNT for the
|
||||
operating system. defined(HAVE_NTGUI) && !defined(WINDOWSNT) is
|
||||
now a supported configuration.
|
||||
|
||||
* Makefile.in: consolidate image variables into LIBIMAGE; add
|
||||
W32_OBJ and W32_LIBS. Compile new files.
|
||||
|
||||
* conf_post.h:
|
||||
(_DebPrint) declare tracing facility for W32 debugging. We need
|
||||
to unify tracing later.
|
||||
|
||||
(NTGUI_UNICODE) Define when compiling for Cygwin to allow the
|
||||
unconditional use of W32 Unicode functions. Cygwin runs only on
|
||||
100% Unicode operating systems.
|
||||
|
||||
* cygw32.c: New file. Define Cygwin-specific facilities.
|
||||
(Fcygwin_convert_path_to_windows)
|
||||
(Fcygwin_convert_path_from_windows): New user functions for
|
||||
accessing Cygwin path-munging routines.
|
||||
|
||||
* cygw32.h: New file.
|
||||
(WCSDATA, to_unicode, from_unicode): Define facilities for storing
|
||||
UTF-16LE strings temporarily inside non-Lisp-visible string
|
||||
objects.
|
||||
|
||||
(w32_strerror): Just what it says on the tin.
|
||||
|
||||
* emacs.c: Make the NS fork-then-exec code for daemon-launching
|
||||
also run for Cygwin; both systems have the same problem with using
|
||||
GUI facilities in a forked child. Also call syms_of_cygw32,
|
||||
syms_of_w32select in correct places.
|
||||
|
||||
(DAEMON_MUST_EXEC): new macro defined to signal that a platform
|
||||
needs fork-then-exec for daemon launching.
|
||||
|
||||
* font.h: Include frame.h.
|
||||
|
||||
* image.c: Use the image library cache machinery only when we're
|
||||
compiling for native WINDOWSNT; Cygwin can use shared libraries
|
||||
like any other Unixlike system.
|
||||
|
||||
* keyboard.c: Clarify a comment regarding the input loop.
|
||||
|
||||
* menu.c: When NTGUI_UNICODE is defined, use Unicode menu
|
||||
functions directly instead of trying to detect at runtime that our
|
||||
host operating system supports them. We make this change for two
|
||||
reasons: Cygwin lacks support for the multibyte character
|
||||
conversion functions used by the legacy menu code, and Cygwin
|
||||
never needs to rely on non-Unicode APIs.
|
||||
|
||||
* unexw32.c (hinst): Declare extern.
|
||||
|
||||
* w32.c: Change header order;
|
||||
(w32_strerror): Move to w32fns.c because we need it for
|
||||
non-WINDOWSNT builds.
|
||||
|
||||
* w32.h: Add #error macro to make sure we don't include w32.h for
|
||||
Cygwin builds. Remove w32select declarations.
|
||||
|
||||
* w32console.c (w32_sys_ring_bell, Fset_message_beep): Move to
|
||||
w32fns.c. w32console.c is WINDOWSNT-only.
|
||||
|
||||
* w32fns.c: Include cygw32.h or w32.h depending on CYGWIN; more
|
||||
NTGUI_UNICODE tweaks. (See above.) Change _snprintf to the more
|
||||
POSIXy alternative.
|
||||
(faked_key, sysinfo_cache, osinfo_cahce, syspage_mask)
|
||||
(w32_major_version, w32_minor_version, w32_build_number)
|
||||
(os_subtype, sound_type): Define here
|
||||
(w32_defined_color): Make color parameter const for consistency
|
||||
with other _defined_color functions.
|
||||
(w32_createwindow): Unconditionally call w32_init_class instead of
|
||||
doing so only when hprevinst is non-NULL. Plumbing hprevinst
|
||||
through the code is complex and unnecessary because class
|
||||
registration is practically free.
|
||||
(w32_name_of_message): New EMACSDEBUG-only function.
|
||||
(Fset_message_beep): Move here
|
||||
(Fx_open_connection): Require that the display name for Windows be
|
||||
"w32" for consistency, emacsclient disambiguation, and maybe, one
|
||||
day, multi-window-system support.
|
||||
(file_dialog_callback): NTGUI_UNICODE changes; encode and decode
|
||||
Cygwin files for W32 GUI facilities, since these clearly don't
|
||||
expect Cygwin names.
|
||||
(_DebPrint): Define.
|
||||
(w32_strerror, w32_console_toggle_lock_key, w32_kbd_mods_to_emacs)
|
||||
(w32_kbd_patch_key, w32_sys_ring_bell): Move here.
|
||||
(Ssystem_move_file_to_trash): Define only for native WINDOWSNT.
|
||||
(w32_last_error): Remove.
|
||||
|
||||
* w32font.c: Define _strlwr to strlwr for non-WINDOWSNT builds.
|
||||
|
||||
* w32heap.c (syspage_mask): Declare here.
|
||||
(cache_system_info): Remove.
|
||||
|
||||
* w32inevt.c (faked_key): Define globally, not statically.
|
||||
(w32_kbd_mods_to_emacs, w32_kbd_patch_key, faked_key)
|
||||
(w32_console_toggle_lock_key): Move to w32fns.c.
|
||||
|
||||
* w32menu.c: Include setjmp.h. NTGUI_UNICODE changes throughout.
|
||||
|
||||
* w32proc.c (_DebPrint): Move to w32fns.c.
|
||||
* w32select.c: Include string.h, stdio.h for Cygwin.
|
||||
* w32select.h: New File.
|
||||
|
||||
* w32term.c: Include io.h for non-CYGWIN builds; needed for
|
||||
get_osfhandle.
|
||||
(w32_message_fd): New variable. Under Cygwin, holds the file
|
||||
descriptor the system used to tell us about pending thread
|
||||
messages.
|
||||
|
||||
(w32_init_term): Remove incorrect calls to fcntl and init_sigio
|
||||
that prevented compilation under non-WINDOWSNT systems.
|
||||
|
||||
(w32_initialize): Open /dev/windows and assign it to
|
||||
w32_message_fd. Provide w32 feature.
|
||||
|
||||
* w32term.h: Include frame.h, atimer.h. Declare various frame functions.
|
||||
(WM_EMACS_INPUT_READY): add.
|
||||
(prepend_msg, w32_message_fd): Declare globally.
|
||||
|
||||
* w32xfns.c:
|
||||
(keyboard_handle): Use only when WINDOWSNT.
|
||||
(notify_msg_ready): New function. Posts a message to the main
|
||||
thread's message queue under CYGWIN, which wakes up the main
|
||||
thread from select(2) by making the /dev/windows file descriptor
|
||||
ready. Under WINDOWSNT, it sets an event the same way the old
|
||||
code did.
|
||||
|
||||
(post, prepend_msg): Actually call notify_msg_ready instead of
|
||||
setting the input event directly.
|
||||
|
||||
2012-10-07 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
* ralloc.c (relinquish): If a heap is ready to be relinquished,
|
||||
|
|
|
@ -135,13 +135,10 @@ LIB_MATH=@LIB_MATH@
|
|||
## -lpthreads, or empty.
|
||||
LIB_PTHREAD=@LIB_PTHREAD@
|
||||
|
||||
LIBTIFF=@LIBTIFF@
|
||||
LIBJPEG=@LIBJPEG@
|
||||
LIBPNG=@LIBPNG@
|
||||
LIBGIF=@LIBGIF@
|
||||
LIBXPM=@LIBXPM@
|
||||
LIBIMAGE=@LIBTIFF@ @LIBJPEG@ @LIBPNG@ @LIBGIF@ @LIBXPM@
|
||||
|
||||
XFT_LIBS=@XFT_LIBS@
|
||||
LIBX_EXTRA=$(LIBTIFF) $(LIBJPEG) $(LIBPNG) $(LIBGIF) $(LIBXPM) -lX11 $(XFT_LIBS)
|
||||
LIBX_EXTRA=-lX11 $(XFT_LIBS)
|
||||
|
||||
FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
|
||||
FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
|
||||
|
@ -261,6 +258,13 @@ NS_OBJ=@NS_OBJ@
|
|||
NS_OBJC_OBJ=@NS_OBJC_OBJ@
|
||||
## Only set if NS_IMPL_GNUSTEP.
|
||||
GNU_OBJC_CFLAGS=@GNU_OBJC_CFLAGS@
|
||||
## w32fns.o w32menu.c w32reg.o fringe.o fontset.o w32font.o w32term.o
|
||||
## w32xfns.o w32select.o image.o w32uniscribe.o if HAVE_W32, else
|
||||
## empty.
|
||||
W32_OBJ=@W32_OBJ@
|
||||
## -lkernel32 -luser32 -lgdi32 -lole32 -lcomdlg32 lusp10 -lcomctl32
|
||||
## --lwinspool if HAVE_W32, else empty.
|
||||
W32_LIBS=@W32_LIBS@
|
||||
|
||||
## Empty if !HAVE_X_WINDOWS
|
||||
## xfont.o ftfont.o xftfont.o ftxfont.o if HAVE_XFT
|
||||
|
@ -342,7 +346,7 @@ base_obj = dispnew.o frame.o scroll.o xdisp.o menu.o $(XMENU_OBJ) window.o \
|
|||
doprnt.o intervals.o textprop.o composite.o xml.o \
|
||||
profiler.o \
|
||||
$(MSDOS_OBJ) $(MSDOS_X_OBJ) $(NS_OBJ) $(CYGWIN_OBJ) $(FONT_OBJ) \
|
||||
$(WINDOW_SYSTEM_OBJ)
|
||||
$(W32_OBJ) $(WINDOW_SYSTEM_OBJ)
|
||||
obj = $(base_obj) $(NS_OBJC_OBJ)
|
||||
|
||||
## Object files used on some machine or other.
|
||||
|
@ -351,9 +355,9 @@ obj = $(base_obj) $(NS_OBJC_OBJ)
|
|||
## in the list, in case they ever add any such entries.
|
||||
SOME_MACHINE_OBJECTS = dosfns.o msdos.o \
|
||||
xterm.o xfns.o xmenu.o xselect.o xrdb.o xsmfns.o fringe.o image.o \
|
||||
fontset.o dbusbind.o \
|
||||
fontset.o dbusbind.o cygw32.o \
|
||||
nsterm.o nsfns.o nsmenu.o nsselect.o nsimage.o nsfont.o \
|
||||
w32.o w32console.o w32fns.o w32heap.o w32inevt.o \
|
||||
w32.o w32console.o w32fns.o w32heap.o \
|
||||
w32menu.o w32proc.o w32reg.o w32select.o w32term.o w32xfns.o \
|
||||
w16select.o widget.o xfont.o ftfont.o xftfont.o ftxfont.o gtkutil.o \
|
||||
xsettings.o xgselect.o termcap.o
|
||||
|
@ -385,9 +389,11 @@ otherobj= $(TERMCAP_OBJ) $(PRE_ALLOC_OBJ) $(GMALLOC_OBJ) $(RALLOC_OBJ) \
|
|||
## Note that SunOS needs -lm to come before -lc; otherwise, you get
|
||||
## duplicated symbols. If the standard libraries were compiled
|
||||
## with GCC, we might need LIB_GCC again after them.
|
||||
LIBES = $(LIBS) $(LIBX_BASE) $(LIBX_OTHER) $(LIBSOUND) \
|
||||
$(RSVG_LIBS) $(IMAGEMAGICK_LIBS) $(LIB_CLOCK_GETTIME) $(LIB_TIMER_TIME) \
|
||||
$(DBUS_LIBS) $(LIB_EXECINFO) \
|
||||
LIBES = $(LIBS) $(W32_LIBS) $(LIBX_BASE) $(LIBIMAGE) \
|
||||
$(LIBX_OTHER) $(LIBSOUND) \
|
||||
$(RSVG_LIBS) $(IMAGEMAGICK_LIBS) $(LIB_CLOCK_GETTIME) \
|
||||
$(LIB_TIMER_TIME) $(DBUS_LIBS) \
|
||||
$(LIB_EXECINFO) \
|
||||
$(LIBXML2_LIBS) $(LIBGPM) $(LIBRESOLV) $(LIBS_SYSTEM) \
|
||||
$(LIBS_TERMCAP) $(GETLOADAVG_LIBS) $(SETTINGS_LIBS) $(LIBSELINUX_LIBS) \
|
||||
$(FREETYPE_LIBS) $(FONTCONFIG_LIBS) $(LIBOTF_LIBS) $(M17N_FLT_LIBS) \
|
||||
|
|
|
@ -142,6 +142,20 @@ You lose; /* Emacs for DOS must be compiled with DJGPP */
|
|||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_NTGUI) && !defined(DebPrint)
|
||||
# if defined(EMACSDEBUG)
|
||||
extern void _DebPrint (const char *fmt, ...);
|
||||
# define DebPrint(stuff) _DebPrint stuff
|
||||
# else
|
||||
# define DebPrint(stuff)
|
||||
# endif /* EMACSDEBUG */
|
||||
#endif /* DebPrint */
|
||||
|
||||
#if defined(CYGWIN) && defined(HAVE_NTGUI)
|
||||
#define NTGUI_UNICODE /* Cygwin runs only on UNICODE-supporting systems */
|
||||
#define _WIN32_WINNT 0x500 /* Win2k */
|
||||
#endif /* CYGWIN && HAVE_NTGUI */
|
||||
|
||||
#ifdef emacs /* Don't do this for lib-src. */
|
||||
/* Tell regex.c to use a type compatible with Emacs. */
|
||||
#define RE_TRANSLATE_TYPE Lisp_Object
|
||||
|
|
169
src/cygw32.c
Normal file
169
src/cygw32.c
Normal file
|
@ -0,0 +1,169 @@
|
|||
/* Cygwin support routines.
|
||||
Copyright (C) 2011 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.
|
||||
|
||||
GNU Emacs is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
|
||||
#include "cygw32.h"
|
||||
#include "character.h"
|
||||
#include "buffer.h"
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
static Lisp_Object Qutf_16_le;
|
||||
|
||||
static Lisp_Object
|
||||
fchdir_unwind (Lisp_Object dir_fd)
|
||||
{
|
||||
(void) fchdir (XFASTINT (dir_fd));
|
||||
(void) close (XFASTINT (dir_fd));
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
static void
|
||||
chdir_to_default_directory ()
|
||||
{
|
||||
Lisp_Object new_cwd;
|
||||
int old_cwd_fd = open (".", O_RDONLY | O_DIRECTORY);
|
||||
|
||||
if (old_cwd_fd == -1)
|
||||
error ("could not open current directory: %s", strerror (errno));
|
||||
|
||||
record_unwind_protect (fchdir_unwind, make_number (old_cwd_fd));
|
||||
|
||||
new_cwd = Funhandled_file_name_directory (
|
||||
Fexpand_file_name (build_string ("."), Qnil));
|
||||
if (!STRINGP (new_cwd))
|
||||
new_cwd = build_string ("/");
|
||||
|
||||
if (chdir (SDATA (ENCODE_FILE (new_cwd))))
|
||||
error ("could not chdir: %s", strerror (errno));
|
||||
}
|
||||
|
||||
static Lisp_Object
|
||||
conv_filename_to_w32_unicode (Lisp_Object in, int absolute_p)
|
||||
{
|
||||
ssize_t converted_len;
|
||||
Lisp_Object converted;
|
||||
unsigned flags;
|
||||
int count = SPECPDL_INDEX ();
|
||||
|
||||
chdir_to_default_directory ();
|
||||
|
||||
flags = CCP_POSIX_TO_WIN_W;
|
||||
if (!absolute_p) {
|
||||
flags |= CCP_RELATIVE;
|
||||
}
|
||||
|
||||
in = ENCODE_FILE (in);
|
||||
|
||||
converted_len = cygwin_conv_path (flags, SDATA (in), NULL, 0);
|
||||
if (converted_len < 2)
|
||||
error ("cygwin_conv_path: %s", strerror (errno));
|
||||
|
||||
converted = make_uninit_string (converted_len - 1);
|
||||
if (cygwin_conv_path (flags, SDATA (in),
|
||||
SDATA (converted), converted_len))
|
||||
error ("cygwin_conv_path: %s", strerror (errno));
|
||||
|
||||
return unbind_to (count, converted);
|
||||
}
|
||||
|
||||
static Lisp_Object
|
||||
conv_filename_from_w32_unicode (const wchar_t* in, int absolute_p)
|
||||
{
|
||||
ssize_t converted_len;
|
||||
Lisp_Object converted;
|
||||
unsigned flags;
|
||||
int count = SPECPDL_INDEX ();
|
||||
|
||||
chdir_to_default_directory ();
|
||||
|
||||
flags = CCP_WIN_W_TO_POSIX;
|
||||
if (!absolute_p) {
|
||||
flags |= CCP_RELATIVE;
|
||||
}
|
||||
|
||||
converted_len = cygwin_conv_path (flags, in, NULL, 0);
|
||||
if (converted_len < 1)
|
||||
error ("cygwin_conv_path: %s", strerror (errno));
|
||||
|
||||
converted = make_uninit_string (converted_len - 1 /*subtract terminator*/);
|
||||
if (cygwin_conv_path (flags, in, SDATA (converted), converted_len))
|
||||
error ("cygwin_conv_path: %s", strerror (errno));
|
||||
|
||||
return unbind_to (count, DECODE_FILE (converted));
|
||||
}
|
||||
|
||||
Lisp_Object
|
||||
from_unicode (Lisp_Object str)
|
||||
{
|
||||
CHECK_STRING (str);
|
||||
if (!STRING_MULTIBYTE (str) &&
|
||||
SBYTES (str) & 1)
|
||||
{
|
||||
str = Fsubstring (str, make_number (0), make_number (-1));
|
||||
}
|
||||
|
||||
return code_convert_string_norecord (str, Qutf_16_le, 0);
|
||||
}
|
||||
|
||||
wchar_t *
|
||||
to_unicode (Lisp_Object str, Lisp_Object *buf)
|
||||
{
|
||||
*buf = code_convert_string_norecord (str, Qutf_16_le, 1);
|
||||
/* We need to make a another copy (in addition to the one made by
|
||||
code_convert_string_norecord) to ensure that the final string is
|
||||
_doubly_ zero terminated --- that is, that the string is
|
||||
terminated by two zero bytes and one utf-16le null character.
|
||||
Because strings are already terminated with a single zero byte,
|
||||
we just add one additional zero. */
|
||||
str = make_uninit_string (SBYTES (*buf) + 1);
|
||||
memcpy (SDATA (str), SDATA (*buf), SBYTES (*buf));
|
||||
SDATA (str) [SBYTES (*buf)] = '\0';
|
||||
*buf = str;
|
||||
return WCSDATA (*buf);
|
||||
}
|
||||
|
||||
DEFUN ("cygwin-convert-path-to-windows",
|
||||
Fcygwin_convert_path_to_windows, Scygwin_convert_path_to_windows,
|
||||
1, 2, 0,
|
||||
doc: /* Convert PATH to a Windows path. If ABSOLUTE-P if
|
||||
non-nil, return an absolute path.*/)
|
||||
(Lisp_Object path, Lisp_Object absolute_p)
|
||||
{
|
||||
return from_unicode (
|
||||
conv_filename_to_w32_unicode (path, absolute_p == Qnil ? 0 : 1));
|
||||
}
|
||||
|
||||
DEFUN ("cygwin-convert-path-from-windows",
|
||||
Fcygwin_convert_path_from_windows, Scygwin_convert_path_from_windows,
|
||||
1, 2, 0,
|
||||
doc: /* Convert a Windows path to a Cygwin path. If ABSOLUTE-P
|
||||
if non-nil, return an absolute path.*/)
|
||||
(Lisp_Object path, Lisp_Object absolute_p)
|
||||
{
|
||||
return conv_filename_from_w32_unicode (to_unicode (path, &path),
|
||||
absolute_p == Qnil ? 0 : 1);
|
||||
}
|
||||
|
||||
void
|
||||
syms_of_cygw32 (void)
|
||||
{
|
||||
/* No, not utf-16-le: that one has a BOM. */
|
||||
DEFSYM (Qutf_16_le, "utf-16le");
|
||||
defsubr (&Scygwin_convert_path_from_windows);
|
||||
defsubr (&Scygwin_convert_path_to_windows);
|
||||
}
|
59
src/cygw32.h
Normal file
59
src/cygw32.h
Normal file
|
@ -0,0 +1,59 @@
|
|||
/* Header for Cygwin support routines.
|
||||
Copyright (C) 2011 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.
|
||||
|
||||
GNU Emacs is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef CYGW32_H
|
||||
#define CYGW32_H
|
||||
#include <config.h>
|
||||
#include <windef.h>
|
||||
#include <sys/cygwin.h>
|
||||
#include <wchar.h>
|
||||
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <limits.h>
|
||||
#include <errno.h>
|
||||
#include <math.h>
|
||||
#include <setjmp.h>
|
||||
|
||||
#include "lisp.h"
|
||||
#include "coding.h"
|
||||
|
||||
/* *** Character conversion *** */
|
||||
|
||||
/* Access the wide-character string stored in a Lisp string object. */
|
||||
#define WCSDATA(x) ((wchar_t *) SDATA (x))
|
||||
|
||||
/* Convert the Emacs string in STR to UTF-16LE and store a new string
|
||||
containing the encoded version of STR into *BUF. BUF may safely
|
||||
point to STR on entry. */
|
||||
extern wchar_t *to_unicode (Lisp_Object str, Lisp_Object *buf);
|
||||
|
||||
/* Convert STR, a UTF-16LE encoded string embedded in an Emacs string
|
||||
object, to a normal Emacs string and return it. */
|
||||
extern Lisp_Object from_unicode (Lisp_Object str);
|
||||
|
||||
/* *** Path conversion. *** */
|
||||
|
||||
EXFUN (Fcygwin_convert_path_to_windows, 2);
|
||||
EXFUN (Fcygwin_convert_path_from_windows, 2);
|
||||
|
||||
/* *** Misc *** */
|
||||
extern void syms_of_cygw32 (void);
|
||||
extern char * w32_strerror (int error_no);
|
||||
|
||||
#endif /* CYGW32_H */
|
|
@ -3144,7 +3144,7 @@ int draw_window_fringes (struct window *, int);
|
|||
int update_window_fringes (struct window *, int);
|
||||
void compute_fringe_widths (struct frame *, int);
|
||||
|
||||
#ifdef WINDOWSNT
|
||||
#ifdef HAVE_NTGUI
|
||||
void w32_init_fringe (struct redisplay_interface *);
|
||||
void w32_reset_fringes (void);
|
||||
#endif
|
||||
|
@ -3247,7 +3247,7 @@ extern char unspecified_fg[], unspecified_bg[];
|
|||
#ifdef HAVE_X_WINDOWS
|
||||
void gamma_correct (struct frame *, XColor *);
|
||||
#endif
|
||||
#ifdef WINDOWSNT
|
||||
#ifdef HAVE_NTGUI
|
||||
void gamma_correct (struct frame *, COLORREF *);
|
||||
#endif
|
||||
|
||||
|
|
66
src/emacs.c
66
src/emacs.c
|
@ -33,9 +33,20 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
|
||||
#ifdef WINDOWSNT
|
||||
#include <fcntl.h>
|
||||
#include <windows.h> /* just for w32.h */
|
||||
#include "w32.h"
|
||||
#include "w32heap.h" /* for prototype of sbrk */
|
||||
#endif
|
||||
|
||||
#if defined (WINDOWSNT)
|
||||
#include "w32heap.h"
|
||||
#endif
|
||||
|
||||
#if defined (WINDOWSNT) || defined (HAVE_NTGUI)
|
||||
#include "w32select.h"
|
||||
#include "w32font.h"
|
||||
#endif
|
||||
|
||||
#if defined (HAVE_NTGUI) && defined (CYGWIN)
|
||||
#include "cygw32.h"
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
|
@ -156,6 +167,22 @@ static void *my_heap_start;
|
|||
static uprintmax_t heap_bss_diff;
|
||||
#endif
|
||||
|
||||
/* To run as a daemon under Cocoa or Windows, we must do a fork+exec,
|
||||
not a simple fork.
|
||||
|
||||
On Cocoa, CoreFoundation lib fails in forked process:
|
||||
http://developer.apple.com/ReleaseNotes/
|
||||
CoreFoundation/CoreFoundation.html)
|
||||
|
||||
On Windows, a Cygwin fork child cannot access the USER subsystem.
|
||||
|
||||
We mark being in the exec'd process by a daemon name argument of
|
||||
form "--daemon=\nFD0,FD1\nNAME" where FD are the pipe file descriptors,
|
||||
NAME is the original daemon name, if any. */
|
||||
#if defined (NS_IMPL_COCOA) || defined (HAVE_NTGUI)
|
||||
# define DAEMON_MUST_EXEC
|
||||
#endif
|
||||
|
||||
/* True means running Emacs without interactive terminal. */
|
||||
bool noninteractive;
|
||||
|
||||
|
@ -669,9 +696,9 @@ main (int argc, char **argv)
|
|||
bool no_loadup = 0;
|
||||
char *junk = 0;
|
||||
char *dname_arg = 0;
|
||||
#ifdef NS_IMPL_COCOA
|
||||
#ifdef DAEMON_MUST_EXEC
|
||||
char dname_arg2[80];
|
||||
#endif
|
||||
#endif /* DAEMON_MUST_EXEC */
|
||||
char *ch_to_dir;
|
||||
|
||||
#if GC_MARK_STACK
|
||||
|
@ -964,25 +991,19 @@ main (int argc, char **argv)
|
|||
exit (1);
|
||||
}
|
||||
|
||||
#ifndef NS_IMPL_COCOA
|
||||
#ifndef DAEMON_MUST_EXEC
|
||||
#ifdef USE_GTK
|
||||
fprintf (stderr, "\nWarning: due to a long standing Gtk+ bug\nhttp://bugzilla.gnome.org/show_bug.cgi?id=85715\n\
|
||||
Emacs might crash when run in daemon mode and the X11 connection is unexpectedly lost.\n\
|
||||
Using an Emacs configured with --with-x-toolkit=lucid does not have this problem.\n");
|
||||
#endif
|
||||
#endif /* USE_GTK */
|
||||
f = fork ();
|
||||
#else /* NS_IMPL_COCOA */
|
||||
/* Under Cocoa we must do fork+exec as CoreFoundation lib fails in
|
||||
forked process: http://developer.apple.com/ReleaseNotes/
|
||||
CoreFoundation/CoreFoundation.html)
|
||||
We mark being in the exec'd process by a daemon name argument of
|
||||
form "--daemon=\nFD0,FD1\nNAME" where FD are the pipe file descriptors,
|
||||
NAME is the original daemon name, if any. */
|
||||
#else /* DAEMON_MUST_EXEC */
|
||||
if (!dname_arg || !strchr (dname_arg, '\n'))
|
||||
f = fork (); /* in orig */
|
||||
else
|
||||
f = 0; /* in exec'd */
|
||||
#endif /* NS_IMPL_COCOA */
|
||||
#endif /* !DAEMON_MUST_EXEC */
|
||||
if (f > 0)
|
||||
{
|
||||
int retval;
|
||||
|
@ -1018,7 +1039,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem
|
|||
exit (1);
|
||||
}
|
||||
|
||||
#ifdef NS_IMPL_COCOA
|
||||
#ifdef DAEMON_MUST_EXEC
|
||||
{
|
||||
/* In orig process, forked as child, OR in exec'd. */
|
||||
if (!dname_arg || !strchr (dname_arg, '\n'))
|
||||
|
@ -1054,7 +1075,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem
|
|||
dname_arg2);
|
||||
dname_arg = *dname_arg2 ? dname_arg2 : NULL;
|
||||
}
|
||||
#endif /* NS_IMPL_COCOA */
|
||||
#endif /* DAEMON_MUST_EXEC */
|
||||
|
||||
if (dname_arg)
|
||||
daemon_name = xstrdup (dname_arg);
|
||||
|
@ -1357,6 +1378,9 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem
|
|||
#ifdef WINDOWSNT
|
||||
syms_of_ntproc ();
|
||||
#endif /* WINDOWSNT */
|
||||
#if defined (CYGWIN) && defined (HAVE_NTGUI)
|
||||
syms_of_cygw32 ();
|
||||
#endif /* defined(CYGWIN) && defined (HAVE_NTGUI) */
|
||||
syms_of_window ();
|
||||
syms_of_xdisp ();
|
||||
syms_of_font ();
|
||||
|
@ -1387,11 +1411,14 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem
|
|||
#ifdef HAVE_NTGUI
|
||||
syms_of_w32term ();
|
||||
syms_of_w32fns ();
|
||||
syms_of_w32select ();
|
||||
syms_of_w32menu ();
|
||||
syms_of_fontset ();
|
||||
#endif /* HAVE_NTGUI */
|
||||
|
||||
#ifdef HAVE_W32SELECT
|
||||
syms_of_w32select ();
|
||||
#endif /* HAVE_W32SELECT */
|
||||
|
||||
#ifdef MSDOS
|
||||
syms_of_xmenu ();
|
||||
syms_of_dosfns ();
|
||||
|
@ -1436,8 +1463,11 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem
|
|||
globals_of_w32font ();
|
||||
globals_of_w32fns ();
|
||||
globals_of_w32menu ();
|
||||
globals_of_w32select ();
|
||||
#endif /* HAVE_NTGUI */
|
||||
|
||||
#ifdef HAVE_W32SELECT
|
||||
globals_of_w32select ();
|
||||
#endif /* HAVE_W32SELECT */
|
||||
}
|
||||
|
||||
init_charset ();
|
||||
|
|
|
@ -5208,9 +5208,9 @@ EMACS_FONT_LOG is set. Otherwise, it is set to t. */);
|
|||
#ifdef HAVE_BDFFONT
|
||||
syms_of_bdffont ();
|
||||
#endif /* HAVE_BDFFONT */
|
||||
#ifdef WINDOWSNT
|
||||
#ifdef HAVE_NTGUI
|
||||
syms_of_w32font ();
|
||||
#endif /* WINDOWSNT */
|
||||
#endif /* HAVE_NTGUI */
|
||||
#ifdef HAVE_NS
|
||||
syms_of_nsfont ();
|
||||
#endif /* HAVE_NS */
|
||||
|
|
|
@ -23,6 +23,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
#define EMACS_FONT_H
|
||||
|
||||
#include "ccl.h"
|
||||
#include "frame.h"
|
||||
|
||||
/* We have three types of Lisp objects related to font.
|
||||
|
||||
|
@ -818,11 +819,11 @@ extern struct font_driver ftxfont_driver;
|
|||
extern void syms_of_bdffont (void);
|
||||
#endif /* HAVE_BDFFONT */
|
||||
#endif /* HAVE_X_WINDOWS */
|
||||
#ifdef WINDOWSNT
|
||||
#ifdef HAVE_NTGUI
|
||||
extern struct font_driver w32font_driver;
|
||||
extern struct font_driver uniscribe_font_driver;
|
||||
extern void syms_of_w32font (void);
|
||||
#endif /* WINDOWSNT */
|
||||
#endif /* HAVE_NTGUI */
|
||||
#ifdef HAVE_NS
|
||||
extern Lisp_Object Qfontsize;
|
||||
extern struct font_driver nsfont_driver;
|
||||
|
|
|
@ -42,7 +42,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
#ifdef HAVE_X_WINDOWS
|
||||
#include "xterm.h"
|
||||
#endif
|
||||
#ifdef WINDOWSNT
|
||||
#ifdef HAVE_NTGUI
|
||||
#include "w32term.h"
|
||||
#endif
|
||||
#ifdef HAVE_NS
|
||||
|
|
|
@ -2697,7 +2697,7 @@ static const struct frame_parm_table frame_parms[] =
|
|||
{"tool-bar-position", &Qtool_bar_position},
|
||||
};
|
||||
|
||||
#ifdef WINDOWSNT
|
||||
#ifdef HAVE_NTGUI
|
||||
|
||||
/* Calculate fullscreen size. Return in *TOP_POS and *LEFT_POS the
|
||||
wanted positions of the WM window (not Emacs window).
|
||||
|
@ -2741,7 +2741,7 @@ x_fullscreen_adjust (struct frame *f, int *width, int *height, int *top_pos, int
|
|||
*height = newheight;
|
||||
}
|
||||
|
||||
#endif /* WINDOWSNT */
|
||||
#endif /* HAVE_NTGUI */
|
||||
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
|
||||
|
|
|
@ -618,7 +618,7 @@ typedef struct frame *FRAME_PTR;
|
|||
#define FRAME_INITIAL_P(f) ((f)->output_method == output_initial)
|
||||
#define FRAME_TERMCAP_P(f) ((f)->output_method == output_termcap)
|
||||
#define FRAME_X_P(f) ((f)->output_method == output_x_window)
|
||||
#ifndef WINDOWSNT
|
||||
#ifndef HAVE_NTGUI
|
||||
#define FRAME_W32_P(f) (0)
|
||||
#else
|
||||
#define FRAME_W32_P(f) ((f)->output_method == output_w32)
|
||||
|
@ -1210,7 +1210,7 @@ extern Lisp_Object x_new_font (struct frame *, Lisp_Object, int);
|
|||
|
||||
extern Lisp_Object Qface_set_after_frame_default;
|
||||
|
||||
#ifdef WINDOWSNT
|
||||
#ifdef HAVE_NTGUI
|
||||
extern void x_fullscreen_adjust (struct frame *f, int *, int *,
|
||||
int *, int *);
|
||||
#endif
|
||||
|
@ -1282,6 +1282,7 @@ extern char *x_get_resource_string (const char *, const char *);
|
|||
#endif
|
||||
|
||||
extern void x_query_colors (struct frame *f, XColor *, int);
|
||||
extern void x_query_color (struct frame *f, XColor *);
|
||||
|
||||
#endif /* HAVE_WINDOW_SYSTEM */
|
||||
|
||||
|
|
76
src/image.c
76
src/image.c
|
@ -75,7 +75,11 @@ typedef struct x_bitmap_record Bitmap_Record;
|
|||
#endif /* HAVE_X_WINDOWS */
|
||||
|
||||
#ifdef HAVE_NTGUI
|
||||
#include "w32.h"
|
||||
# ifdef WINDOWSNT
|
||||
/* We only need (or want) w32.h when we're _not_
|
||||
* compiling for Cygwin */
|
||||
# include "w32.h"
|
||||
# endif /* WINDOWSNT */
|
||||
/* W32_TODO : Color tables on W32. */
|
||||
#undef COLOR_TABLE_SUPPORT
|
||||
|
||||
|
@ -560,13 +564,14 @@ static struct image_type *lookup_image_type (Lisp_Object);
|
|||
static void x_laplace (struct frame *, struct image *);
|
||||
static void x_emboss (struct frame *, struct image *);
|
||||
static void x_build_heuristic_mask (struct frame *, struct image *,
|
||||
Lisp_Object);
|
||||
#ifdef HAVE_NTGUI
|
||||
Lisp_Object);
|
||||
#ifdef WINDOWSNT
|
||||
extern Lisp_Object Vlibrary_cache;
|
||||
#define CACHE_IMAGE_TYPE(type, status) \
|
||||
do { Vlibrary_cache = Fcons (Fcons (type, status), Vlibrary_cache); } while (0)
|
||||
#else
|
||||
#define CACHE_IMAGE_TYPE(type, status)
|
||||
#endif
|
||||
#endif /* WINDOWSNT */
|
||||
|
||||
#define ADD_IMAGE_TYPE(type) \
|
||||
do { Vimage_types = Fcons (type, Vimage_types); } while (0)
|
||||
|
@ -589,7 +594,7 @@ define_image_type (struct image_type *type)
|
|||
|
||||
if (type->init)
|
||||
{
|
||||
#ifdef HAVE_NTGUI
|
||||
#if defined (HAVE_NTGUI) && defined (WINDOWSNT)
|
||||
/* If we failed to load the library before, don't try again. */
|
||||
Lisp_Object tested = Fassq (target_type, Vlibrary_cache);
|
||||
if (CONSP (tested) && NILP (XCDR (tested)))
|
||||
|
@ -1834,7 +1839,7 @@ mark_image_cache (struct image_cache *c)
|
|||
X / NS / W32 support code
|
||||
***********************************************************************/
|
||||
|
||||
#ifdef HAVE_NTGUI
|
||||
#ifdef WINDOWSNT
|
||||
|
||||
/* Macro for defining functions that will be loaded from image DLLs. */
|
||||
#define DEF_IMGLIB_FN(rettype,func,args) static rettype (FAR CDECL *fn_##func)args
|
||||
|
@ -1845,7 +1850,7 @@ mark_image_cache (struct image_cache *c)
|
|||
if (!fn_##func) return 0; \
|
||||
}
|
||||
|
||||
#endif /* HAVE_NTGUI */
|
||||
#endif /* WINDOWSNT */
|
||||
|
||||
/* Return true if XIMG's size WIDTH x HEIGHT doesn't break the
|
||||
windowing system.
|
||||
|
@ -2897,7 +2902,7 @@ xbm_load (struct frame *f, struct image *img)
|
|||
else
|
||||
bits = (char *) XBOOL_VECTOR (data)->data;
|
||||
|
||||
#ifdef WINDOWSNT
|
||||
#ifdef HAVE_NTGUI
|
||||
{
|
||||
char *invertedBits;
|
||||
int nbytes, i;
|
||||
|
@ -3008,7 +3013,7 @@ static const struct image_keyword xpm_format[XPM_LAST] =
|
|||
{":background", IMAGE_STRING_OR_NIL_VALUE, 0}
|
||||
};
|
||||
|
||||
#ifdef HAVE_NTGUI
|
||||
#if defined(HAVE_NTGUI) && defined(WINDOWSNT)
|
||||
static bool init_xpm_functions (void);
|
||||
#else
|
||||
#define init_xpm_functions NULL
|
||||
|
@ -3207,7 +3212,7 @@ xpm_free_colors (Display *dpy, Colormap cmap, Pixel *pixels, int npixels, void *
|
|||
#endif /* ALLOC_XPM_COLORS */
|
||||
|
||||
|
||||
#ifdef HAVE_NTGUI
|
||||
#ifdef WINDOWSNT
|
||||
|
||||
/* XPM library details. */
|
||||
|
||||
|
@ -3233,8 +3238,15 @@ init_xpm_functions (void)
|
|||
return 1;
|
||||
}
|
||||
|
||||
#endif /* HAVE_NTGUI */
|
||||
#endif /* WINDOWSNT */
|
||||
|
||||
#ifdef HAVE_NTGUI
|
||||
/* Glue for code below */
|
||||
#define fn_XpmReadFileToImage XpmReadFileToImage
|
||||
#define fn_XpmCreateImageFromBuffer XpmCreateImageFromBuffer
|
||||
#define fn_XImageFree XImageFree
|
||||
#define fn_XpmFreeAttributes XpmFreeAttributes
|
||||
#endif /* HAVE_NTGUI */
|
||||
|
||||
/* Value is true if COLOR_SYMBOLS is a valid color symbols list
|
||||
for XPM images. Such a list must consist of conses whose car and
|
||||
|
@ -5340,7 +5352,7 @@ static const struct image_keyword png_format[PNG_LAST] =
|
|||
{":background", IMAGE_STRING_OR_NIL_VALUE, 0}
|
||||
};
|
||||
|
||||
#ifdef HAVE_NTGUI
|
||||
#if defined(HAVE_NTGUI) && defined (WINDOWSNT)
|
||||
static bool init_png_functions (void);
|
||||
#else
|
||||
#define init_png_functions NULL
|
||||
|
@ -5378,7 +5390,7 @@ png_image_p (Lisp_Object object)
|
|||
|
||||
#ifdef HAVE_PNG
|
||||
|
||||
#ifdef HAVE_NTGUI
|
||||
#ifdef WINDOWSNT
|
||||
/* PNG library details. */
|
||||
|
||||
DEF_IMGLIB_FN (png_voidp, png_get_io_ptr, (png_structp));
|
||||
|
@ -5478,7 +5490,7 @@ init_png_functions (void)
|
|||
#define fn_png_set_longjmp_fn png_set_longjmp_fn
|
||||
#endif /* libpng version >= 1.5 */
|
||||
|
||||
#endif /* HAVE_NTGUI */
|
||||
#endif /* WINDOWSNT */
|
||||
|
||||
/* Possibly inefficient/inexact substitutes for _setjmp and _longjmp.
|
||||
Do not use sys_setjmp, as PNG supports only jmp_buf. The _longjmp
|
||||
|
@ -5999,7 +6011,7 @@ static const struct image_keyword jpeg_format[JPEG_LAST] =
|
|||
{":background", IMAGE_STRING_OR_NIL_VALUE, 0}
|
||||
};
|
||||
|
||||
#ifdef HAVE_NTGUI
|
||||
#if defined(HAVE_NTGUI) && defined(WINDOWSNT)
|
||||
static bool init_jpeg_functions (void);
|
||||
#else
|
||||
#define init_jpeg_functions NULL
|
||||
|
@ -6049,14 +6061,20 @@ jpeg_image_p (Lisp_Object object)
|
|||
#define __WIN32__ 1
|
||||
#endif
|
||||
|
||||
/* Work around conflict between jpeg boolean and rpcndr.h
|
||||
under Windows. */
|
||||
#define boolean jpeg_boolean
|
||||
#include <jpeglib.h>
|
||||
#include <jerror.h>
|
||||
|
||||
/* Don't undefine boolean --- use the JPEG boolean
|
||||
through the rest of the file. */
|
||||
|
||||
#ifdef HAVE_STLIB_H_1
|
||||
#define HAVE_STDLIB_H 1
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_NTGUI
|
||||
#ifdef WINDOWSNT
|
||||
|
||||
/* JPEG library details. */
|
||||
DEF_IMGLIB_FN (void, jpeg_CreateDecompress, (j_decompress_ptr, int, size_t));
|
||||
|
@ -6106,7 +6124,7 @@ jpeg_resync_to_restart_wrapper (j_decompress_ptr cinfo, int desired)
|
|||
#define fn_jpeg_std_error jpeg_std_error
|
||||
#define jpeg_resync_to_restart_wrapper jpeg_resync_to_restart
|
||||
|
||||
#endif /* HAVE_NTGUI */
|
||||
#endif /* WINDOWSNT */
|
||||
|
||||
struct my_jpeg_error_mgr
|
||||
{
|
||||
|
@ -6630,7 +6648,7 @@ tiff_image_p (Lisp_Object object)
|
|||
|
||||
#include <tiffio.h>
|
||||
|
||||
#ifdef HAVE_NTGUI
|
||||
#ifdef WINDOWSNT
|
||||
|
||||
/* TIFF library details. */
|
||||
DEF_IMGLIB_FN (TIFFErrorHandler, TIFFSetErrorHandler, (TIFFErrorHandler));
|
||||
|
@ -6674,7 +6692,7 @@ init_tiff_functions (void)
|
|||
#define fn_TIFFReadRGBAImage TIFFReadRGBAImage
|
||||
#define fn_TIFFClose TIFFClose
|
||||
#define fn_TIFFSetDirectory TIFFSetDirectory
|
||||
#endif /* HAVE_NTGUI */
|
||||
#endif /* WINDOWSNT */
|
||||
|
||||
|
||||
/* Reading from a memory buffer for TIFF images Based on the PNG
|
||||
|
@ -7046,7 +7064,7 @@ static const struct image_keyword gif_format[GIF_LAST] =
|
|||
{":background", IMAGE_STRING_OR_NIL_VALUE, 0}
|
||||
};
|
||||
|
||||
#ifdef HAVE_NTGUI
|
||||
#if defined(HAVE_NTGUI) && defined(WINDOWSNT)
|
||||
static bool init_gif_functions (void);
|
||||
#else
|
||||
#define init_gif_functions NULL
|
||||
|
@ -7110,7 +7128,7 @@ gif_image_p (Lisp_Object object)
|
|||
#endif /* HAVE_NTGUI */
|
||||
|
||||
|
||||
#ifdef HAVE_NTGUI
|
||||
#ifdef WINDOWSNT
|
||||
|
||||
/* GIF library details. */
|
||||
DEF_IMGLIB_FN (int, DGifCloseFile, (GifFileType *));
|
||||
|
@ -7140,7 +7158,7 @@ init_gif_functions (void)
|
|||
#define fn_DGifOpen DGifOpen
|
||||
#define fn_DGifOpenFileName DGifOpenFileName
|
||||
|
||||
#endif /* HAVE_NTGUI */
|
||||
#endif /* WINDOWSNT */
|
||||
|
||||
/* Reading a GIF image from memory
|
||||
Based on the PNG memory stuff to a certain extent. */
|
||||
|
@ -8137,7 +8155,7 @@ svg_image_p (Lisp_Object object)
|
|||
|
||||
#include <librsvg/rsvg.h>
|
||||
|
||||
#ifdef HAVE_NTGUI
|
||||
#ifdef WINDOWSNT
|
||||
|
||||
/* SVG library functions. */
|
||||
DEF_IMGLIB_FN (RsvgHandle *, rsvg_handle_new);
|
||||
|
@ -8215,7 +8233,7 @@ init_svg_functions (void)
|
|||
#define fn_g_type_init g_type_init
|
||||
#define fn_g_object_unref g_object_unref
|
||||
#define fn_g_error_free g_error_free
|
||||
#endif /* !HAVE_NTGUI */
|
||||
#endif /* !WINDOWSNT */
|
||||
|
||||
/* Load SVG image IMG for use on frame F. Value is true if
|
||||
successful. */
|
||||
|
@ -8763,6 +8781,16 @@ DEFUN ("lookup-image", Flookup_image, Slookup_image, 1, 1, 0, "")
|
|||
Initialization
|
||||
***********************************************************************/
|
||||
|
||||
#ifdef WINDOWSNT
|
||||
/* Image types that rely on external libraries are loaded dynamically
|
||||
if the library is available. */
|
||||
#define CHECK_LIB_AVAILABLE(image_type, init_lib_fn, libraries) \
|
||||
define_image_type (image_type, init_lib_fn (libraries))
|
||||
#else
|
||||
#define CHECK_LIB_AVAILABLE(image_type, init_lib_fn, libraries) \
|
||||
define_image_type (image_type, 1)
|
||||
#endif /* WINDOWSNT */
|
||||
|
||||
DEFUN ("init-image-library", Finit_image_library, Sinit_image_library, 1, 1, 0,
|
||||
doc: /* Initialize image library implementing image type TYPE.
|
||||
Return non-nil if TYPE is a supported image type.
|
||||
|
|
|
@ -313,7 +313,7 @@ static Lisp_Object Qmouse_fixup_help_message;
|
|||
/* Symbols to denote kinds of events. */
|
||||
static Lisp_Object Qfunction_key;
|
||||
Lisp_Object Qmouse_click;
|
||||
#if defined (WINDOWSNT)
|
||||
#if defined (HAVE_NTGUI)
|
||||
Lisp_Object Qlanguage_change;
|
||||
#endif
|
||||
static Lisp_Object Qdrag_n_drop;
|
||||
|
@ -3766,8 +3766,8 @@ kbd_buffer_get_event (KBOARD **kbp,
|
|||
#ifdef subprocesses
|
||||
if (kbd_on_hold_p () && kbd_buffer_nr_stored () < KBD_BUFFER_SIZE/4)
|
||||
{
|
||||
/* Start reading input again, we have processed enough so we can
|
||||
accept new events again. */
|
||||
/* Start reading input again because we have processed enough to
|
||||
be able to accept new events again. */
|
||||
unhold_keyboard_input ();
|
||||
start_polling ();
|
||||
}
|
||||
|
@ -3947,7 +3947,7 @@ kbd_buffer_get_event (KBOARD **kbp,
|
|||
x_activate_menubar (XFRAME (event->frame_or_window));
|
||||
}
|
||||
#endif
|
||||
#if defined (WINDOWSNT)
|
||||
#if defined (HAVE_NTGUI)
|
||||
else if (event->kind == LANGUAGE_CHANGE_EVENT)
|
||||
{
|
||||
/* Make an event (language-change (FRAME CODEPAGE LANGUAGE-ID)). */
|
||||
|
@ -5417,7 +5417,7 @@ make_lispy_event (struct input_event *event)
|
|||
(sizeof (lispy_function_keys)
|
||||
/ sizeof (lispy_function_keys[0])));
|
||||
|
||||
#ifdef WINDOWSNT
|
||||
#ifdef HAVE_NTGUI
|
||||
case MULTIMEDIA_KEY_EVENT:
|
||||
if (event->code < (sizeof (lispy_multimedia_keys)
|
||||
/ sizeof (lispy_multimedia_keys[0]))
|
||||
|
@ -11394,7 +11394,7 @@ syms_of_keyboard (void)
|
|||
DEFSYM (Qconfig_changed_event, "config-changed-event");
|
||||
DEFSYM (Qmenu_enable, "menu-enable");
|
||||
|
||||
#if defined (WINDOWSNT)
|
||||
#if defined (HAVE_NTGUI)
|
||||
DEFSYM (Qlanguage_change, "language-change");
|
||||
#endif
|
||||
|
||||
|
|
|
@ -551,7 +551,7 @@ extern int tty_read_avail_input (struct terminal *, struct input_event *);
|
|||
extern EMACS_TIME timer_check (void);
|
||||
extern void mark_kboards (void);
|
||||
|
||||
#ifdef WINDOWSNT
|
||||
#ifdef HAVE_NTGUI
|
||||
extern const char *const lispy_function_keys[];
|
||||
#endif
|
||||
|
||||
|
|
|
@ -40,7 +40,11 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
#endif /* HAVE_WINDOW_SYSTEM */
|
||||
|
||||
#ifdef HAVE_NTGUI
|
||||
# ifdef NTGUI_UNICODE
|
||||
# define unicode_append_menu AppendMenuW
|
||||
# else /* !NTGUI_UNICODE */
|
||||
extern AppendMenuW_Proc unicode_append_menu;
|
||||
# endif /* NTGUI_UNICODE */
|
||||
extern HMENU current_popup_menu;
|
||||
#endif /* HAVE_NTGUI */
|
||||
|
||||
|
|
|
@ -4646,6 +4646,7 @@ wait_reading_process_output (intmax_t time_limit, int nsecs, int read_kbd,
|
|||
process_output_skip = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined (USE_GTK) || defined (HAVE_GCONF) || defined (HAVE_GSETTINGS)
|
||||
nfds = xg_select
|
||||
#elif defined (HAVE_NS)
|
||||
|
|
|
@ -107,9 +107,9 @@ enum event_kind
|
|||
HORIZ_WHEEL_EVENT, /* A wheel event generated by a second
|
||||
horizontal wheel that is present on some
|
||||
mice. See WHEEL_EVENT. */
|
||||
#if defined (WINDOWSNT)
|
||||
#if defined (HAVE_NTGUI)
|
||||
LANGUAGE_CHANGE_EVENT, /* A LANGUAGE_CHANGE_EVENT is
|
||||
generated on WINDOWSNT or Mac OS
|
||||
generated when HAVE_NTGUI or on Mac OS
|
||||
when the keyboard layout or input
|
||||
language is changed by the
|
||||
user. */
|
||||
|
@ -188,7 +188,7 @@ enum event_kind
|
|||
|
||||
, CONFIG_CHANGED_EVENT
|
||||
|
||||
#ifdef WINDOWSNT
|
||||
#ifdef HAVE_NTGUI
|
||||
/* Generated when an APPCOMMAND event is received, in response to
|
||||
Multimedia or Internet buttons on some keyboards.
|
||||
Such keys are available as normal function keys on X through the
|
||||
|
|
|
@ -83,7 +83,7 @@ DWORD_PTR extra_bss_size_static = 0;
|
|||
PIMAGE_SECTION_HEADER heap_section;
|
||||
|
||||
#ifdef HAVE_NTGUI
|
||||
HINSTANCE hinst = NULL;
|
||||
extern HINSTANCE hinst;
|
||||
HINSTANCE hprevinst = NULL;
|
||||
LPSTR lpCmdLine = "";
|
||||
int nCmdShow = 0;
|
||||
|
|
19
src/w32.c
19
src/w32.c
|
@ -31,13 +31,13 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
#include <sys/file.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/utime.h>
|
||||
#include <mbstring.h> /* for _mbspbrk */
|
||||
#include <math.h>
|
||||
#include <time.h>
|
||||
|
||||
/* must include CRT headers *before* config.h */
|
||||
|
||||
#include <config.h>
|
||||
#include <mbstring.h> /* for _mbspbrk */
|
||||
|
||||
#undef access
|
||||
#undef chdir
|
||||
|
@ -866,23 +866,6 @@ create_symbolic_link (LPTSTR lpSymlinkFilename,
|
|||
return retval;
|
||||
}
|
||||
|
||||
/* Equivalent of strerror for W32 error codes. */
|
||||
char *
|
||||
w32_strerror (int error_no)
|
||||
{
|
||||
static char buf[500];
|
||||
|
||||
if (error_no == 0)
|
||||
error_no = GetLastError ();
|
||||
|
||||
buf[0] = '\0';
|
||||
if (!FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL,
|
||||
error_no,
|
||||
0, /* choose most suitable language */
|
||||
buf, sizeof (buf), NULL))
|
||||
sprintf (buf, "w32 error %u", error_no);
|
||||
return buf;
|
||||
}
|
||||
|
||||
/* Return 1 if P is a valid pointer to an object of size SIZE. Return
|
||||
0 if P is NOT a valid pointer. Return -1 if we cannot validate P.
|
||||
|
|
17
src/w32.h
17
src/w32.h
|
@ -19,6 +19,12 @@ GNU General Public License for more details.
|
|||
You should have received a copy of the GNU General Public License
|
||||
along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifdef CYGWIN
|
||||
#error "w32.h is not compatible with Cygwin"
|
||||
#endif
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
|
||||
/* File descriptor set emulation. */
|
||||
|
||||
|
@ -130,17 +136,6 @@ extern LPBYTE w32_get_resource (char * key, LPDWORD type);
|
|||
extern void init_ntproc (int);
|
||||
extern void term_ntproc (int);
|
||||
extern void globals_of_w32 (void);
|
||||
extern void syms_of_w32term (void);
|
||||
extern void syms_of_w32fns (void);
|
||||
extern void globals_of_w32fns (void);
|
||||
extern void syms_of_w32select (void);
|
||||
extern void globals_of_w32select (void);
|
||||
extern void term_w32select (void);
|
||||
extern void syms_of_w32menu (void);
|
||||
extern void globals_of_w32menu (void);
|
||||
extern void syms_of_fontset (void);
|
||||
extern void syms_of_w32font (void);
|
||||
extern void check_windows_init_file (void);
|
||||
|
||||
extern void term_timers (void);
|
||||
extern void init_timers (void);
|
||||
|
|
|
@ -36,6 +36,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
#include "termhooks.h"
|
||||
#include "termchar.h"
|
||||
#include "dispextern.h"
|
||||
#include "w32term.h"
|
||||
#include "w32heap.h" /* for os_subtype */
|
||||
#include "w32inevt.h"
|
||||
|
||||
|
@ -430,53 +431,6 @@ w32con_delete_glyphs (struct frame *f, int n)
|
|||
scroll_line (f, n, LEFT);
|
||||
}
|
||||
|
||||
static unsigned int sound_type = 0xFFFFFFFF;
|
||||
#define MB_EMACS_SILENT (0xFFFFFFFF - 1)
|
||||
|
||||
void
|
||||
w32_sys_ring_bell (struct frame *f)
|
||||
{
|
||||
if (sound_type == 0xFFFFFFFF)
|
||||
{
|
||||
Beep (666, 100);
|
||||
}
|
||||
else if (sound_type == MB_EMACS_SILENT)
|
||||
{
|
||||
/* Do nothing. */
|
||||
}
|
||||
else
|
||||
MessageBeep (sound_type);
|
||||
}
|
||||
|
||||
DEFUN ("set-message-beep", Fset_message_beep, Sset_message_beep, 1, 1, 0,
|
||||
doc: /* Set the sound generated when the bell is rung.
|
||||
SOUND is 'asterisk, 'exclamation, 'hand, 'question, 'ok, or 'silent
|
||||
to use the corresponding system sound for the bell. The 'silent sound
|
||||
prevents Emacs from making any sound at all.
|
||||
SOUND is nil to use the normal beep. */)
|
||||
(Lisp_Object sound)
|
||||
{
|
||||
CHECK_SYMBOL (sound);
|
||||
|
||||
if (NILP (sound))
|
||||
sound_type = 0xFFFFFFFF;
|
||||
else if (EQ (sound, intern ("asterisk")))
|
||||
sound_type = MB_ICONASTERISK;
|
||||
else if (EQ (sound, intern ("exclamation")))
|
||||
sound_type = MB_ICONEXCLAMATION;
|
||||
else if (EQ (sound, intern ("hand")))
|
||||
sound_type = MB_ICONHAND;
|
||||
else if (EQ (sound, intern ("question")))
|
||||
sound_type = MB_ICONQUESTION;
|
||||
else if (EQ (sound, intern ("ok")))
|
||||
sound_type = MB_OK;
|
||||
else if (EQ (sound, intern ("silent")))
|
||||
sound_type = MB_EMACS_SILENT;
|
||||
else
|
||||
sound_type = 0xFFFFFFFF;
|
||||
|
||||
return sound;
|
||||
}
|
||||
|
||||
static void
|
||||
w32con_reset_terminal_modes (struct terminal *t)
|
||||
|
@ -850,5 +804,4 @@ scroll-back buffer. */);
|
|||
defsubr (&Sset_screen_color);
|
||||
defsubr (&Sget_screen_color);
|
||||
defsubr (&Sset_cursor_size);
|
||||
defsubr (&Sset_message_beep);
|
||||
}
|
||||
|
|
757
src/w32fns.c
757
src/w32fns.c
|
@ -44,8 +44,14 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
#include "fontset.h"
|
||||
#include "systime.h"
|
||||
#include "termhooks.h"
|
||||
|
||||
#include "w32heap.h"
|
||||
|
||||
#if CYGWIN
|
||||
#include "cygw32.h"
|
||||
#else
|
||||
#include "w32.h"
|
||||
#endif
|
||||
|
||||
#include "bitmaps/gray.xbm"
|
||||
|
||||
|
@ -58,9 +64,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
|
||||
#include <dlgs.h>
|
||||
#include <imm.h>
|
||||
#define FILE_NAME_TEXT_FIELD edt1
|
||||
#define FILE_NAME_COMBO_BOX cmb13
|
||||
#define FILE_NAME_LIST lst1
|
||||
|
||||
#include "font.h"
|
||||
#include "w32font.h"
|
||||
|
@ -78,6 +81,7 @@ extern int w32_console_toggle_lock_key (int, Lisp_Object);
|
|||
extern void w32_menu_display_help (HWND, HMENU, UINT, UINT);
|
||||
extern void w32_free_menu_strings (HWND);
|
||||
extern const char *map_w32_filename (const char *, const char **);
|
||||
extern char * w32_strerror (int error_no);
|
||||
|
||||
/* If non-NULL, a handle to a frame where to display the hourglass cursor. */
|
||||
static HWND hourglass_hwnd = NULL;
|
||||
|
@ -161,7 +165,11 @@ ImmSetCompositionWindow_Proc set_ime_composition_window_fn = NULL;
|
|||
MonitorFromPoint_Proc monitor_from_point_fn = NULL;
|
||||
GetMonitorInfo_Proc get_monitor_info_fn = NULL;
|
||||
|
||||
#ifdef NTGUI_UNICODE
|
||||
#define unicode_append_menu AppendMenuW
|
||||
#else /* !NTGUI_UNICODE */
|
||||
extern AppendMenuW_Proc unicode_append_menu;
|
||||
#endif /* NTGUI_UNICODE */
|
||||
|
||||
/* Flag to selectively ignore WM_IME_CHAR messages. */
|
||||
static int ignore_ime_char = 0;
|
||||
|
@ -198,6 +206,33 @@ extern int uniscribe_available;
|
|||
static void w32_show_hourglass (struct frame *);
|
||||
static void w32_hide_hourglass (void);
|
||||
|
||||
#ifdef WINDOWSNT
|
||||
/* From w32inevet.c */
|
||||
extern int faked_key;
|
||||
#endif /* WINDOWSNT */
|
||||
|
||||
/* This gives us the page size and the size of the allocation unit on NT. */
|
||||
SYSTEM_INFO sysinfo_cache;
|
||||
|
||||
/* This gives us version, build, and platform identification. */
|
||||
OSVERSIONINFO osinfo_cache;
|
||||
|
||||
unsigned long syspage_mask = 0;
|
||||
|
||||
/* The major and minor versions of NT. */
|
||||
int w32_major_version;
|
||||
int w32_minor_version;
|
||||
int w32_build_number;
|
||||
|
||||
/* Distinguish between Windows NT and Windows 95. */
|
||||
int os_subtype;
|
||||
|
||||
#ifdef HAVE_NTGUI
|
||||
HINSTANCE hinst = NULL;
|
||||
#endif
|
||||
|
||||
static unsigned int sound_type = 0xFFFFFFFF;
|
||||
#define MB_EMACS_SILENT (0xFFFFFFFF - 1)
|
||||
|
||||
|
||||
/* Error if we are not connected to MS-Windows. */
|
||||
|
@ -1068,7 +1103,7 @@ gamma_correct (struct frame *f, COLORREF *color)
|
|||
If ALLOC is nonzero, allocate a new colormap cell. */
|
||||
|
||||
int
|
||||
w32_defined_color (FRAME_PTR f, char *color, XColor *color_def, int alloc)
|
||||
w32_defined_color (FRAME_PTR f, const char *color, XColor *color_def, int alloc)
|
||||
{
|
||||
register Lisp_Object tem;
|
||||
COLORREF w32_color_ref;
|
||||
|
@ -1843,10 +1878,7 @@ w32_createwindow (struct frame *f)
|
|||
|
||||
/* Do first time app init */
|
||||
|
||||
if (!hprevinst)
|
||||
{
|
||||
w32_init_class (hinst);
|
||||
}
|
||||
w32_init_class (hinst);
|
||||
|
||||
if (f->size_hint_flags & USPosition || f->size_hint_flags & PPosition)
|
||||
{
|
||||
|
@ -2246,6 +2278,58 @@ unregister_hot_keys (HWND hwnd)
|
|||
}
|
||||
}
|
||||
|
||||
#if EMACSDEBUG
|
||||
const char*
|
||||
w32_name_of_message (UINT msg)
|
||||
{
|
||||
unsigned i;
|
||||
static char buf[64];
|
||||
static const struct {
|
||||
UINT msg;
|
||||
const char* name;
|
||||
} msgnames[] = {
|
||||
#define M(msg) { msg, # msg }
|
||||
M (WM_PAINT),
|
||||
M (WM_TIMER),
|
||||
M (WM_USER),
|
||||
M (WM_MOUSEMOVE),
|
||||
M (WM_LBUTTONUP),
|
||||
M (WM_KEYDOWN),
|
||||
M (WM_EMACS_KILL),
|
||||
M (WM_EMACS_CREATEWINDOW),
|
||||
M (WM_EMACS_DONE),
|
||||
M (WM_EMACS_CREATESCROLLBAR),
|
||||
M (WM_EMACS_SHOWWINDOW),
|
||||
M (WM_EMACS_SETWINDOWPOS),
|
||||
M (WM_EMACS_DESTROYWINDOW),
|
||||
M (WM_EMACS_TRACKPOPUPMENU),
|
||||
M (WM_EMACS_SETFOCUS),
|
||||
M (WM_EMACS_SETFOREGROUND),
|
||||
M (WM_EMACS_SETLOCALE),
|
||||
M (WM_EMACS_SETKEYBOARDLAYOUT),
|
||||
M (WM_EMACS_REGISTER_HOT_KEY),
|
||||
M (WM_EMACS_UNREGISTER_HOT_KEY),
|
||||
M (WM_EMACS_TOGGLE_LOCK_KEY),
|
||||
M (WM_EMACS_TRACK_CARET),
|
||||
M (WM_EMACS_DESTROY_CARET),
|
||||
M (WM_EMACS_SHOW_CARET),
|
||||
M (WM_EMACS_HIDE_CARET),
|
||||
M (WM_EMACS_SETCURSOR),
|
||||
M (WM_EMACS_PAINT),
|
||||
M (WM_CHAR),
|
||||
#undef M
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
for (i = 0; msgnames[i].name; ++i)
|
||||
if (msgnames[i].msg == msg)
|
||||
return msgnames[i].name;
|
||||
|
||||
sprintf (buf, "message 0x%04x", (unsigned)msg);
|
||||
return buf;
|
||||
}
|
||||
#endif /* EMACSDEBUG */
|
||||
|
||||
/* Here's an overview of how Emacs input works on MS-Windows.
|
||||
|
||||
System messages are read and processed by w32_msg_pump below. This
|
||||
|
@ -2265,7 +2349,12 @@ unregister_hot_keys (HWND hwnd)
|
|||
messages immediately, or converts them into Emacs input events and
|
||||
stuffs them into kbd_buffer, where kbd_buffer_get_event can get at
|
||||
them and process them when read_char and its callers require
|
||||
input. */
|
||||
input.
|
||||
|
||||
Under Cygwin with the W32 toolkit, the use of /dev/windows with
|
||||
select(2) takes the place of w32_read_socket.
|
||||
|
||||
*/
|
||||
|
||||
/* Main message dispatch loop. */
|
||||
|
||||
|
@ -2280,6 +2369,10 @@ w32_msg_pump (deferred_msg * msg_buf)
|
|||
|
||||
while ((w32_unicode_gui ? GetMessageW : GetMessageA) (&msg, NULL, 0, 0))
|
||||
{
|
||||
|
||||
/* DebPrint (("w32_msg_pump: %s time:%u\n", */
|
||||
/* w32_name_of_message (msg.message), msg.time)); */
|
||||
|
||||
if (msg.hwnd == NULL)
|
||||
{
|
||||
switch (msg.message)
|
||||
|
@ -2367,7 +2460,7 @@ w32_msg_pump (deferred_msg * msg_buf)
|
|||
/* Broadcast messages make it here, so you need to be looking
|
||||
for something in particular for this to be useful. */
|
||||
default:
|
||||
DebPrint (("msg %x not expected by w32_msg_pump\n", msg.message));
|
||||
DebPrint (("msg %x not expected by w32_msg_pump\n", msg.message));
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
@ -4703,6 +4796,37 @@ If omitted or nil, that stands for the selected frame's display. */)
|
|||
{
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
DEFUN ("set-message-beep", Fset_message_beep, Sset_message_beep, 1, 1, 0,
|
||||
doc: /* Set the sound generated when the bell is rung.
|
||||
SOUND is 'asterisk, 'exclamation, 'hand, 'question, 'ok, or 'silent
|
||||
to use the corresponding system sound for the bell. The 'silent sound
|
||||
prevents Emacs from making any sound at all.
|
||||
SOUND is nil to use the normal beep. */)
|
||||
(Lisp_Object sound)
|
||||
{
|
||||
CHECK_SYMBOL (sound);
|
||||
|
||||
if (NILP (sound))
|
||||
sound_type = 0xFFFFFFFF;
|
||||
else if (EQ (sound, intern ("asterisk")))
|
||||
sound_type = MB_ICONASTERISK;
|
||||
else if (EQ (sound, intern ("exclamation")))
|
||||
sound_type = MB_ICONEXCLAMATION;
|
||||
else if (EQ (sound, intern ("hand")))
|
||||
sound_type = MB_ICONHAND;
|
||||
else if (EQ (sound, intern ("question")))
|
||||
sound_type = MB_ICONQUESTION;
|
||||
else if (EQ (sound, intern ("ok")))
|
||||
sound_type = MB_OK;
|
||||
else if (EQ (sound, intern ("silent")))
|
||||
sound_type = MB_EMACS_SILENT;
|
||||
else
|
||||
sound_type = 0xFFFFFFFF;
|
||||
|
||||
return sound;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
x_pixel_width (register struct frame *f)
|
||||
|
@ -4784,12 +4908,21 @@ terminate Emacs if we can't open the connection.
|
|||
unsigned char *xrm_option;
|
||||
struct w32_display_info *dpyinfo;
|
||||
|
||||
CHECK_STRING (display);
|
||||
|
||||
/* Signal an error in order to encourage correct use from callers.
|
||||
* If we ever support multiple window systems in the same Emacs,
|
||||
* we'll need callers to be precise about what window system they
|
||||
* want. */
|
||||
|
||||
if (strcmp (SSDATA (display), "w32") != 0)
|
||||
error ("The name of the display in this Emacs must be \"w32\"");
|
||||
|
||||
/* If initialization has already been done, return now to avoid
|
||||
overwriting critical parts of one_w32_display_info. */
|
||||
if (w32_in_use)
|
||||
return Qnil;
|
||||
|
||||
CHECK_STRING (display);
|
||||
if (! NILP (xrm_string))
|
||||
CHECK_STRING (xrm_string);
|
||||
|
||||
|
@ -5860,6 +5993,18 @@ Value is t if tooltip was open, nil otherwise. */)
|
|||
File selection dialog
|
||||
***********************************************************************/
|
||||
|
||||
#define FILE_NAME_TEXT_FIELD edt1
|
||||
#define FILE_NAME_COMBO_BOX cmb13
|
||||
#define FILE_NAME_LIST lst1
|
||||
|
||||
#ifdef NTGUI_UNICODE
|
||||
#define GUISTR(x) (L ## x)
|
||||
typedef wchar_t guichar_t;
|
||||
#else /* !NTGUI_UNICODE */
|
||||
#define GUISTR(x) x
|
||||
typedef char guichar_t;
|
||||
#endif /* NTGUI_UNICODE */
|
||||
|
||||
/* Callback for altering the behavior of the Open File dialog.
|
||||
Makes the Filename text field contain "Current Directory" and be
|
||||
read-only when "Directories" is selected in the filter. This
|
||||
|
@ -5870,7 +6015,11 @@ file_dialog_callback (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|||
{
|
||||
if (msg == WM_NOTIFY)
|
||||
{
|
||||
OFNOTIFY * notify = (OFNOTIFY *)lParam;
|
||||
#ifdef NTGUI_UNICODE
|
||||
OFNOTIFYW * notify = (OFNOTIFYW *)lParam;
|
||||
#else /* !NTGUI_UNICODE */
|
||||
OFNOTIFYA * notify = (OFNOTIFYA *)lParam;
|
||||
#endif /* NTGUI_UNICODE */
|
||||
/* Detect when the Filter dropdown is changed. */
|
||||
if (notify->hdr.code == CDN_TYPECHANGE
|
||||
|| notify->hdr.code == CDN_INITDONE)
|
||||
|
@ -5898,7 +6047,7 @@ file_dialog_callback (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|||
if (notify->lpOFN->nFilterIndex == 2)
|
||||
{
|
||||
CommDlg_OpenSave_SetControlText (dialog, FILE_NAME_TEXT_FIELD,
|
||||
"Current Directory");
|
||||
GUISTR ("Current Directory"));
|
||||
EnableWindow (edit_control, FALSE);
|
||||
/* Note that at least on Windows 7, the above call to EnableWindow
|
||||
disables the window that would ordinarily have focus. If we
|
||||
|
@ -5914,7 +6063,8 @@ file_dialog_callback (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|||
/* Don't override default filename on init done. */
|
||||
if (notify->hdr.code == CDN_TYPECHANGE)
|
||||
CommDlg_OpenSave_SetControlText (dialog,
|
||||
FILE_NAME_TEXT_FIELD, "");
|
||||
FILE_NAME_TEXT_FIELD,
|
||||
GUISTR (""));
|
||||
EnableWindow (edit_control, TRUE);
|
||||
}
|
||||
}
|
||||
|
@ -5922,19 +6072,6 @@ file_dialog_callback (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Since we compile with _WIN32_WINNT set to 0x0400 (for NT4 compatibility)
|
||||
we end up with the old file dialogs. Define a big enough struct for the
|
||||
new dialog to trick GetOpenFileName into giving us the new dialogs on
|
||||
Windows 2000 and XP. */
|
||||
typedef struct
|
||||
{
|
||||
OPENFILENAME real_details;
|
||||
void * pReserved;
|
||||
DWORD dwReserved;
|
||||
DWORD FlagsEx;
|
||||
} NEWOPENFILENAME;
|
||||
|
||||
|
||||
DEFUN ("x-file-dialog", Fx_file_dialog, Sx_file_dialog, 2, 5, 0,
|
||||
doc: /* Read file name, prompting with PROMPT in directory DIR.
|
||||
Use a file selection dialog. Select DEFAULT-FILENAME in the dialog's file
|
||||
|
@ -5946,134 +6083,203 @@ Motif or Gtk toolkits. With the Motif toolkit, ONLY-DIR-P is ignored.
|
|||
Otherwise, if ONLY-DIR-P is non-nil, the user can only select directories. */)
|
||||
(Lisp_Object prompt, Lisp_Object dir, Lisp_Object default_filename, Lisp_Object mustmatch, Lisp_Object only_dir_p)
|
||||
{
|
||||
/* Filter index: 1: All Files, 2: Directories only */
|
||||
static const guichar_t filter[] =
|
||||
GUISTR ("All Files (*.*)\0*.*\0Directories\0*|*\0");
|
||||
|
||||
Lisp_Object filename = default_filename;
|
||||
struct frame *f = SELECTED_FRAME ();
|
||||
Lisp_Object file = Qnil;
|
||||
ptrdiff_t count = SPECPDL_INDEX ();
|
||||
BOOL file_opened = FALSE;
|
||||
Lisp_Object orig_dir = dir;
|
||||
Lisp_Object orig_prompt = prompt;
|
||||
|
||||
/* If we compile with _WIN32_WINNT set to 0x0400 (for NT4
|
||||
compatibility) we end up with the old file dialogs. Define a big
|
||||
enough struct for the new dialog to trick GetOpenFileName into
|
||||
giving us the new dialogs on newer versions of Windows. */
|
||||
struct {
|
||||
#ifdef NTGUI_UNICODE
|
||||
OPENFILENAMEW details;
|
||||
#else /* !NTGUI_UNICODE */
|
||||
OPENFILENAMEA details;
|
||||
#endif /* NTGUI_UNICODE */
|
||||
|
||||
#if _WIN32_WINNT < 0x500 /* < win2k */
|
||||
PVOID pvReserved;
|
||||
DWORD dwReserved;
|
||||
DWORD FlagsEx;
|
||||
#endif /* < win2k */
|
||||
} new_file_details;
|
||||
|
||||
#ifdef NTGUI_UNICODE
|
||||
wchar_t filename_buf[MAX_PATH + 1];
|
||||
OPENFILENAMEW * file_details = &new_file_details.details;
|
||||
#else /* not NTGUI_UNICODE */
|
||||
char filename_buf[MAX_PATH + 1];
|
||||
OPENFILENAMEA * file_details = &new_file_details.details;
|
||||
#endif /* NTGUI_UNICODE */
|
||||
|
||||
struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5, gcpro6;
|
||||
char filename[MAX_PATH + 1];
|
||||
char init_dir[MAX_PATH + 1];
|
||||
int default_filter_index = 1; /* 1: All Files, 2: Directories only */
|
||||
|
||||
GCPRO6 (prompt, dir, default_filename, mustmatch, only_dir_p, file);
|
||||
CHECK_STRING (prompt);
|
||||
CHECK_STRING (dir);
|
||||
|
||||
/* Create the dialog with PROMPT as title, using DIR as initial
|
||||
directory and using "*" as pattern. */
|
||||
dir = Fexpand_file_name (dir, Qnil);
|
||||
strncpy (init_dir, SDATA (ENCODE_FILE (dir)), MAX_PATH);
|
||||
init_dir[MAX_PATH] = '\0';
|
||||
unixtodos_filename (init_dir);
|
||||
|
||||
if (STRINGP (default_filename))
|
||||
{
|
||||
char *file_name_only;
|
||||
char *full_path_name = SDATA (ENCODE_FILE (default_filename));
|
||||
|
||||
unixtodos_filename (full_path_name);
|
||||
|
||||
file_name_only = strrchr (full_path_name, '\\');
|
||||
if (!file_name_only)
|
||||
file_name_only = full_path_name;
|
||||
else
|
||||
file_name_only++;
|
||||
|
||||
strncpy (filename, file_name_only, MAX_PATH);
|
||||
filename[MAX_PATH] = '\0';
|
||||
}
|
||||
else
|
||||
filename[0] = '\0';
|
||||
|
||||
/* The code in file_dialog_callback that attempts to set the text
|
||||
of the file name edit window when handling the CDN_INITDONE
|
||||
WM_NOTIFY message does not work. Setting filename to "Current
|
||||
Directory" in the only_dir_p case here does work however. */
|
||||
if (filename[0] == 0 && ! NILP (only_dir_p))
|
||||
strcpy (filename, "Current Directory");
|
||||
GCPRO6 (prompt, dir, default_filename, mustmatch, only_dir_p, filename);
|
||||
|
||||
{
|
||||
NEWOPENFILENAME new_file_details;
|
||||
BOOL file_opened = FALSE;
|
||||
OPENFILENAME * file_details = &new_file_details.real_details;
|
||||
struct gcpro gcpro1, gcpro2;
|
||||
GCPRO2 (orig_dir, orig_prompt); /* There is no GCPRON, N>6. */
|
||||
|
||||
/* Prevent redisplay. */
|
||||
specbind (Qinhibit_redisplay, Qt);
|
||||
block_input ();
|
||||
/* Note: under NTGUI_UNICODE, we do _NOT_ use ENCODE_FILE: the
|
||||
system file encoding expected by the platform APIs (e.g. Cygwin's
|
||||
POSIX implementation) may not the same as the encoding expected
|
||||
by the Windows API! */
|
||||
|
||||
memset (&new_file_details, 0, sizeof (new_file_details));
|
||||
/* Apparently NT4 crashes if you give it an unexpected size.
|
||||
I'm not sure about Windows 9x, so play it safe. */
|
||||
if (w32_major_version > 4 && w32_major_version < 95)
|
||||
file_details->lStructSize = sizeof (NEWOPENFILENAME);
|
||||
CHECK_STRING (prompt);
|
||||
CHECK_STRING (dir);
|
||||
|
||||
dir = Fexpand_file_name (dir, Qnil);
|
||||
|
||||
if (STRINGP (filename))
|
||||
filename = Ffile_name_nondirectory (filename);
|
||||
else
|
||||
file_details->lStructSize = sizeof (OPENFILENAME);
|
||||
filename = empty_unibyte_string;
|
||||
|
||||
#ifdef CYGWIN
|
||||
dir = Fcygwin_convert_path_to_windows (dir, Qt);
|
||||
if (SCHARS (filename) > 0)
|
||||
filename = Fcygwin_convert_path_to_windows (filename, Qnil);
|
||||
#endif
|
||||
|
||||
CHECK_STRING (dir);
|
||||
CHECK_STRING (filename);
|
||||
|
||||
/* The code in file_dialog_callback that attempts to set the text
|
||||
of the file name edit window when handling the CDN_INITDONE
|
||||
WM_NOTIFY message does not work. Setting filename to "Current
|
||||
Directory" in the only_dir_p case here does work however. */
|
||||
if (SCHARS (filename) == 0 && ! NILP (only_dir_p))
|
||||
filename = build_string ("Current Directory");
|
||||
|
||||
/* Convert the values we've computed so far to system form. */
|
||||
#ifdef NTGUI_UNICODE
|
||||
to_unicode (prompt, &prompt);
|
||||
to_unicode (dir, &dir);
|
||||
to_unicode (filename, &filename);
|
||||
#else /* !NTGUI_UNICODE */
|
||||
prompt = ENCODE_FILE (prompt);
|
||||
dir = ENCODE_FILE (dir);
|
||||
filename = ENCODE_FILE (filename);
|
||||
|
||||
/* We modify these in-place, so make copies for safety. */
|
||||
dir = Fcopy_sequence (dir);
|
||||
unixtodos_filename (SDATA (dir));
|
||||
filename = Fcopy_sequence (filename);
|
||||
unixtodos_filename (SDATA (filename));
|
||||
#endif /* NTGUI_UNICODE */
|
||||
|
||||
/* Fill in the structure for the call to GetOpenFileName below. For
|
||||
NTGUI_UNICODE builds (which run only on NT), we just use the
|
||||
actual size of the structure. For non-NTGUI_UNICODE builds, we
|
||||
tell the OS we're using an old version of the structure if it's not
|
||||
new enough to support the newer version. */
|
||||
memset (&new_file_details, 0, sizeof (new_file_details));
|
||||
|
||||
if (w32_major_version > 4 && w32_major_version < 95)
|
||||
file_details->lStructSize = sizeof (new_file_details);
|
||||
else
|
||||
file_details->lStructSize = sizeof (*file_details);
|
||||
|
||||
/* Set up the inout parameter for the selected file name. */
|
||||
if (SBYTES (filename) + 1 > sizeof (filename_buf))
|
||||
error ("filename too long");
|
||||
|
||||
memcpy (filename_buf, SDATA (filename), SBYTES (filename) + 1);
|
||||
file_details->lpstrFile = filename_buf;
|
||||
file_details->nMaxFile = sizeof (filename_buf) / sizeof (*filename_buf);
|
||||
|
||||
file_details->hwndOwner = FRAME_W32_WINDOW (f);
|
||||
/* Undocumented Bug in Common File Dialog:
|
||||
If a filter is not specified, shell links are not resolved. */
|
||||
file_details->lpstrFilter = "All Files (*.*)\0*.*\0Directories\0*|*\0\0";
|
||||
file_details->lpstrFile = filename;
|
||||
file_details->nMaxFile = sizeof (filename);
|
||||
file_details->lpstrInitialDir = init_dir;
|
||||
file_details->lpstrTitle = SDATA (prompt);
|
||||
|
||||
if (! NILP (only_dir_p))
|
||||
default_filter_index = 2;
|
||||
|
||||
file_details->nFilterIndex = default_filter_index;
|
||||
|
||||
file_details->lpstrFilter = filter;
|
||||
file_details->lpstrInitialDir = (guichar_t*) SDATA (dir);
|
||||
file_details->lpstrTitle = (guichar_t*) SDATA (prompt);
|
||||
file_details->nFilterIndex = NILP (only_dir_p) ? 1 : 2;
|
||||
file_details->Flags = (OFN_HIDEREADONLY | OFN_NOCHANGEDIR
|
||||
| OFN_EXPLORER | OFN_ENABLEHOOK);
|
||||
| OFN_EXPLORER | OFN_ENABLEHOOK);
|
||||
|
||||
if (!NILP (mustmatch))
|
||||
{
|
||||
/* Require that the path to the parent directory exists. */
|
||||
file_details->Flags |= OFN_PATHMUSTEXIST;
|
||||
/* If we are looking for a file, require that it exists. */
|
||||
if (NILP (only_dir_p))
|
||||
file_details->Flags |= OFN_FILEMUSTEXIST;
|
||||
/* Require that the path to the parent directory exists. */
|
||||
file_details->Flags |= OFN_PATHMUSTEXIST;
|
||||
/* If we are looking for a file, require that it exists. */
|
||||
if (NILP (only_dir_p))
|
||||
file_details->Flags |= OFN_FILEMUSTEXIST;
|
||||
}
|
||||
|
||||
file_details->lpfnHook = (LPOFNHOOKPROC) file_dialog_callback;
|
||||
{
|
||||
int count = SPECPDL_INDEX ();
|
||||
specbind (Qinhibit_redisplay, Qt);
|
||||
block_input ();
|
||||
file_details->lpfnHook = file_dialog_callback;
|
||||
|
||||
file_opened = GetOpenFileName (file_details);
|
||||
|
||||
unblock_input ();
|
||||
#ifdef NTGUI_UNICODE
|
||||
file_opened = GetOpenFileNameW (file_details);
|
||||
#else /* !NTGUI_UNICODE */
|
||||
file_opened = GetOpenFileNameA (file_details);
|
||||
#endif /* NTGUI_UNICODE */
|
||||
unblock_input ();
|
||||
unbind_to (count, Qnil);
|
||||
}
|
||||
|
||||
if (file_opened)
|
||||
{
|
||||
dostounix_filename (filename);
|
||||
/* Get an Emacs string from the value Windows gave us. */
|
||||
#ifdef NTGUI_UNICODE
|
||||
filename = from_unicode (
|
||||
make_unibyte_string (
|
||||
(char*) filename_buf,
|
||||
/* we get one of the two final 0 bytes for free. */
|
||||
1 + sizeof (wchar_t) * wcslen (filename_buf)));
|
||||
#else /* !NTGUI_UNICODE */
|
||||
dostounix_filename (filename_buf);
|
||||
filename = DECODE_FILE (build_string (filename_buf));
|
||||
#endif /* NTGUI_UNICODE */
|
||||
|
||||
if (file_details->nFilterIndex == 2)
|
||||
{
|
||||
/* "Directories" selected - strip dummy file name. */
|
||||
char * last = strrchr (filename, '/');
|
||||
*last = '\0';
|
||||
}
|
||||
#ifdef CYGWIN
|
||||
filename = Fcygwin_convert_path_from_windows (filename, Qt);
|
||||
#endif /* CYGWIN */
|
||||
|
||||
file = DECODE_FILE (build_string (filename));
|
||||
/* Strip the dummy filename off the end of the string if we
|
||||
added it to select a directory. */
|
||||
if (file_details->nFilterIndex == 2)
|
||||
{
|
||||
filename = Ffile_name_directory (filename);
|
||||
}
|
||||
}
|
||||
/* User canceled the dialog without making a selection. */
|
||||
else if (!CommDlgExtendedError ())
|
||||
file = Qnil;
|
||||
filename = Qnil;
|
||||
/* An error occurred, fallback on reading from the mini-buffer. */
|
||||
else
|
||||
file = Fcompleting_read (prompt, intern ("read-file-name-internal"),
|
||||
dir, mustmatch, dir, Qfile_name_history,
|
||||
default_filename, Qnil);
|
||||
filename = Fcompleting_read (
|
||||
orig_prompt,
|
||||
intern ("read-file-name-internal"),
|
||||
orig_dir,
|
||||
mustmatch,
|
||||
orig_dir,
|
||||
Qfile_name_history,
|
||||
default_filename,
|
||||
Qnil);
|
||||
|
||||
file = unbind_to (count, file);
|
||||
UNGCPRO;
|
||||
}
|
||||
|
||||
UNGCPRO;
|
||||
|
||||
/* Make "Cancel" equivalent to C-g. */
|
||||
if (NILP (file))
|
||||
if (NILP (filename))
|
||||
Fsignal (Qquit, Qnil);
|
||||
|
||||
return unbind_to (count, file);
|
||||
RETURN_UNGCPRO (filename);
|
||||
}
|
||||
|
||||
|
||||
|
||||
#ifdef WINDOWSNT
|
||||
/* Moving files to the system recycle bin.
|
||||
Used by `move-file-to-trash' instead of the default moving to ~/.Trash */
|
||||
DEFUN ("system-move-file-to-trash", Fsystem_move_file_to_trash,
|
||||
|
@ -6127,6 +6333,8 @@ DEFUN ("system-move-file-to-trash", Fsystem_move_file_to_trash,
|
|||
return Qnil;
|
||||
}
|
||||
|
||||
#endif /* WINDOWSNT */
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
w32 specialized functions
|
||||
|
@ -6544,7 +6752,7 @@ The following %-sequences are provided:
|
|||
else
|
||||
{
|
||||
char buffer[16];
|
||||
_snprintf (buffer, 16, "%d", system_status.BatteryLifePercent);
|
||||
snprintf (buffer, 16, "%d", system_status.BatteryLifePercent);
|
||||
load_percentage = build_string (buffer);
|
||||
}
|
||||
|
||||
|
@ -6555,18 +6763,18 @@ The following %-sequences are provided:
|
|||
long m;
|
||||
float h;
|
||||
char buffer[16];
|
||||
_snprintf (buffer, 16, "%ld", seconds_left);
|
||||
snprintf (buffer, 16, "%ld", seconds_left);
|
||||
seconds = build_string (buffer);
|
||||
|
||||
m = seconds_left / 60;
|
||||
_snprintf (buffer, 16, "%ld", m);
|
||||
snprintf (buffer, 16, "%ld", m);
|
||||
minutes = build_string (buffer);
|
||||
|
||||
h = seconds_left / 3600.0;
|
||||
_snprintf (buffer, 16, "%3.1f", h);
|
||||
snprintf (buffer, 16, "%3.1f", h);
|
||||
hours = build_string (buffer);
|
||||
|
||||
_snprintf (buffer, 16, "%ld:%02ld", m / 60, m % 60);
|
||||
snprintf (buffer, 16, "%ld:%02ld", m / 60, m % 60);
|
||||
remain = build_string (buffer);
|
||||
}
|
||||
|
||||
|
@ -6728,10 +6936,10 @@ DEFUN ("default-printer-name", Fdefault_printer_name, Sdefault_printer_name,
|
|||
{
|
||||
/* a remote printer */
|
||||
if (*ppi2->pServerName == '\\')
|
||||
_snprintf (pname_buf, sizeof (pname_buf), "%s\\%s", ppi2->pServerName,
|
||||
snprintf (pname_buf, sizeof (pname_buf), "%s\\%s", ppi2->pServerName,
|
||||
ppi2->pShareName);
|
||||
else
|
||||
_snprintf (pname_buf, sizeof (pname_buf), "\\\\%s\\%s", ppi2->pServerName,
|
||||
snprintf (pname_buf, sizeof (pname_buf), "\\\\%s\\%s", ppi2->pServerName,
|
||||
ppi2->pShareName);
|
||||
pname_buf[sizeof (pname_buf) - 1] = '\0';
|
||||
}
|
||||
|
@ -6749,6 +6957,292 @@ DEFUN ("default-printer-name", Fdefault_printer_name, Sdefault_printer_name,
|
|||
|
||||
return build_string (pname_buf);
|
||||
}
|
||||
|
||||
|
||||
/* Equivalent of strerror for W32 error codes. */
|
||||
char *
|
||||
w32_strerror (int error_no)
|
||||
{
|
||||
static char buf[500];
|
||||
DWORD ret;
|
||||
|
||||
if (error_no == 0)
|
||||
error_no = GetLastError ();
|
||||
|
||||
ret = FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM |
|
||||
FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||
NULL,
|
||||
error_no,
|
||||
0, /* choose most suitable language */
|
||||
buf, sizeof (buf), NULL);
|
||||
|
||||
while (ret > 0 && (buf[ret - 1] == '\n' ||
|
||||
buf[ret - 1] == '\r' ))
|
||||
--ret;
|
||||
buf[ret] = '\0';
|
||||
if (!ret)
|
||||
sprintf (buf, "w32 error %u", error_no);
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
/* For convenience when debugging. */
|
||||
int
|
||||
w32_last_error (void)
|
||||
{
|
||||
return GetLastError ();
|
||||
}
|
||||
|
||||
/* Cache information describing the NT system for later use. */
|
||||
void
|
||||
cache_system_info (void)
|
||||
{
|
||||
union
|
||||
{
|
||||
struct info
|
||||
{
|
||||
char major;
|
||||
char minor;
|
||||
short platform;
|
||||
} info;
|
||||
DWORD data;
|
||||
} version;
|
||||
|
||||
/* Cache the version of the operating system. */
|
||||
version.data = GetVersion ();
|
||||
w32_major_version = version.info.major;
|
||||
w32_minor_version = version.info.minor;
|
||||
|
||||
if (version.info.platform & 0x8000)
|
||||
os_subtype = OS_9X;
|
||||
else
|
||||
os_subtype = OS_NT;
|
||||
|
||||
/* Cache page size, allocation unit, processor type, etc. */
|
||||
GetSystemInfo (&sysinfo_cache);
|
||||
syspage_mask = sysinfo_cache.dwPageSize - 1;
|
||||
|
||||
/* Cache os info. */
|
||||
osinfo_cache.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
|
||||
GetVersionEx (&osinfo_cache);
|
||||
|
||||
w32_build_number = osinfo_cache.dwBuildNumber;
|
||||
if (os_subtype == OS_9X)
|
||||
w32_build_number &= 0xffff;
|
||||
|
||||
w32_num_mouse_buttons = GetSystemMetrics (SM_CMOUSEBUTTONS);
|
||||
}
|
||||
|
||||
#ifdef EMACSDEBUG
|
||||
void
|
||||
_DebPrint (const char *fmt, ...)
|
||||
{
|
||||
char buf[1024];
|
||||
va_list args;
|
||||
|
||||
va_start (args, fmt);
|
||||
vsprintf (buf, fmt, args);
|
||||
va_end (args);
|
||||
#if CYGWIN
|
||||
fprintf (stderr, "%s", buf);
|
||||
#endif
|
||||
OutputDebugString (buf);
|
||||
}
|
||||
#endif
|
||||
|
||||
int
|
||||
w32_console_toggle_lock_key (int vk_code, Lisp_Object new_state)
|
||||
{
|
||||
int cur_state = (GetKeyState (vk_code) & 1);
|
||||
|
||||
if (NILP (new_state)
|
||||
|| (NUMBERP (new_state)
|
||||
&& ((XUINT (new_state)) & 1) != cur_state))
|
||||
{
|
||||
#ifdef WINDOWSNT
|
||||
faked_key = vk_code;
|
||||
#endif /* WINDOWSNT */
|
||||
|
||||
keybd_event ((BYTE) vk_code,
|
||||
(BYTE) MapVirtualKey (vk_code, 0),
|
||||
KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
|
||||
keybd_event ((BYTE) vk_code,
|
||||
(BYTE) MapVirtualKey (vk_code, 0),
|
||||
KEYEVENTF_EXTENDEDKEY | 0, 0);
|
||||
keybd_event ((BYTE) vk_code,
|
||||
(BYTE) MapVirtualKey (vk_code, 0),
|
||||
KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
|
||||
cur_state = !cur_state;
|
||||
}
|
||||
|
||||
return cur_state;
|
||||
}
|
||||
|
||||
/* Translate console modifiers to emacs modifiers.
|
||||
German keyboard support (Kai Morgan Zeise 2/18/95). */
|
||||
int
|
||||
w32_kbd_mods_to_emacs (DWORD mods, WORD key)
|
||||
{
|
||||
int retval = 0;
|
||||
|
||||
/* If we recognize right-alt and left-ctrl as AltGr, and it has been
|
||||
pressed, first remove those modifiers. */
|
||||
if (!NILP (Vw32_recognize_altgr)
|
||||
&& (mods & (RIGHT_ALT_PRESSED | LEFT_CTRL_PRESSED))
|
||||
== (RIGHT_ALT_PRESSED | LEFT_CTRL_PRESSED))
|
||||
mods &= ~ (RIGHT_ALT_PRESSED | LEFT_CTRL_PRESSED);
|
||||
|
||||
if (mods & (RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED))
|
||||
retval = ((NILP (Vw32_alt_is_meta)) ? alt_modifier : meta_modifier);
|
||||
|
||||
if (mods & (RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED))
|
||||
{
|
||||
retval |= ctrl_modifier;
|
||||
if ((mods & (RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED))
|
||||
== (RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED))
|
||||
retval |= meta_modifier;
|
||||
}
|
||||
|
||||
if (mods & LEFT_WIN_PRESSED)
|
||||
retval |= w32_key_to_modifier (VK_LWIN);
|
||||
if (mods & RIGHT_WIN_PRESSED)
|
||||
retval |= w32_key_to_modifier (VK_RWIN);
|
||||
if (mods & APPS_PRESSED)
|
||||
retval |= w32_key_to_modifier (VK_APPS);
|
||||
if (mods & SCROLLLOCK_ON)
|
||||
retval |= w32_key_to_modifier (VK_SCROLL);
|
||||
|
||||
/* Just in case someone wanted the original behavior, make it
|
||||
optional by setting w32-capslock-is-shiftlock to t. */
|
||||
if (NILP (Vw32_capslock_is_shiftlock)
|
||||
/* Keys that should _not_ be affected by CapsLock. */
|
||||
&& ( (key == VK_BACK)
|
||||
|| (key == VK_TAB)
|
||||
|| (key == VK_CLEAR)
|
||||
|| (key == VK_RETURN)
|
||||
|| (key == VK_ESCAPE)
|
||||
|| ((key >= VK_SPACE) && (key <= VK_HELP))
|
||||
|| ((key >= VK_NUMPAD0) && (key <= VK_F24))
|
||||
|| ((key >= VK_NUMPAD_CLEAR) && (key <= VK_NUMPAD_DELETE))
|
||||
))
|
||||
{
|
||||
/* Only consider shift state. */
|
||||
if ((mods & SHIFT_PRESSED) != 0)
|
||||
retval |= shift_modifier;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Ignore CapsLock state if not enabled. */
|
||||
if (NILP (Vw32_enable_caps_lock))
|
||||
mods &= ~CAPSLOCK_ON;
|
||||
if ((mods & (SHIFT_PRESSED | CAPSLOCK_ON)) != 0)
|
||||
retval |= shift_modifier;
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
/* The return code indicates key code size. cpID is the codepage to
|
||||
use for translation to Unicode; -1 means use the current console
|
||||
input codepage. */
|
||||
int
|
||||
w32_kbd_patch_key (KEY_EVENT_RECORD *event, int cpId)
|
||||
{
|
||||
unsigned int key_code = event->wVirtualKeyCode;
|
||||
unsigned int mods = event->dwControlKeyState;
|
||||
BYTE keystate[256];
|
||||
static BYTE ansi_code[4];
|
||||
static int isdead = 0;
|
||||
|
||||
if (isdead == 2)
|
||||
{
|
||||
event->uChar.AsciiChar = ansi_code[2];
|
||||
isdead = 0;
|
||||
return 1;
|
||||
}
|
||||
if (event->uChar.AsciiChar != 0)
|
||||
return 1;
|
||||
|
||||
memset (keystate, 0, sizeof (keystate));
|
||||
keystate[key_code] = 0x80;
|
||||
if (mods & SHIFT_PRESSED)
|
||||
keystate[VK_SHIFT] = 0x80;
|
||||
if (mods & CAPSLOCK_ON)
|
||||
keystate[VK_CAPITAL] = 1;
|
||||
/* If we recognize right-alt and left-ctrl as AltGr, set the key
|
||||
states accordingly before invoking ToAscii. */
|
||||
if (!NILP (Vw32_recognize_altgr)
|
||||
&& (mods & LEFT_CTRL_PRESSED) && (mods & RIGHT_ALT_PRESSED))
|
||||
{
|
||||
keystate[VK_CONTROL] = 0x80;
|
||||
keystate[VK_LCONTROL] = 0x80;
|
||||
keystate[VK_MENU] = 0x80;
|
||||
keystate[VK_RMENU] = 0x80;
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* Because of an OS bug, ToAscii corrupts the stack when called to
|
||||
convert a dead key in console mode on NT4. Unfortunately, trying
|
||||
to check for dead keys using MapVirtualKey doesn't work either -
|
||||
these functions apparently use internal information about keyboard
|
||||
layout which doesn't get properly updated in console programs when
|
||||
changing layout (though apparently it gets partly updated,
|
||||
otherwise ToAscii wouldn't crash). */
|
||||
if (is_dead_key (event->wVirtualKeyCode))
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
/* On NT, call ToUnicode instead and then convert to the current
|
||||
console input codepage. */
|
||||
if (os_subtype == OS_NT)
|
||||
{
|
||||
WCHAR buf[128];
|
||||
|
||||
isdead = ToUnicode (event->wVirtualKeyCode, event->wVirtualScanCode,
|
||||
keystate, buf, 128, 0);
|
||||
if (isdead > 0)
|
||||
{
|
||||
/* When we are called from the GUI message processing code,
|
||||
we are passed the current keyboard codepage, a positive
|
||||
number, to use below. */
|
||||
if (cpId == -1)
|
||||
cpId = GetConsoleCP ();
|
||||
|
||||
event->uChar.UnicodeChar = buf[isdead - 1];
|
||||
isdead = WideCharToMultiByte (cpId, 0, buf, isdead,
|
||||
ansi_code, 4, NULL, NULL);
|
||||
}
|
||||
else
|
||||
isdead = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
isdead = ToAscii (event->wVirtualKeyCode, event->wVirtualScanCode,
|
||||
keystate, (LPWORD) ansi_code, 0);
|
||||
}
|
||||
|
||||
if (isdead == 0)
|
||||
return 0;
|
||||
event->uChar.AsciiChar = ansi_code[0];
|
||||
return isdead;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
w32_sys_ring_bell (struct frame *f)
|
||||
{
|
||||
if (sound_type == 0xFFFFFFFF)
|
||||
{
|
||||
Beep (666, 100);
|
||||
}
|
||||
else if (sound_type == MB_EMACS_SILENT)
|
||||
{
|
||||
/* Do nothing. */
|
||||
}
|
||||
else
|
||||
MessageBeep (sound_type);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
Initialization
|
||||
|
@ -7116,6 +7610,7 @@ only be necessary if the default setting causes problems. */);
|
|||
|
||||
defsubr (&Sfile_system_info);
|
||||
defsubr (&Sdefault_printer_name);
|
||||
defsubr (&Sset_message_beep);
|
||||
|
||||
check_window_system_func = check_w32;
|
||||
|
||||
|
@ -7132,7 +7627,9 @@ only be necessary if the default setting causes problems. */);
|
|||
staticpro (&last_show_tip_args);
|
||||
|
||||
defsubr (&Sx_file_dialog);
|
||||
#ifdef WINDOWSNT
|
||||
defsubr (&Ssystem_move_file_to_trash);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -7214,9 +7711,3 @@ emacs_abort (void)
|
|||
}
|
||||
}
|
||||
|
||||
/* For convenience when debugging. */
|
||||
int
|
||||
w32_last_error (void)
|
||||
{
|
||||
return GetLastError ();
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
|
||||
#include <config.h>
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include <ctype.h>
|
||||
#include <commdlg.h>
|
||||
|
@ -1434,6 +1435,9 @@ w32font_coverage_ok (FONTSIGNATURE * coverage, BYTE charset)
|
|||
return 1;
|
||||
}
|
||||
|
||||
#ifndef WINDOWSNT
|
||||
#define _strlwr strlwr
|
||||
#endif /* !WINDOWSNT */
|
||||
|
||||
static int
|
||||
check_face_name (LOGFONT *font, char *full_name)
|
||||
|
|
|
@ -32,10 +32,9 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
SYSTEM_INFO sysinfo_cache;
|
||||
|
||||
/* This gives us version, build, and platform identification. */
|
||||
extern unsigned long syspage_mask;
|
||||
OSVERSIONINFO osinfo_cache;
|
||||
|
||||
size_t syspage_mask = 0;
|
||||
|
||||
/* The major and minor versions of NT. */
|
||||
int w32_major_version;
|
||||
int w32_minor_version;
|
||||
|
@ -44,44 +43,6 @@ int w32_build_number;
|
|||
/* Distinguish between Windows NT and Windows 95. */
|
||||
int os_subtype;
|
||||
|
||||
/* Cache information describing the NT system for later use. */
|
||||
void
|
||||
cache_system_info (void)
|
||||
{
|
||||
union
|
||||
{
|
||||
struct info
|
||||
{
|
||||
char major;
|
||||
char minor;
|
||||
short platform;
|
||||
} info;
|
||||
DWORD data;
|
||||
} version;
|
||||
|
||||
/* Cache the version of the operating system. */
|
||||
version.data = GetVersion ();
|
||||
w32_major_version = version.info.major;
|
||||
w32_minor_version = version.info.minor;
|
||||
|
||||
if (version.info.platform & 0x8000)
|
||||
os_subtype = OS_9X;
|
||||
else
|
||||
os_subtype = OS_NT;
|
||||
|
||||
/* Cache page size, allocation unit, processor type, etc. */
|
||||
GetSystemInfo (&sysinfo_cache);
|
||||
syspage_mask = sysinfo_cache.dwPageSize - 1;
|
||||
|
||||
/* Cache os info. */
|
||||
osinfo_cache.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
|
||||
GetVersionEx (&osinfo_cache);
|
||||
|
||||
w32_build_number = osinfo_cache.dwBuildNumber;
|
||||
if (os_subtype == OS_9X)
|
||||
w32_build_number &= 0xffff;
|
||||
}
|
||||
|
||||
/* Emulate getpagesize. */
|
||||
int
|
||||
getpagesize (void)
|
||||
|
|
172
src/w32inevt.c
172
src/w32inevt.c
|
@ -70,6 +70,9 @@ w32_read_console_input (HANDLE h, INPUT_RECORD *rec, DWORD recsize,
|
|||
: ReadConsoleInputA (h, rec, recsize, waiting));
|
||||
}
|
||||
|
||||
/* Set by w32_console_toggle_lock_key. */
|
||||
int faked_key;
|
||||
|
||||
static int
|
||||
fill_queue (BOOL block)
|
||||
{
|
||||
|
@ -110,67 +113,7 @@ get_frame (void)
|
|||
|
||||
/* Translate console modifiers to emacs modifiers.
|
||||
German keyboard support (Kai Morgan Zeise 2/18/95). */
|
||||
int
|
||||
w32_kbd_mods_to_emacs (DWORD mods, WORD key)
|
||||
{
|
||||
int retval = 0;
|
||||
|
||||
/* If we recognize right-alt and left-ctrl as AltGr, and it has been
|
||||
pressed, first remove those modifiers. */
|
||||
if (!NILP (Vw32_recognize_altgr)
|
||||
&& (mods & (RIGHT_ALT_PRESSED | LEFT_CTRL_PRESSED))
|
||||
== (RIGHT_ALT_PRESSED | LEFT_CTRL_PRESSED))
|
||||
mods &= ~ (RIGHT_ALT_PRESSED | LEFT_CTRL_PRESSED);
|
||||
|
||||
if (mods & (RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED))
|
||||
retval = ((NILP (Vw32_alt_is_meta)) ? alt_modifier : meta_modifier);
|
||||
|
||||
if (mods & (RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED))
|
||||
{
|
||||
retval |= ctrl_modifier;
|
||||
if ((mods & (RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED))
|
||||
== (RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED))
|
||||
retval |= meta_modifier;
|
||||
}
|
||||
|
||||
if (mods & LEFT_WIN_PRESSED)
|
||||
retval |= w32_key_to_modifier (VK_LWIN);
|
||||
if (mods & RIGHT_WIN_PRESSED)
|
||||
retval |= w32_key_to_modifier (VK_RWIN);
|
||||
if (mods & APPS_PRESSED)
|
||||
retval |= w32_key_to_modifier (VK_APPS);
|
||||
if (mods & SCROLLLOCK_ON)
|
||||
retval |= w32_key_to_modifier (VK_SCROLL);
|
||||
|
||||
/* Just in case someone wanted the original behavior, make it
|
||||
optional by setting w32-capslock-is-shiftlock to t. */
|
||||
if (NILP (Vw32_capslock_is_shiftlock)
|
||||
/* Keys that should _not_ be affected by CapsLock. */
|
||||
&& ( (key == VK_BACK)
|
||||
|| (key == VK_TAB)
|
||||
|| (key == VK_CLEAR)
|
||||
|| (key == VK_RETURN)
|
||||
|| (key == VK_ESCAPE)
|
||||
|| ((key >= VK_SPACE) && (key <= VK_HELP))
|
||||
|| ((key >= VK_NUMPAD0) && (key <= VK_F24))
|
||||
|| ((key >= VK_NUMPAD_CLEAR) && (key <= VK_NUMPAD_DELETE))
|
||||
))
|
||||
{
|
||||
/* Only consider shift state. */
|
||||
if ((mods & SHIFT_PRESSED) != 0)
|
||||
retval |= shift_modifier;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Ignore CapsLock state if not enabled. */
|
||||
if (NILP (Vw32_enable_caps_lock))
|
||||
mods &= ~CAPSLOCK_ON;
|
||||
if ((mods & (SHIFT_PRESSED | CAPSLOCK_ON)) != 0)
|
||||
retval |= shift_modifier;
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* Return nonzero if the virtual key is a dead key. */
|
||||
|
@ -187,90 +130,7 @@ is_dead_key (int wparam)
|
|||
/* The return code indicates key code size. cpID is the codepage to
|
||||
use for translation to Unicode; -1 means use the current console
|
||||
input codepage. */
|
||||
int
|
||||
w32_kbd_patch_key (KEY_EVENT_RECORD *event, int cpId)
|
||||
{
|
||||
unsigned int key_code = event->wVirtualKeyCode;
|
||||
unsigned int mods = event->dwControlKeyState;
|
||||
BYTE keystate[256];
|
||||
static BYTE ansi_code[4];
|
||||
static int isdead = 0;
|
||||
|
||||
if (isdead == 2)
|
||||
{
|
||||
event->uChar.AsciiChar = ansi_code[2];
|
||||
isdead = 0;
|
||||
return 1;
|
||||
}
|
||||
if (event->uChar.AsciiChar != 0)
|
||||
return 1;
|
||||
|
||||
memset (keystate, 0, sizeof (keystate));
|
||||
keystate[key_code] = 0x80;
|
||||
if (mods & SHIFT_PRESSED)
|
||||
keystate[VK_SHIFT] = 0x80;
|
||||
if (mods & CAPSLOCK_ON)
|
||||
keystate[VK_CAPITAL] = 1;
|
||||
/* If we recognize right-alt and left-ctrl as AltGr, set the key
|
||||
states accordingly before invoking ToAscii. */
|
||||
if (!NILP (Vw32_recognize_altgr)
|
||||
&& (mods & LEFT_CTRL_PRESSED) && (mods & RIGHT_ALT_PRESSED))
|
||||
{
|
||||
keystate[VK_CONTROL] = 0x80;
|
||||
keystate[VK_LCONTROL] = 0x80;
|
||||
keystate[VK_MENU] = 0x80;
|
||||
keystate[VK_RMENU] = 0x80;
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* Because of an OS bug, ToAscii corrupts the stack when called to
|
||||
convert a dead key in console mode on NT4. Unfortunately, trying
|
||||
to check for dead keys using MapVirtualKey doesn't work either -
|
||||
these functions apparently use internal information about keyboard
|
||||
layout which doesn't get properly updated in console programs when
|
||||
changing layout (though apparently it gets partly updated,
|
||||
otherwise ToAscii wouldn't crash). */
|
||||
if (is_dead_key (event->wVirtualKeyCode))
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
/* On NT, call ToUnicode instead and then convert to the current
|
||||
console input codepage. */
|
||||
if (os_subtype == OS_NT)
|
||||
{
|
||||
WCHAR buf[128];
|
||||
|
||||
isdead = ToUnicode (event->wVirtualKeyCode, event->wVirtualScanCode,
|
||||
keystate, buf, 128, 0);
|
||||
if (isdead > 0)
|
||||
{
|
||||
/* When we are called from the GUI message processing code,
|
||||
we are passed the current keyboard codepage, a positive
|
||||
number, to use below. */
|
||||
if (cpId == -1)
|
||||
cpId = GetConsoleCP ();
|
||||
|
||||
event->uChar.UnicodeChar = buf[isdead - 1];
|
||||
isdead = WideCharToMultiByte (cpId, 0, buf, isdead,
|
||||
ansi_code, 4, NULL, NULL);
|
||||
}
|
||||
else
|
||||
isdead = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
isdead = ToAscii (event->wVirtualKeyCode, event->wVirtualScanCode,
|
||||
keystate, (LPWORD) ansi_code, 0);
|
||||
}
|
||||
|
||||
if (isdead == 0)
|
||||
return 0;
|
||||
event->uChar.AsciiChar = ansi_code[0];
|
||||
return isdead;
|
||||
}
|
||||
|
||||
|
||||
static int faked_key = 0;
|
||||
|
||||
/* return code -1 means that event_queue_ptr won't be incremented.
|
||||
In other word, this event makes two key codes. (by himi) */
|
||||
|
@ -531,32 +391,6 @@ key_event (KEY_EVENT_RECORD *event, struct input_event *emacs_ev, int *isdead)
|
|||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
w32_console_toggle_lock_key (int vk_code, Lisp_Object new_state)
|
||||
{
|
||||
int cur_state = (GetKeyState (vk_code) & 1);
|
||||
|
||||
if (NILP (new_state)
|
||||
|| (NUMBERP (new_state)
|
||||
&& ((XUINT (new_state)) & 1) != cur_state))
|
||||
{
|
||||
faked_key = vk_code;
|
||||
|
||||
keybd_event ((BYTE) vk_code,
|
||||
(BYTE) MapVirtualKey (vk_code, 0),
|
||||
KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
|
||||
keybd_event ((BYTE) vk_code,
|
||||
(BYTE) MapVirtualKey (vk_code, 0),
|
||||
KEYEVENTF_EXTENDEDKEY | 0, 0);
|
||||
keybd_event ((BYTE) vk_code,
|
||||
(BYTE) MapVirtualKey (vk_code, 0),
|
||||
KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
|
||||
cur_state = !cur_state;
|
||||
}
|
||||
|
||||
return cur_state;
|
||||
}
|
||||
|
||||
/* Mouse position hook. */
|
||||
void
|
||||
w32_console_mouse_position (FRAME_PTR *f,
|
||||
|
|
|
@ -21,7 +21,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <mbstring.h>
|
||||
#include <setjmp.h>
|
||||
|
||||
#include "lisp.h"
|
||||
#include "keyboard.h"
|
||||
|
@ -40,6 +40,14 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
if this is not done before the other system files. */
|
||||
#include "w32term.h"
|
||||
|
||||
/* Cygwin does not support the multibyte string functions declared in
|
||||
* mbstring.h below --- but that's okay: because Cygwin is
|
||||
* UNICODE-only, we don't need to use these functions anyway. */
|
||||
|
||||
#ifndef NTGUI_UNICODE
|
||||
#include <mbstring.h>
|
||||
#endif /* !NTGUI_UNICODE */
|
||||
|
||||
/* Load sys/types.h if not already loaded.
|
||||
In some systems loading it twice is suicidal. */
|
||||
#ifndef makedev
|
||||
|
@ -78,10 +86,17 @@ typedef int (WINAPI * MessageBoxW_Proc) (
|
|||
IN WCHAR *caption,
|
||||
IN UINT type);
|
||||
|
||||
#ifdef NTGUI_UNICODE
|
||||
#define get_menu_item_info GetMenuItemInfoA
|
||||
#define set_menu_item_info SetMenuItemInfoA
|
||||
#define unicode_append_menu AppendMenuW
|
||||
#define unicode_message_box MessageBoxW
|
||||
#else /* !NTGUI_UNICODE */
|
||||
GetMenuItemInfoA_Proc get_menu_item_info = NULL;
|
||||
SetMenuItemInfoA_Proc set_menu_item_info = NULL;
|
||||
AppendMenuW_Proc unicode_append_menu = NULL;
|
||||
MessageBoxW_Proc unicode_message_box = NULL;
|
||||
#endif /* NTGUI_UNICODE */
|
||||
|
||||
Lisp_Object Qdebug_on_next_call;
|
||||
|
||||
|
@ -98,6 +113,7 @@ static void utf8to16 (unsigned char *, int, WCHAR *);
|
|||
static int fill_in_menu (HMENU, widget_value *);
|
||||
|
||||
void w32_free_menu_strings (HWND);
|
||||
|
||||
|
||||
|
||||
/* This is set nonzero after the user activates the menu bar, and set
|
||||
|
@ -1405,6 +1421,7 @@ add_menu_item (HMENU menu, widget_value *wv, HMENU item)
|
|||
nlen++;
|
||||
}
|
||||
}
|
||||
#ifndef NTGUI_UNICODE
|
||||
else
|
||||
{
|
||||
/* If encoded with the system codepage, use multibyte string
|
||||
|
@ -1415,6 +1432,7 @@ add_menu_item (HMENU menu, widget_value *wv, HMENU item)
|
|||
nlen++;
|
||||
}
|
||||
}
|
||||
#endif /* !NTGUI_UNICODE */
|
||||
|
||||
if (nlen > orig_len)
|
||||
{
|
||||
|
@ -1429,6 +1447,7 @@ add_menu_item (HMENU menu, widget_value *wv, HMENU item)
|
|||
*q++ = *p;
|
||||
*q++ = *p++;
|
||||
}
|
||||
#ifndef NTGUI_UNICODE
|
||||
else
|
||||
{
|
||||
if (_mbsnextc (p) == '&')
|
||||
|
@ -1440,6 +1459,7 @@ add_menu_item (HMENU menu, widget_value *wv, HMENU item)
|
|||
p = _mbsinc (p);
|
||||
q = _mbsinc (q);
|
||||
}
|
||||
#endif /* !NTGUI_UNICODE */
|
||||
}
|
||||
*q = '\0';
|
||||
}
|
||||
|
@ -1486,6 +1506,8 @@ add_menu_item (HMENU menu, widget_value *wv, HMENU item)
|
|||
item != NULL ? (UINT_PTR) item
|
||||
: (UINT_PTR) wv->call_data,
|
||||
utf16_string);
|
||||
|
||||
#ifndef NTGUI_UNICODE /* Fallback does not apply when always UNICODE */
|
||||
if (!return_value)
|
||||
{
|
||||
/* On W9x/ME, Unicode menus are not supported, though AppendMenuW
|
||||
|
@ -1504,6 +1526,7 @@ add_menu_item (HMENU menu, widget_value *wv, HMENU item)
|
|||
if (osinfo_cache.dwPlatformId != VER_PLATFORM_WIN32_NT)
|
||||
unicode_append_menu = NULL;
|
||||
}
|
||||
#endif /* NTGUI_UNICODE */
|
||||
|
||||
if (unicode_append_menu && (fuFlags & MF_OWNERDRAW))
|
||||
local_free (out_string);
|
||||
|
@ -1723,10 +1746,12 @@ syms_of_w32menu (void)
|
|||
void
|
||||
globals_of_w32menu (void)
|
||||
{
|
||||
#ifndef NTGUI_UNICODE
|
||||
/* See if Get/SetMenuItemInfo functions are available. */
|
||||
HMODULE user32 = GetModuleHandle ("user32.dll");
|
||||
get_menu_item_info = (GetMenuItemInfoA_Proc) GetProcAddress (user32, "GetMenuItemInfoA");
|
||||
set_menu_item_info = (SetMenuItemInfoA_Proc) GetProcAddress (user32, "SetMenuItemInfoA");
|
||||
unicode_append_menu = (AppendMenuW_Proc) GetProcAddress (user32, "AppendMenuW");
|
||||
unicode_message_box = (MessageBoxW_Proc) GetProcAddress (user32, "MessageBoxW");
|
||||
#endif /* !NTGUI_UNICODE */
|
||||
}
|
||||
|
|
|
@ -67,20 +67,6 @@ extern BOOL WINAPI IsValidLocale (LCID, DWORD);
|
|||
|
||||
Lisp_Object Qhigh, Qlow;
|
||||
|
||||
#ifdef EMACSDEBUG
|
||||
void
|
||||
_DebPrint (const char *fmt, ...)
|
||||
{
|
||||
char buf[1024];
|
||||
va_list args;
|
||||
|
||||
va_start (args, fmt);
|
||||
vsprintf (buf, fmt, args);
|
||||
va_end (args);
|
||||
OutputDebugString (buf);
|
||||
}
|
||||
#endif
|
||||
|
||||
typedef void (_CALLBACK_ *signal_handler) (int);
|
||||
|
||||
/* Signal handlers...SIG_DFL == 0 so this is initialized correctly. */
|
||||
|
|
|
@ -81,6 +81,11 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
#include "coding.h"
|
||||
#include "composite.h"
|
||||
|
||||
#ifdef CYGWIN
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#define _memccpy memccpy
|
||||
#endif
|
||||
|
||||
static HGLOBAL convert_to_handle_as_ascii (void);
|
||||
static HGLOBAL convert_to_handle_as_coded (Lisp_Object coding_system);
|
||||
|
|
30
src/w32select.h
Normal file
30
src/w32select.h
Normal file
|
@ -0,0 +1,30 @@
|
|||
/* Selection processing for Emacs on the Microsoft W32 API.
|
||||
|
||||
Copyright (C) 1993-1994, 2001-2011 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.
|
||||
|
||||
GNU Emacs is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef W32SELECT_H
|
||||
#define W32SELECT_H
|
||||
#include <windows.h>
|
||||
|
||||
#define HAVE_W32SELECT 1
|
||||
|
||||
extern void syms_of_w32select (void);
|
||||
extern void globals_of_w32select (void);
|
||||
extern void term_w32select (void);
|
||||
|
||||
#endif
|
|
@ -51,7 +51,14 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
#include "atimer.h"
|
||||
#include "keymap.h"
|
||||
|
||||
#ifdef WINDOWSNT
|
||||
#include "w32heap.h"
|
||||
#endif
|
||||
|
||||
#ifndef WINDOWSNT
|
||||
#include <io.h> /* for get_osfhandle */
|
||||
#endif
|
||||
|
||||
#include <shellapi.h>
|
||||
|
||||
#include "font.h"
|
||||
|
@ -121,7 +128,7 @@ typedef struct tagGLYPHSET
|
|||
WCRANGE ranges[1];
|
||||
} GLYPHSET;
|
||||
|
||||
#endif
|
||||
#endif /* compiling for pre-Win2k */
|
||||
|
||||
/* Dynamic linking to SetLayeredWindowAttribute (only since 2000). */
|
||||
BOOL (WINAPI *pfnSetLayeredWindowAttributes) (HWND, COLORREF, BYTE, DWORD);
|
||||
|
@ -190,6 +197,13 @@ static int volatile input_signal_count;
|
|||
static int input_signal_count;
|
||||
#endif
|
||||
|
||||
#ifdef CYGWIN
|
||||
int w32_message_fd = -1;
|
||||
#endif /* CYGWIN */
|
||||
|
||||
/* Keyboard code page - may be changed by language-change events. */
|
||||
static int keyboard_codepage;
|
||||
|
||||
static void x_update_window_end (struct window *, int, int);
|
||||
static void w32_handle_tool_bar_click (struct frame *,
|
||||
struct input_event *);
|
||||
|
@ -4163,18 +4177,26 @@ w32_read_socket (struct terminal *terminal,
|
|||
struct frame *f;
|
||||
struct w32_display_info *dpyinfo = &one_w32_display_info;
|
||||
Mouse_HLInfo *hlinfo = &dpyinfo->mouse_highlight;
|
||||
static char buf[1];
|
||||
|
||||
block_input ();
|
||||
|
||||
/* So people can tell when we have read the available input. */
|
||||
input_signal_count++;
|
||||
|
||||
/* Process any incoming thread messages. */
|
||||
drain_message_queue ();
|
||||
|
||||
/* TODO: ghostscript integration. */
|
||||
while (get_next_msg (&msg, FALSE))
|
||||
{
|
||||
struct input_event inev;
|
||||
int do_help = 0;
|
||||
|
||||
/* DebPrint (("w32_read_socket: %s time:%u\n", */
|
||||
/* w32_name_of_message (msg.msg.message), */
|
||||
/* msg.msg.time)); */
|
||||
|
||||
EVENT_INIT (inev);
|
||||
inev.kind = NO_EVENT;
|
||||
inev.arg = Qnil;
|
||||
|
@ -6307,8 +6329,15 @@ w32_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name)
|
|||
w32_defined_color (0, "black", &color, 1);
|
||||
}
|
||||
|
||||
/* Add the default keyboard. */
|
||||
#ifdef WINDOWSNT
|
||||
/* Add the default keyboard. When !WINDOWSNT, we're using the
|
||||
standard Emacs console handling machinery and don't need an
|
||||
explicit FD here. */
|
||||
add_keyboard_wait_descriptor (0);
|
||||
#elif CYGWIN
|
||||
/* /dev/windows wakes us up when we have a thread message pending. */
|
||||
add_keyboard_wait_descriptor (w32_message_fd);
|
||||
#endif
|
||||
|
||||
/* Create Fringe Bitmaps and store them for later use.
|
||||
|
||||
|
@ -6319,15 +6348,6 @@ w32_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name)
|
|||
the bitmaps. */
|
||||
w32_init_fringe (terminal->rif);
|
||||
|
||||
#ifdef F_SETOWN
|
||||
fcntl (connection, F_SETOWN, getpid ());
|
||||
#endif /* ! defined (F_SETOWN) */
|
||||
|
||||
#ifdef SIGIO
|
||||
if (interrupt_input)
|
||||
init_sigio (connection);
|
||||
#endif /* ! defined (SIGIO) */
|
||||
|
||||
unblock_input ();
|
||||
|
||||
return dpyinfo;
|
||||
|
@ -6377,6 +6397,7 @@ x_delete_display (struct w32_display_info *dpyinfo)
|
|||
|
||||
w32_reset_fringes ();
|
||||
}
|
||||
|
||||
|
||||
/* Set up use of W32. */
|
||||
|
||||
|
@ -6414,6 +6435,11 @@ w32_initialize (void)
|
|||
set_user_model (L"GNU.Emacs");
|
||||
}
|
||||
|
||||
#ifdef CYGWIN
|
||||
if ((w32_message_fd = open ("/dev/windows", O_RDWR | O_CLOEXEC)) == -1)
|
||||
fatal ("opening /dev/windows: %s", strerror (errno));
|
||||
#endif /* CYGWIN */
|
||||
|
||||
/* Initialize w32_use_visible_system_caret based on whether a screen
|
||||
reader is in use. */
|
||||
if (!SystemParametersInfo (SPI_GETSCREENREADER, 0,
|
||||
|
@ -6574,4 +6600,6 @@ With MS Windows or Nextstep, the value is t. */);
|
|||
|
||||
staticpro (&last_mouse_motion_frame);
|
||||
last_mouse_motion_frame = Qnil;
|
||||
|
||||
Fprovide (intern_c_string ("w32"), Qnil);
|
||||
}
|
||||
|
|
|
@ -19,6 +19,8 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
/* Added by Kevin Gallo */
|
||||
|
||||
#include "w32gui.h"
|
||||
#include "frame.h"
|
||||
#include "atimer.h"
|
||||
|
||||
|
||||
#define BLACK_PIX_DEFAULT(f) PALETTERGB(0,0,0)
|
||||
|
@ -195,11 +197,45 @@ Lisp_Object display_x_get_resource (struct w32_display_info *,
|
|||
Lisp_Object, Lisp_Object,
|
||||
Lisp_Object, Lisp_Object);
|
||||
|
||||
extern void x_focus_on_frame (struct frame *f);
|
||||
|
||||
/* also defined in xterm.h XXX: factor out to common header */
|
||||
|
||||
extern struct w32_display_info *w32_term_init (Lisp_Object,
|
||||
char *, char *);
|
||||
|
||||
extern void check_w32 (void);
|
||||
extern int w32_defined_color (FRAME_PTR f, const char *color,
|
||||
XColor *color_def, int alloc);
|
||||
extern void x_set_window_size (struct frame *f, int change_grav,
|
||||
int cols, int rows);
|
||||
extern int x_display_pixel_height (struct w32_display_info *);
|
||||
extern int x_display_pixel_width (struct w32_display_info *);
|
||||
extern void x_sync (struct frame *);
|
||||
extern Lisp_Object x_get_focus_frame (struct frame *);
|
||||
extern void x_set_mouse_position (struct frame *f, int h, int v);
|
||||
extern void x_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y);
|
||||
extern void x_make_frame_visible (struct frame *f);
|
||||
extern void x_make_frame_invisible (struct frame *f);
|
||||
extern void x_iconify_frame (struct frame *f);
|
||||
extern int x_char_width (struct frame *f);
|
||||
extern int x_char_height (struct frame *f);
|
||||
extern int x_pixel_width (struct frame *f);
|
||||
extern int x_pixel_height (struct frame *f);
|
||||
extern void x_set_frame_alpha (struct frame *f);
|
||||
extern void x_set_menu_bar_lines (struct frame *, Lisp_Object, Lisp_Object);
|
||||
extern void x_set_tool_bar_lines (struct frame *f,
|
||||
Lisp_Object value,
|
||||
Lisp_Object oldval);
|
||||
extern void x_activate_menubar (struct frame *);
|
||||
extern int x_bitmap_icon (struct frame *, Lisp_Object);
|
||||
extern void initialize_frame_menubar (struct frame *);
|
||||
extern void x_free_frame_resources (struct frame *);
|
||||
extern void x_real_positions (struct frame *, int *, int *);
|
||||
|
||||
/* w32inevt.c */
|
||||
extern int w32_kbd_patch_key (KEY_EVENT_RECORD *event, int cpId);
|
||||
extern int w32_kbd_mods_to_emacs (DWORD mods, WORD key);
|
||||
|
||||
|
||||
extern Lisp_Object x_get_focus_frame (struct frame *);
|
||||
|
||||
|
@ -583,8 +619,9 @@ do { \
|
|||
#define WM_EMACS_HIDE_CARET (WM_EMACS_START + 18)
|
||||
#define WM_EMACS_SETCURSOR (WM_EMACS_START + 19)
|
||||
#define WM_EMACS_PAINT (WM_EMACS_START + 20)
|
||||
#define WM_EMACS_BRINGTOTOP (WM_EMACS_START + 21)
|
||||
#define WM_EMACS_END (WM_EMACS_START + 22)
|
||||
#define WM_EMACS_BRINGTOTOP (WM_EMACS_START + 22)
|
||||
#define WM_EMACS_INPUT_READY (WM_EMACS_START + 23)
|
||||
#define WM_EMACS_END (WM_EMACS_START + 24)
|
||||
|
||||
#define WND_FONTWIDTH_INDEX (0)
|
||||
#define WND_LINEHEIGHT_INDEX (4)
|
||||
|
@ -606,6 +643,8 @@ typedef struct W32Msg {
|
|||
RECT rect;
|
||||
} W32Msg;
|
||||
|
||||
extern BOOL prepend_msg (W32Msg *lpmsg);
|
||||
|
||||
/* Structure for recording message when input thread must return a
|
||||
result that depends on lisp thread to compute. Lisp thread can
|
||||
complete deferred messages out of order. */
|
||||
|
@ -709,3 +748,19 @@ extern HWND w32_system_caret_hwnd;
|
|||
extern int w32_system_caret_height;
|
||||
extern int w32_system_caret_x;
|
||||
extern int w32_system_caret_y;
|
||||
|
||||
#if EMACSDEBUG
|
||||
extern const char*
|
||||
w32_name_of_message (UINT msg);
|
||||
#endif /* EMACSDEBUG */
|
||||
|
||||
extern void syms_of_w32term (void);
|
||||
extern void syms_of_w32menu (void);
|
||||
extern void syms_of_w32fns (void);
|
||||
|
||||
extern void globals_of_w32menu (void);
|
||||
extern void globals_of_w32fns (void);
|
||||
|
||||
#ifdef CYGWIN
|
||||
extern int w32_message_fd;
|
||||
#endif /* CYGWIN */
|
||||
|
|
|
@ -19,6 +19,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
#include <config.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "lisp.h"
|
||||
#include "keyboard.h"
|
||||
#include "frame.h"
|
||||
|
@ -32,7 +33,11 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
#define myfree(lp) GlobalFreePtr (lp)
|
||||
|
||||
CRITICAL_SECTION critsect;
|
||||
|
||||
#ifdef WINDOWSNT
|
||||
extern HANDLE keyboard_handle;
|
||||
#endif /* WINDOWSNT */
|
||||
|
||||
HANDLE input_available = NULL;
|
||||
HANDLE interrupt_handle = NULL;
|
||||
|
||||
|
@ -43,7 +48,11 @@ init_crit (void)
|
|||
|
||||
/* For safety, input_available should only be reset by get_next_msg
|
||||
when the input queue is empty, so make it a manual reset event. */
|
||||
keyboard_handle = input_available = CreateEvent (NULL, TRUE, FALSE, NULL);
|
||||
input_available = CreateEvent (NULL, TRUE, FALSE, NULL);
|
||||
|
||||
#ifdef WINDOWSNT
|
||||
keyboard_handle = input_available;
|
||||
#endif /* WINDOWSNT */
|
||||
|
||||
/* interrupt_handle is signaled when quit (C-g) is detected, so that
|
||||
blocking system calls can be interrupted. We make it a manual
|
||||
|
@ -240,6 +249,22 @@ get_next_msg (W32Msg * lpmsg, BOOL bWait)
|
|||
return (bRet);
|
||||
}
|
||||
|
||||
extern char * w32_strerror (int error_no);
|
||||
|
||||
/* Tell the main thread that we have input available; if the main
|
||||
thread is blocked in select(), we wake it up here. */
|
||||
static void
|
||||
notify_msg_ready (void)
|
||||
{
|
||||
SetEvent (input_available);
|
||||
|
||||
#ifdef CYGWIN
|
||||
/* Wakes up the main thread, which is blocked select()ing for /dev/windows,
|
||||
among other files. */
|
||||
(void) PostThreadMessage (dwMainThreadId, WM_EMACS_INPUT_READY, 0, 0);
|
||||
#endif /* CYGWIN */
|
||||
}
|
||||
|
||||
BOOL
|
||||
post_msg (W32Msg * lpmsg)
|
||||
{
|
||||
|
@ -263,8 +288,7 @@ post_msg (W32Msg * lpmsg)
|
|||
}
|
||||
|
||||
lpTail = lpNew;
|
||||
SetEvent (input_available);
|
||||
|
||||
notify_msg_ready ();
|
||||
leave_crit ();
|
||||
|
||||
return (TRUE);
|
||||
|
@ -285,7 +309,7 @@ prepend_msg (W32Msg *lpmsg)
|
|||
nQueue++;
|
||||
lpNew->lpNext = lpHead;
|
||||
lpHead = lpNew;
|
||||
|
||||
notify_msg_ready ();
|
||||
leave_crit ();
|
||||
|
||||
return (TRUE);
|
||||
|
|
|
@ -43,7 +43,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
#ifdef HAVE_X_WINDOWS
|
||||
#include "xterm.h"
|
||||
#endif /* HAVE_X_WINDOWS */
|
||||
#ifdef WINDOWSNT
|
||||
#ifdef HAVE_NTGUI
|
||||
#include "w32term.h"
|
||||
#endif
|
||||
#ifdef MSDOS
|
||||
|
|
|
@ -302,7 +302,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
#ifdef HAVE_X_WINDOWS
|
||||
#include "xterm.h"
|
||||
#endif
|
||||
#ifdef WINDOWSNT
|
||||
#ifdef HAVE_NTGUI
|
||||
#include "w32term.h"
|
||||
#endif
|
||||
#ifdef HAVE_NS
|
||||
|
|
18
src/xfaces.c
18
src/xfaces.c
|
@ -227,13 +227,13 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
#include TERM_HEADER
|
||||
#include "fontset.h"
|
||||
#ifdef WINDOWSNT
|
||||
#ifdef HAVE_NTGUI
|
||||
#undef FRAME_X_DISPLAY_INFO
|
||||
#define FRAME_X_DISPLAY_INFO FRAME_W32_DISPLAY_INFO
|
||||
#define x_display_info w32_display_info
|
||||
#define check_x check_w32
|
||||
#define GCGraphicsExposures 0
|
||||
#endif /* WINDOWSNT */
|
||||
#endif /* HAVE_NTGUI */
|
||||
|
||||
#ifdef HAVE_NS
|
||||
#undef FRAME_X_DISPLAY_INFO
|
||||
|
@ -625,7 +625,7 @@ x_free_gc (struct frame *f, GC gc)
|
|||
|
||||
#endif /* HAVE_X_WINDOWS */
|
||||
|
||||
#ifdef WINDOWSNT
|
||||
#ifdef HAVE_NTGUI
|
||||
/* W32 emulation of GCs */
|
||||
|
||||
static GC
|
||||
|
@ -649,7 +649,7 @@ x_free_gc (struct frame *f, GC gc)
|
|||
xfree (gc);
|
||||
}
|
||||
|
||||
#endif /* WINDOWSNT */
|
||||
#endif /* HAVE_NTGUI */
|
||||
|
||||
#ifdef HAVE_NS
|
||||
/* NS emulation of GCs */
|
||||
|
@ -719,7 +719,7 @@ init_frame_faces (struct frame *f)
|
|||
#ifdef HAVE_X_WINDOWS
|
||||
if (!FRAME_X_P (f) || FRAME_X_WINDOW (f))
|
||||
#endif
|
||||
#ifdef WINDOWSNT
|
||||
#ifdef HAVE_NTGUI
|
||||
if (!FRAME_WINDOW_P (f) || FRAME_W32_WINDOW (f))
|
||||
#endif
|
||||
#ifdef HAVE_NS
|
||||
|
@ -1098,7 +1098,7 @@ defined_color (struct frame *f, const char *color_name, XColor *color_def,
|
|||
else if (FRAME_X_P (f))
|
||||
return x_defined_color (f, color_name, color_def, alloc);
|
||||
#endif
|
||||
#ifdef WINDOWSNT
|
||||
#ifdef HAVE_NTGUI
|
||||
else if (FRAME_W32_P (f))
|
||||
return w32_defined_color (f, color_name, color_def, alloc);
|
||||
#endif
|
||||
|
@ -3245,7 +3245,7 @@ FRAME 0 means change the face on all frames, and change the default
|
|||
param = Qbackground_color;
|
||||
}
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
#ifndef WINDOWSNT
|
||||
#ifndef HAVE_NTGUI
|
||||
else if (EQ (face, Qscroll_bar))
|
||||
{
|
||||
/* Changing the colors of `scroll-bar' sets frame parameters
|
||||
|
@ -3255,7 +3255,7 @@ FRAME 0 means change the face on all frames, and change the default
|
|||
else if (EQ (attr, QCbackground))
|
||||
param = Qscroll_bar_background;
|
||||
}
|
||||
#endif /* not WINDOWSNT */
|
||||
#endif /* not HAVE_NTGUI */
|
||||
else if (EQ (face, Qborder))
|
||||
{
|
||||
/* Changing background color of `border' sets frame parameter
|
||||
|
@ -6362,7 +6362,7 @@ where R,G,B are numbers between 0 and 255 and name is an arbitrary string. */)
|
|||
if (num >= 0 && name[num] == '\n')
|
||||
name[num] = 0;
|
||||
cmap = Fcons (Fcons (build_string (name),
|
||||
#ifdef WINDOWSNT
|
||||
#ifdef HAVE_NTGUI
|
||||
make_number (RGB (red, green, blue))),
|
||||
#else
|
||||
make_number ((red << 16) | (green << 8) | blue)),
|
||||
|
|
Loading…
Add table
Reference in a new issue