unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* [PATCH 1/9] Under Remote Desktop, NUMCOLORS is unreliable; workaround
  2012-08-07  8:19 [PATCH 0/9] Support Win32 GUI in Cygwin Emacs Daniel Colascione
                   ` (2 preceding siblings ...)
  2012-08-07  8:19 ` [PATCH 4/9] Fix emacsclient to work with cygw32 Daniel Colascione
@ 2012-08-07  8:19 ` Daniel Colascione
  2012-08-07 17:07   ` Eli Zaretskii
  2012-08-07  8:19 ` [PATCH 6/9] Rename `w32' local to `nt' for clarity Daniel Colascione
                   ` (5 subsequent siblings)
  9 siblings, 1 reply; 51+ messages in thread
From: Daniel Colascione @ 2012-08-07  8:19 UTC (permalink / raw)
  To: emacs-devel

Under remote desktop, Windows returns the wrong number of colors from
GetDeviceCaps (hdc, NUMCOLORS).  I hit this bug myself, and MSDN
comments seem to indicate that others hit it as well.  The workaround
seems harmless: on non-palettized displays, calculating the number of
display colors based on display bitness should produce good results.
---
 src/w32fns.c |    9 ++++++++-
 1 files changed, 8 insertions(+), 1 deletions(-)

diff --git a/src/w32fns.c b/src/w32fns.c
index b82d4bc..7fc5cf5 100644
--- a/src/w32fns.c
+++ b/src/w32fns.c
@@ -4513,8 +4513,15 @@ If omitted or nil, that stands for the selected frame's display.  */)
   hdc = GetDC (dpyinfo->root_window);
   if (dpyinfo->has_palette)
     cap = GetDeviceCaps (hdc, SIZEPALETTE);
-  else
+  else if (dpyinfo->n_cbits <= 8)
+    /* According to the MSDN, GetDeviceCaps (NUMCOLORS) is valid only
+       for devices with at most eight bits per pixel.  It's supposed
+       to return -1 for other displays, but because it actually
+       returns other, incorrect values under some conditions (e.g.,
+       remote desktop), only use it when we know it's valid.  */
     cap = GetDeviceCaps (hdc, NUMCOLORS);
+  else
+    cap = -1;
 
   /* We force 24+ bit depths to 24-bit, both to prevent an overflow
      and because probably is more meaningful on Windows anyway */
-- 
1.7.2.5





^ permalink raw reply related	[flat|nested] 51+ messages in thread

* [PATCH 5/9] Prevent crash if w32 used before it's initialized
  2012-08-07  8:19 [PATCH 0/9] Support Win32 GUI in Cygwin Emacs Daniel Colascione
                   ` (4 preceding siblings ...)
  2012-08-07  8:19 ` [PATCH 6/9] Rename `w32' local to `nt' for clarity Daniel Colascione
@ 2012-08-07  8:19 ` Daniel Colascione
  2012-08-07 17:23   ` Eli Zaretskii
  2012-08-07  8:19 ` [PATCH 9/9] Detect window-system from display name Daniel Colascione
                   ` (3 subsequent siblings)
  9 siblings, 1 reply; 51+ messages in thread
From: Daniel Colascione @ 2012-08-07  8:19 UTC (permalink / raw)
  To: emacs-devel

---
 src/w32fns.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/src/w32fns.c b/src/w32fns.c
index 8ef4982..9743822 100644
--- a/src/w32fns.c
+++ b/src/w32fns.c
@@ -4833,7 +4833,7 @@ x_display_info_for_name (Lisp_Object name)
   CHECK_STRING (name);
 
   for (dpyinfo = &one_w32_display_info, names = w32_display_name_list;
-       dpyinfo;
+       dpyinfo && !NILP (w32_display_name_list);
        dpyinfo = dpyinfo->next, names = XCDR (names))
     {
       Lisp_Object tem;
-- 
1.7.2.5





^ permalink raw reply related	[flat|nested] 51+ messages in thread

* [PATCH 4/9] Fix emacsclient to work with cygw32
  2012-08-07  8:19 [PATCH 0/9] Support Win32 GUI in Cygwin Emacs Daniel Colascione
  2012-08-07  8:19 ` [PATCH 3/9] Implement cygw32 Daniel Colascione
  2012-08-07  8:19 ` [PATCH 7/9] Add alt_display to emacsclient for w32, ns Daniel Colascione
@ 2012-08-07  8:19 ` Daniel Colascione
  2012-08-07 18:14   ` Eli Zaretskii
  2012-08-07  8:19 ` [PATCH 1/9] Under Remote Desktop, NUMCOLORS is unreliable; workaround Daniel Colascione
                   ` (6 subsequent siblings)
  9 siblings, 1 reply; 51+ messages in thread
From: Daniel Colascione @ 2012-08-07  8:19 UTC (permalink / raw)
  To: emacs-devel

---
 lib-src/emacsclient.c |   71 +++++++++++++++++++++++++-----------------------
 lisp/server.el        |   10 +++++--
 2 files changed, 44 insertions(+), 37 deletions(-)

diff --git a/lib-src/emacsclient.c b/lib-src/emacsclient.c
index 0ba6535..83e357c 100644
--- a/lib-src/emacsclient.c
+++ b/lib-src/emacsclient.c
@@ -43,6 +43,10 @@ char *w32_getenv (char *);
 
 #else /* !WINDOWSNT */
 
+# ifdef HAVE_NTGUI
+# include <windows.h>
+# endif /* HAVE_NTGUI */
+
 # include "syswait.h"
 
 # ifdef HAVE_INET_SOCKETS
@@ -188,9 +192,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 }
 };
@@ -406,32 +408,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)
@@ -1436,10 +1412,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)
 {
@@ -1488,7 +1491,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.  */
 
@@ -1558,11 +1561,11 @@ main (int argc, char **argv)
   main_argv = argv;
   progname = argv[0];
 
-#ifdef WINDOWSNT
+#ifdef HAVE_NTGUI
   /* On Windows 7 and later, we need to explicitly associate emacsclient
      with emacs so the UI behaves sensibly.  */
   w32_set_user_model_id ();
-#endif
+#endif /* HAVE_NTGUI */
 
   /* Process options.  */
   decode_options (argc, argv);
@@ -1598,9 +1601,9 @@ main (int argc, char **argv)
       fail ();
     }
 
-#ifdef WINDOWSNT
+#ifdef HAVE_NTGUI
   w32_give_focus ();
-#endif
+#endif /* HAVE_NTGUI */
 
   /* Send over our environment and current directory. */
   if (!current_frame)
diff --git a/lisp/server.el b/lisp/server.el
index a25da40..0ef76dc 100644
--- a/lisp/server.el
+++ b/lisp/server.el
@@ -1115,9 +1115,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
-- 
1.7.2.5





^ permalink raw reply related	[flat|nested] 51+ messages in thread

* [PATCH 0/9] Support Win32 GUI in Cygwin Emacs
@ 2012-08-07  8:19 Daniel Colascione
  2012-08-07  8:19 ` [PATCH 3/9] Implement cygw32 Daniel Colascione
                   ` (9 more replies)
  0 siblings, 10 replies; 51+ messages in thread
From: Daniel Colascione @ 2012-08-07  8:19 UTC (permalink / raw)
  To: emacs-devel

This set of patches allows a Cygwin Emacs to use the w32 window-system
instead of X11.  (The ability to use X11 with Cygwin is retained.)
This patchset also fixes a few bugs in the Windows code and makes the
window-system configuration mechanism more generic, eliminating
inclusion of window-system specific headers in most of the code.

This is the second version of this patch set.  This version is 
rebased onto the current Emacs trunk.

Daniel Colascione (9):
  Under Remote Desktop, NUMCOLORS is unreliable; workaround
  Refactor window-system configuration
  Implement cygw32
  Fix emacsclient to work with cygw32
  Prevent crash if w32 used before it's initialized
  Rename `w32' local to `nt' for clarity
  Add alt_display to emacsclient for w32, ns
  Generalize fork+exec logic, add DAEMON_MUST_EXEC
  Detect window-system from display name

 configure.ac                    |  133 ++++++-
 lib-src/emacsclient.c           |  198 ++++++-----
 lisp/battery.el                 |    2 +-
 lisp/faces.el                   |    2 +-
 lisp/frame.el                   |   55 ++--
 lisp/international/mule-cmds.el |    3 +-
 lisp/loadup.el                  |   13 +-
 lisp/mouse.el                   |    2 +-
 lisp/server.el                  |   81 +++--
 lisp/simple.el                  |    2 +-
 lisp/startup.el                 |    3 +-
 lisp/term/common-win.el         |    2 +-
 lisp/term/ns-win.el             |    4 +-
 lisp/term/w32-win.el            |   49 ++-
 lisp/term/x-win.el              |    5 +
 lisp/w32-common-fns.el          |  130 +++++++
 lisp/w32-fns.el                 |  105 +------
 lisp/w32-vars.el                |   22 +-
 src/Makefile.in                 |   34 ++-
 src/ccl.h                       |    2 +
 src/conf_post.h                 |   14 +
 src/cygw32.c                    |  169 +++++++++
 src/cygw32.h                    |   59 +++
 src/dispextern.h                |    4 +-
 src/dispnew.c                   |   14 +-
 src/emacs.c                     |   78 +++--
 src/font.c                      |   18 +-
 src/font.h                      |    4 +-
 src/fontset.c                   |    2 +-
 src/frame.c                     |   23 +-
 src/frame.h                     |   33 ++-
 src/gtkutil.h                   |    1 +
 src/image.c                     |   85 +++--
 src/keyboard.c                  |   31 +-
 src/keyboard.h                  |    4 +-
 src/menu.c                      |   21 +-
 src/nsterm.h                    |   27 +--
 src/process.c                   |    8 +-
 src/termhooks.h                 |    6 +-
 src/w32.c                       |   19 +-
 src/w32.h                       |   11 -
 src/w32console.c                |   48 ---
 src/w32fns.c                    |  748 ++++++++++++++++++++++++++++++++-------
 src/w32font.c                   |    4 +
 src/w32font.h                   |    4 +
 src/w32inevt.c                  |   29 +--
 src/w32menu.c                   |   22 ++-
 src/w32proc.c                   |   14 -
 src/w32select.c                 |    5 +
 src/w32select.h                 |   30 ++
 src/w32term.c                   |   52 ++-
 src/w32term.h                   |   73 ++++-
 src/w32xfns.c                   |   34 ++-
 src/window.c                    |    2 +-
 src/xdisp.c                     |    6 +-
 src/xfaces.c                    |   36 +-
 src/xterm.h                     |   27 +-
 57 files changed, 1804 insertions(+), 808 deletions(-)
 create mode 100644 lisp/w32-common-fns.el
 create mode 100644 src/cygw32.c
 create mode 100644 src/cygw32.h
 create mode 100644 src/w32select.h

-- 
1.7.2.5




^ permalink raw reply	[flat|nested] 51+ messages in thread

* [PATCH 7/9] Add alt_display to emacsclient for w32, ns
  2012-08-07  8:19 [PATCH 0/9] Support Win32 GUI in Cygwin Emacs Daniel Colascione
  2012-08-07  8:19 ` [PATCH 3/9] Implement cygw32 Daniel Colascione
@ 2012-08-07  8:19 ` Daniel Colascione
  2012-08-07 15:22   ` Stefan Monnier
  2012-08-07  8:19 ` [PATCH 4/9] Fix emacsclient to work with cygw32 Daniel Colascione
                   ` (7 subsequent siblings)
  9 siblings, 1 reply; 51+ messages in thread
From: Daniel Colascione @ 2012-08-07  8:19 UTC (permalink / raw)
  To: emacs-devel

---
 lib-src/emacsclient.c |  127 ++++++++++++++++++++++++++++++-------------------
 1 files changed, 78 insertions(+), 49 deletions(-)

diff --git a/lib-src/emacsclient.c b/lib-src/emacsclient.c
index 83e357c..56914df 100644
--- a/lib-src/emacsclient.c
+++ b/lib-src/emacsclient.c
@@ -150,6 +150,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;
 
@@ -602,16 +605,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 = "windows";
 #endif
+
+      display = egetenv ("DISPLAY");
+    }
+
+  if (!display)
+    {
+      display = alt_display;
+      alt_display = NULL;
     }
 
   /* A null-string display is invalid.  */
@@ -1562,8 +1578,10 @@ main (int argc, char **argv)
   progname = argv[0];
 
 #ifdef HAVE_NTGUI
-  /* On Windows 7 and later, we need to explicitly associate emacsclient
-     with emacs so the UI behaves sensibly.  */
+  /* 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 /* HAVE_NTGUI */
 
@@ -1602,6 +1620,7 @@ main (int argc, char **argv)
     }
 
 #ifdef HAVE_NTGUI
+  if (display && !strcmp (display, "windows"))
   w32_give_focus ();
 #endif /* HAVE_NTGUI */
 
@@ -1777,46 +1796,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))
 	    {
-- 
1.7.2.5





^ permalink raw reply related	[flat|nested] 51+ messages in thread

* [PATCH 9/9] Detect window-system from display name
  2012-08-07  8:19 [PATCH 0/9] Support Win32 GUI in Cygwin Emacs Daniel Colascione
                   ` (5 preceding siblings ...)
  2012-08-07  8:19 ` [PATCH 5/9] Prevent crash if w32 used before it's initialized Daniel Colascione
@ 2012-08-07  8:19 ` Daniel Colascione
  2012-08-07 15:50   ` Stefan Monnier
                     ` (2 more replies)
  2012-08-07  8:19 ` [PATCH 2/9] Refactor window-system configuration Daniel Colascione
                   ` (2 subsequent siblings)
  9 siblings, 3 replies; 51+ messages in thread
From: Daniel Colascione @ 2012-08-07  8:19 UTC (permalink / raw)
  To: emacs-devel

---
 lisp/frame.el        |   53 +++++++++++++++++++++++++----------------
 lisp/server.el       |   63 +++++++++++++++++++++++++++-----------------------
 lisp/startup.el      |    3 +-
 lisp/term/ns-win.el  |    4 ++-
 lisp/term/w32-win.el |    7 ++++-
 lisp/term/x-win.el   |    5 ++++
 src/w32fns.c         |    5 +++-
 7 files changed, 85 insertions(+), 55 deletions(-)

diff --git a/lisp/frame.el b/lisp/frame.el
index 6d6da07..5df2b73 100644
--- a/lisp/frame.el
+++ b/lisp/frame.el
@@ -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 window-system 'w32)
-	 ;; 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)
diff --git a/lisp/server.el b/lisp/server.el
index 656be75..f595669 100644
--- a/lisp/server.el
+++ b/lisp/server.el
@@ -827,35 +827,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
diff --git a/lisp/startup.el b/lisp/startup.el
index 348e653..dd21663 100644
--- a/lisp/startup.el
+++ b/lisp/startup.el
@@ -882,7 +882,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
diff --git a/lisp/term/ns-win.el b/lisp/term/ns-win.el
index 06b6747..b46c31a 100644
--- a/lisp/term/ns-win.el
+++ b/lisp/term/ns-win.el
@@ -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)))
@@ -897,6 +897,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))
@@ -924,6 +925,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))
diff --git a/lisp/term/w32-win.el b/lisp/term/w32-win.el
index dd577af..d6d1da8 100644
--- a/lisp/term/w32-win.el
+++ b/lisp/term/w32-win.el
@@ -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)
@@ -240,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.
@@ -253,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 "windows" x-command-line-resources
                      ;; Exit with a fatal error if this fails and we
                      ;; are the initial display
                      (eq initial-window-system 'w32))
@@ -304,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
@@ -322,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 '("\\`windows\\'" . 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))
diff --git a/lisp/term/x-win.el b/lisp/term/x-win.el
index fb7389b..b5dfa23 100644
--- a/lisp/term/x-win.el
+++ b/lisp/term/x-win.el
@@ -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)))
 
@@ -1341,6 +1343,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)
@@ -1454,6 +1458,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))
diff --git a/src/w32fns.c b/src/w32fns.c
index 9743822..4d5e133 100644
--- a/src/w32fns.c
+++ b/src/w32fns.c
@@ -4871,12 +4871,15 @@ terminate Emacs if we can't open the connection.
   unsigned char *xrm_option;
   struct w32_display_info *dpyinfo;
 
+  CHECK_STRING (display);
+  if (strcmp (SSDATA (display), "windows"))
+    error ("The name of the Windows display must be \"windows\"");
+
   /* 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);
 
-- 
1.7.2.5




^ permalink raw reply related	[flat|nested] 51+ messages in thread

* [PATCH 3/9] Implement cygw32
  2012-08-07  8:19 [PATCH 0/9] Support Win32 GUI in Cygwin Emacs Daniel Colascione
@ 2012-08-07  8:19 ` Daniel Colascione
  2012-08-07 15:40   ` Stefan Monnier
  2012-08-07 18:02   ` Eli Zaretskii
  2012-08-07  8:19 ` [PATCH 7/9] Add alt_display to emacsclient for w32, ns Daniel Colascione
                   ` (8 subsequent siblings)
  9 siblings, 2 replies; 51+ messages in thread
From: Daniel Colascione @ 2012-08-07  8:19 UTC (permalink / raw)
  To: emacs-devel

Here, we use the generic window-system configuration system we just
implemented to support the w32 window-system in the mainline build
under Cygwin.  (Previously, the w32 window system could only be
compiled as part of the NT-native Emacs build process.)

The changes in this patch need to be applied atomically in order to
avoid breaking Emacs.  The changes include:

  - Changes throughout the Lisp and C code to not assume that
      NT Emacs and the w32 window system are synonymous.

  - Wiring up the regular select(2) event loop to Windows messages

  - Cleaning up the w32 drag-and-drop receiving code.

  - Exposing Cygwin path conversion functions to elisp.

  - Unicode file dialog support when compiling for Cygwin.

  - Splitting the w32 term lisp initialization code into code
    applicable to any w32 window-system and code specific to
    system-type windows-nt.

  - Integrating the old and new w32 code into the build system.
---
 configure.ac                    |   82 ++++-
 lisp/battery.el                 |    2 +-
 lisp/faces.el                   |    2 +-
 lisp/frame.el                   |    4 +-
 lisp/international/mule-cmds.el |    3 +-
 lisp/loadup.el                  |   13 +-
 lisp/mouse.el                   |    2 +-
 lisp/simple.el                  |    2 +-
 lisp/term/common-win.el         |    2 +-
 lisp/term/w32-win.el            |   42 ++-
 lisp/w32-common-fns.el          |  130 +++++++
 lisp/w32-fns.el                 |  105 +------
 lisp/w32-vars.el                |   22 +-
 src/Makefile.in                 |   25 +-
 src/conf_post.h                 |   14 +
 src/cygw32.c                    |  169 +++++++++
 src/cygw32.h                    |   59 ++++
 src/dispextern.h                |    4 +-
 src/emacs.c                     |   28 ++-
 src/font.c                      |    4 +-
 src/font.h                      |    4 +-
 src/fontset.c                   |    2 +-
 src/frame.c                     |    4 +-
 src/frame.h                     |    3 +-
 src/image.c                     |   55 ++-
 src/keyboard.c                  |   12 +-
 src/keyboard.h                  |    2 +-
 src/menu.c                      |    4 +
 src/process.c                   |    1 +
 src/termhooks.h                 |    6 +-
 src/w32.c                       |   19 +-
 src/w32.h                       |   11 -
 src/w32console.c                |   48 ---
 src/w32fns.c                    |  732 ++++++++++++++++++++++++++++++++-------
 src/w32font.c                   |    4 +
 src/w32inevt.c                  |   29 +--
 src/w32menu.c                   |   22 ++-
 src/w32proc.c                   |   14 -
 src/w32select.c                 |    5 +
 src/w32select.h                 |   30 ++
 src/w32term.c                   |   52 +++-
 src/w32term.h                   |   71 ++++-
 src/w32xfns.c                   |   34 ++-
 src/window.c                    |    2 +-
 src/xdisp.c                     |    6 +-
 src/xfaces.c                    |   18 +-
 src/xterm.h                     |    1 -
 47 files changed, 1423 insertions(+), 482 deletions(-)
 create mode 100644 lisp/w32-common-fns.el
 create mode 100644 src/cygw32.c
 create mode 100644 src/cygw32.h
 create mode 100644 src/w32select.h

diff --git a/configure.ac b/configure.ac
index 9331bec..4aadc7e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -171,6 +171,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])
@@ -1481,6 +1482,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
@@ -1524,6 +1526,30 @@ AC_SUBST(NS_OBJC_OBJ)
 AC_SUBST(LIB_STANDARD)
 AC_SUBST_FILE(ns_frag)
 
+HAVE_W32=no
+W32_OBJ=
+W32_LIBS=
+if test "${with_w32}" != no; then
+  if test "${opsys}" != "cygwin"; then
+    AC_MSG_ERROR([Using win32 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.
 
@@ -1557,6 +1583,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
@@ -2243,6 +2272,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
 
@@ -2409,6 +2441,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,
@@ -2435,12 +2502,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.
@@ -2468,7 +2536,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.
@@ -2501,7 +2569,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"
@@ -2521,7 +2589,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.
@@ -2603,6 +2672,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
@@ -4093,7 +4165,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
diff --git a/lisp/battery.el b/lisp/battery.el
index 8e98291..69d2564 100644
--- a/lisp/battery.el
+++ b/lisp/battery.el
@@ -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.
diff --git a/lisp/faces.el b/lisp/faces.el
index 2e1ba77..ab5e4cf 100644
--- a/lisp/faces.el
+++ b/lisp/faces.el
@@ -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")
diff --git a/lisp/frame.el b/lisp/frame.el
index 7780283..6d6da07 100644
--- a/lisp/frame.el
+++ b/lisp/frame.el
@@ -524,7 +524,7 @@ The optional argument PARAMETERS specifies additional frame parameters."
 	   (ns-initialize-window-system))
 	 (make-frame `((window-system . ns)
 		       (display . ,display) . ,parameters)))
-	((eq system-type 'windows-nt)
+	((eq window-system 'w32)
 	 ;; On Windows, ignore DISPLAY.
 	 (make-frame parameters))
 	(t
@@ -1258,7 +1258,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))
diff --git a/lisp/international/mule-cmds.el b/lisp/international/mule-cmds.el
index 30dc88a..c85250c 100644
--- a/lisp/international/mule-cmds.el
+++ b/lisp/international/mule-cmds.el
@@ -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))
diff --git a/lisp/loadup.el b/lisp/loadup.el
index d316f28..7f3ca8c 100644
--- a/lisp/loadup.el
+++ b/lisp/loadup.el
@@ -225,15 +225,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")
diff --git a/lisp/mouse.el b/lisp/mouse.el
index 71336c0..0fbf2f9 100644
--- a/lisp/mouse.el
+++ b/lisp/mouse.el
@@ -1144,7 +1144,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
diff --git a/lisp/simple.el b/lisp/simple.el
index 6b5da29..240607b 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -6841,7 +6841,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))
diff --git a/lisp/term/common-win.el b/lisp/term/common-win.el
index 067b996..b44e092 100644
--- a/lisp/term/common-win.el
+++ b/lisp/term/common-win.el
@@ -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))
diff --git a/lisp/term/w32-win.el b/lisp/term/w32-win.el
index a4fac34..dd577af 100644
--- a/lisp/term/w32-win.el
+++ b/lisp/term/w32-win.el
@@ -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.
 
@@ -102,7 +102,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 +131,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)
diff --git a/lisp/w32-common-fns.el b/lisp/w32-common-fns.el
new file mode 100644
index 0000000..fc04568
--- /dev/null
+++ b/lisp/w32-common-fns.el
@@ -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
+
+\f
+;;;; 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))))))
+\f
+(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)
diff --git a/lisp/w32-fns.el b/lisp/w32-fns.el
index 1769ee7..813a8fd 100644
--- a/lisp/w32-fns.el
+++ b/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'.
@@ -380,40 +311,6 @@ bit output with no translation."
                         'w32-charset-info-alist "21.1")
 
 \f
-;;;; 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))))))
-\f
-(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)
-
-\f
 ;;;; Support for build process
 
 ;; From autoload.el
diff --git a/lisp/w32-vars.el b/lisp/w32-vars.el
index c8716ef..0e152b1 100644
--- a/lisp/w32-vars.el
+++ b/lisp/w32-vars.el
@@ -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)
-
-(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-allow-system-shell nil
+    "Disable startup warning when using \"system\" shells."
+    :type 'boolean
+    :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
diff --git a/src/Makefile.in b/src/Makefile.in
index 38ce194..6819e3e3 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -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
@@ -341,7 +345,7 @@ base_obj = dispnew.o frame.o scroll.o xdisp.o menu.o $(XMENU_OBJ) window.o \
 	region-cache.o sound.o atimer.o \
 	doprnt.o intervals.o textprop.o composite.o xml.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.
@@ -350,9 +354,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
@@ -384,7 +388,8 @@ 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) \
+LIBES = $(LIBS) $(W32_LIBS) $(LIBX_BASE) $(LIBIMAGE) \
+   $(LIBX_OTHER) $(LIBSOUND) \
    $(RSVG_LIBS) $(IMAGEMAGICK_LIBS) $(LIB_CLOCK_GETTIME) $(DBUS_LIBS) \
    $(LIBXML2_LIBS) $(LIBGPM) $(LIBRESOLV) $(LIBS_SYSTEM) \
    $(LIBS_TERMCAP) $(GETLOADAVG_LIBS) $(SETTINGS_LIBS) $(LIBSELINUX_LIBS) \
diff --git a/src/conf_post.h b/src/conf_post.h
index e935940..fc31c8e 100644
--- a/src/conf_post.h
+++ b/src/conf_post.h
@@ -164,6 +164,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
diff --git a/src/cygw32.c b/src/cygw32.c
new file mode 100644
index 0000000..0e87ade
--- /dev/null
+++ b/src/cygw32.c
@@ -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);
+}
diff --git a/src/cygw32.h b/src/cygw32.h
new file mode 100644
index 0000000..6fae131
--- /dev/null
+++ b/src/cygw32.h
@@ -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 */
diff --git a/src/dispextern.h b/src/dispextern.h
index 0986950..e824073 100644
--- a/src/dispextern.h
+++ b/src/dispextern.h
@@ -3139,7 +3139,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
@@ -3241,7 +3241,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
 
diff --git a/src/emacs.c b/src/emacs.c
index c86f4b2..a4fab12 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -37,9 +37,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 NS_IMPL_GNUSTEP
@@ -1495,6 +1506,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 ();
@@ -1525,11 +1539,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 ();
@@ -1572,8 +1589,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 ();
diff --git a/src/font.c b/src/font.c
index f0ccbb3..07b7711 100644
--- a/src/font.c
+++ b/src/font.c
@@ -5210,9 +5210,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 */
diff --git a/src/font.h b/src/font.h
index 2e37457..f19c5fe 100644
--- a/src/font.h
+++ b/src/font.h
@@ -826,11 +826,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;
diff --git a/src/fontset.c b/src/fontset.c
index 7a2c091..80bed5c 100644
--- a/src/fontset.c
+++ b/src/fontset.c
@@ -43,7 +43,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
diff --git a/src/frame.c b/src/frame.c
index 651d27e..9978015 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -2667,7 +2667,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).
@@ -2711,7 +2711,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
 
diff --git a/src/frame.h b/src/frame.h
index 629f050..a9da72c 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -1104,7 +1104,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
@@ -1176,6 +1176,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 *);
 
 /* In xmenu.c */
 extern void set_frame_menubar (FRAME_PTR, int, int);
diff --git a/src/image.c b/src/image.c
index 34faa87..84623cb 100644
--- a/src/image.c
+++ b/src/image.c
@@ -567,12 +567,14 @@ static void x_laplace (struct frame *, struct image *);
 static void x_emboss (struct frame *, struct image *);
 static int x_build_heuristic_mask (struct frame *, struct image *,
                                    Lisp_Object);
-#ifdef HAVE_NTGUI
+#if 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)
@@ -1858,7 +1860,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
@@ -1869,7 +1871,7 @@ mark_image_cache (struct image_cache *c)
     if (!fn_##func) return 0;						\
   }
 
-#endif /* HAVE_NTGUI */
+#endif /* WINDOWSNT */
 
 static int x_create_x_image_and_pixmap (struct frame *, int, int, int,
                                         XImagePtr *, Pixmap *);
@@ -2932,7 +2934,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;
@@ -3240,7 +3242,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.  */
 
@@ -3266,8 +3268,15 @@ init_xpm_functions (Lisp_Object libraries)
   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 non-zero if COLOR_SYMBOLS is a valid color symbols list
    for XPM images.  Such a list must consist of conses whose car and
@@ -5410,7 +5419,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));
@@ -5510,7 +5519,7 @@ init_png_functions (Lisp_Object libraries)
 #define fn_png_set_longjmp_fn		png_set_longjmp_fn
 #endif /* libpng version >= 1.5 */
 
-#endif /* HAVE_NTGUI */
+#endif /* WINDOWSNT */
 
 
 #if (PNG_LIBPNG_VER < 10500)
@@ -6041,14 +6050,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));
@@ -6098,7 +6113,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
 {
@@ -6579,7 +6594,7 @@ tiff_image_p (Lisp_Object object)
 
 #include <tiffio.h>
 
-#ifdef HAVE_NTGUI
+#ifdef WINDOWSNT
 
 /* TIFF library details.  */
 DEF_IMGLIB_FN (TIFFErrorHandler, TIFFSetErrorHandler, (TIFFErrorHandler));
@@ -6623,7 +6638,7 @@ init_tiff_functions (Lisp_Object libraries)
 #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
@@ -7052,7 +7067,7 @@ gif_image_p (Lisp_Object object)
 #endif /* HAVE_NTGUI */
 
 
-#ifdef HAVE_NTGUI
+#ifdef WINDOWSNT
 
 /* GIF library details.  */
 DEF_IMGLIB_FN (int, DGifCloseFile, (GifFileType *));
@@ -7082,7 +7097,7 @@ init_gif_functions (Lisp_Object libraries)
 #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. */
@@ -8071,7 +8086,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);
@@ -8149,7 +8164,7 @@ init_svg_functions (Lisp_Object libraries)
 #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 non-zero if
    successful. this function will go into the svg_type structure, and
@@ -8697,7 +8712,7 @@ DEFUN ("lookup-image", Flookup_image, Slookup_image, 1, 1, 0, "")
 			    Initialization
  ***********************************************************************/
 
-#ifdef HAVE_NTGUI
+#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) \
@@ -8705,7 +8720,7 @@ DEFUN ("lookup-image", Flookup_image, Slookup_image, 1, 1, 0, "")
 #else
 #define CHECK_LIB_AVAILABLE(image_type, init_lib_fn, libraries) \
   define_image_type (image_type, 1)
-#endif /* HAVE_NTGUI */
+#endif /* WINDOWSNT */
 
 DEFUN ("init-image-library", Finit_image_library, Sinit_image_library, 2, 2, 0,
        doc: /* Initialize image library implementing image type TYPE.
@@ -8716,7 +8731,7 @@ Libraries to load are specified in alist LIBRARIES (usually, the value
 of `dynamic-library-alist', which see).  */)
   (Lisp_Object type, Lisp_Object libraries)
 {
-#ifdef HAVE_NTGUI
+#ifdef WINDOWSNT
   /* Don't try to reload the library.  */
   Lisp_Object tested = Fassq (type, Vlibrary_cache);
   if (CONSP (tested))
diff --git a/src/keyboard.c b/src/keyboard.c
index 7cc6069..84af7d8 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -311,7 +311,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;
@@ -3770,8 +3770,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 ();
 #ifdef SIGIO
       if (!noninteractive)
@@ -3957,7 +3957,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)).  */
@@ -5415,7 +5415,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]))
@@ -11444,7 +11444,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
 
diff --git a/src/keyboard.h b/src/keyboard.h
index bfdcd0d..8a8ec71 100644
--- a/src/keyboard.h
+++ b/src/keyboard.h
@@ -506,6 +506,6 @@ extern int tty_read_avail_input (struct terminal *, int,
 extern EMACS_TIME timer_check (void);
 extern void mark_kboards (void);
 
-#ifdef WINDOWSNT
+#ifdef HAVE_NTGUI
 extern const char *const lispy_function_keys[];
 #endif
diff --git a/src/menu.c b/src/menu.c
index 2077053..336e1a9 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -41,7 +41,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  */
 
diff --git a/src/process.c b/src/process.c
index f7f0d10..88afcfc 100644
--- a/src/process.c
+++ b/src/process.c
@@ -4593,6 +4593,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)
diff --git a/src/termhooks.h b/src/termhooks.h
index 4cad482..f9dde9b 100644
--- a/src/termhooks.h
+++ b/src/termhooks.h
@@ -102,9 +102,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 on HAVE_NTGUI or Mac OS
 				   when the keyboard layout or input
 				   language is changed by the
 				   user.  */
@@ -183,7 +183,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
diff --git a/src/w32.c b/src/w32.c
index 810ae02..ceb1338 100644
--- a/src/w32.c
+++ b/src/w32.c
@@ -31,7 +31,6 @@ 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 <setjmp.h>
 #include <time.h>
@@ -39,6 +38,7 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 /* must include CRT headers *before* config.h */
 
 #include <config.h>
+#include <mbstring.h>	/* for _mbspbrk */
 
 #undef access
 #undef chdir
@@ -867,23 +867,6 @@ create_symbolic_link (LPTSTR lpSymlinkFilename,
   return retval;
 }
 \f
-/* 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.
diff --git a/src/w32.h b/src/w32.h
index 73d57a6..26ea015 100644
--- a/src/w32.h
+++ b/src/w32.h
@@ -130,17 +130,6 @@ extern LPBYTE w32_get_resource (char * key, LPDWORD type);
 extern void init_ntproc (void);
 extern void term_ntproc (void);
 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 int _sys_read_ahead (int fd);
 extern int _sys_wait_accept (int fd);
diff --git a/src/w32console.c b/src/w32console.c
index 7658585..45a7155 100644
--- a/src/w32console.c
+++ b/src/w32console.c
@@ -431,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)
@@ -851,5 +804,4 @@ scroll-back buffer.  */);
   defsubr (&Sset_screen_color);
   defsubr (&Sget_screen_color);
   defsubr (&Sset_cursor_size);
-  defsubr (&Sset_message_beep);
 }
diff --git a/src/w32fns.c b/src/w32fns.c
index 7fc5cf5..8ef4982 100644
--- a/src/w32fns.c
+++ b/src/w32fns.c
@@ -45,8 +45,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"
 
@@ -59,9 +65,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"
@@ -79,6 +82,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-zero, a w32 timer that, when it expires, displays an
    hourglass cursor on all frames.  */
@@ -165,7 +169,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;
@@ -201,6 +209,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)
 
 \f
 /* Error if we are not connected to MS-Windows.  */
@@ -1832,10 +1867,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)
     {
@@ -2235,6 +2267,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 */
+
 /* Main message dispatch loop. */
 
 static void
@@ -2248,6 +2332,10 @@ w32_msg_pump (deferred_msg * msg_buf)
 
   while (GetMessage (&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)
@@ -2335,7 +2423,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
 	    }
 	}
@@ -4671,6 +4759,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;
+}
+
 \f
 int
 x_pixel_width (register struct frame *f)
@@ -5842,6 +5961,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
@@ -5852,7 +5983,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)
@@ -5880,7 +6015,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
@@ -5896,7 +6031,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);
 	    }
 	}
@@ -5904,19 +6040,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
@@ -5928,134 +6051,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));
+  GCPRO6 (prompt, dir, default_filename, mustmatch, only_dir_p, filename);
 
-      unixtodos_filename (full_path_name);
+  {
+    struct gcpro gcpro1, gcpro2;
+    GCPRO2 (orig_dir, orig_prompt); /* There is no GCPRON, N>6.  */
 
-      file_name_only = strrchr (full_path_name, '\\');
-      if (!file_name_only)
-        file_name_only = full_path_name;
-      else
-	file_name_only++;
+    /* 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!  */
 
-      strncpy (filename, file_name_only, MAX_PATH);
-      filename[MAX_PATH] = '\0';
-    }
-  else
-    filename[0] = '\0';
+    CHECK_STRING (prompt);
+    CHECK_STRING (dir);
 
-  /* 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");
+    dir = Fexpand_file_name (dir, Qnil);
 
-  {
-    NEWOPENFILENAME new_file_details;
-    BOOL file_opened = FALSE;
-    OPENFILENAME * file_details = &new_file_details.real_details;
+    if (STRINGP (filename))
+      filename = Ffile_name_nondirectory (filename);
+    else
+      filename = empty_unibyte_string;
 
-    /* Prevent redisplay.  */
-    specbind (Qinhibit_redisplay, Qt);
-    BLOCK_INPUT;
+#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));
-    /* 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);
+      file_details->lStructSize = sizeof (new_file_details);
     else
-      file_details->lStructSize = sizeof (OPENFILENAME);
+      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;
-
-    file_opened = GetOpenFileName (file_details);
+    {
+      int count = SPECPDL_INDEX ();
+      specbind (Qinhibit_redisplay, Qt);
+      BLOCK_INPUT;
+      file_details->lpfnHook = file_dialog_callback;
 
-    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);
-
-	if (file_details->nFilterIndex == 2)
-	  {
-	    /* "Directories" selected - strip dummy file name.  */
-	    char * last = strrchr (filename, '/');
-	    *last = '\0';
-	  }
-
-	file = DECODE_FILE (build_string (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 (make_string (filename_buf));
+#endif /* NTGUI_UNICODE */
+
+#ifdef CYGWIN
+        filename = Fcygwin_convert_path_from_windows (filename, Qt);
+#endif /* CYGWIN */
+
+        /* 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);
 }
 
-
+\f
+#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,
@@ -6109,6 +6301,8 @@ DEFUN ("system-move-file-to-trash", Fsystem_move_file_to_trash,
   return Qnil;
 }
 
+#endif /* WINDOWSNT */
+
 \f
 /***********************************************************************
                          w32 specialized functions
@@ -6526,7 +6720,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);
 	}
 
@@ -6537,18 +6731,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);
 	}
 
@@ -6710,10 +6904,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';
 	}
@@ -6732,6 +6926,292 @@ DEFUN ("default-printer-name", Fdefault_printer_name, Sdefault_printer_name,
   return build_string (pname_buf);
 }
 \f
+
+/* 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);
+}
+
+\f
 /***********************************************************************
 			    Initialization
  ***********************************************************************/
@@ -7099,10 +7579,10 @@ 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;
 
-
   hourglass_timer = 0;
   hourglass_hwnd = NULL;
 
@@ -7117,7 +7597,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
 }
 
 
@@ -7196,9 +7678,3 @@ w32_abort (void)
     }
 }
 
-/* For convenience when debugging.  */
-int
-w32_last_error (void)
-{
-  return GetLastError ();
-}
diff --git a/src/w32font.c b/src/w32font.c
index fd24a90..d87747f 100644
--- a/src/w32font.c
+++ b/src/w32font.c
@@ -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>
@@ -1440,6 +1441,9 @@ w32font_coverage_ok (FONTSIGNATURE * coverage, BYTE charset)
   return 1;
 }
 
+#if !WINDOWSNT
+#define _strlwr strlwr
+#endif
 
 static int
 check_face_name (LOGFONT *font, char *full_name)
diff --git a/src/w32inevt.c b/src/w32inevt.c
index 731dd67..c782119 100644
--- a/src/w32inevt.c
+++ b/src/w32inevt.c
@@ -71,6 +71,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)
 {
@@ -532,32 +535,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,
diff --git a/src/w32menu.c b/src/w32menu.c
index 7ea4633..134c66f 100644
--- a/src/w32menu.c
+++ b/src/w32menu.c
@@ -21,7 +21,6 @@ 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"
@@ -41,6 +40,10 @@ 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"
 
+#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
@@ -79,10 +82,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;
 
@@ -99,6 +109,7 @@ static void utf8to16 (unsigned char *, int, WCHAR *);
 static int fill_in_menu (HMENU, widget_value *);
 
 void w32_free_menu_strings (HWND);
+
 \f
 
 /* This is set nonzero after the user activates the menu bar, and set
@@ -1406,6 +1417,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
@@ -1416,6 +1428,7 @@ add_menu_item (HMENU menu, widget_value *wv, HMENU item)
                 nlen++;
             }
         }
+#endif /* !NTGUI_UNICODE */
 
       if (nlen > orig_len)
         {
@@ -1430,6 +1443,7 @@ add_menu_item (HMENU menu, widget_value *wv, HMENU item)
                     *q++ = *p;
                   *q++ = *p++;
                 }
+#ifndef NTGUI_UNICODE
               else
                 {
                   if (_mbsnextc (p) == '&')
@@ -1441,6 +1455,7 @@ add_menu_item (HMENU menu, widget_value *wv, HMENU item)
                   p = _mbsinc (p);
                   q = _mbsinc (q);
                 }
+#endif /* !NTGUI_UNICODE */
             }
           *q = '\0';
         }
@@ -1487,6 +1502,8 @@ add_menu_item (HMENU menu, widget_value *wv, HMENU item)
 					  item != NULL ? (UINT) item
 					    : (UINT) 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
@@ -1505,6 +1522,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);
@@ -1724,10 +1742,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 */
 }
diff --git a/src/w32proc.c b/src/w32proc.c
index 33aed5e..0cc62ae 100644
--- a/src/w32proc.c
+++ b/src/w32proc.c
@@ -68,20 +68,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.  */
diff --git a/src/w32select.c b/src/w32select.c
index 59ff440..6b855b4 100644
--- a/src/w32select.c
+++ b/src/w32select.c
@@ -82,6 +82,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);
diff --git a/src/w32select.h b/src/w32select.h
new file mode 100644
index 0000000..6924d4d
--- /dev/null
+++ b/src/w32select.h
@@ -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
diff --git a/src/w32term.c b/src/w32term.c
index 262bbd4..0eacff2 100644
--- a/src/w32term.c
+++ b/src/w32term.c
@@ -52,7 +52,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"
@@ -103,7 +110,7 @@ struct w32_display_info *x_display_list;
 Lisp_Object w32_display_name_list;
 
 
-#ifndef GLYPHSET
+#if !defined (GLYPHSET) && _WIN32_WINNT < 0x500
 /* Pre Windows 2000, this was not available, but define it here so
    that Emacs compiled on such a platform will run on newer versions.  */
 
@@ -122,7 +129,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);
@@ -191,6 +198,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 *);
@@ -4158,6 +4172,7 @@ w32_read_socket (struct terminal *terminal, int expected,
   struct frame *f;
   struct w32_display_info *dpyinfo = &one_w32_display_info;
   Mouse_HLInfo *hlinfo = &dpyinfo->mouse_highlight;
+  static char buf[1];
 
   if (interrupt_input_blocked)
     {
@@ -4171,12 +4186,19 @@ w32_read_socket (struct terminal *terminal, int expected,
   /* 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;
@@ -6309,8 +6331,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.
 
@@ -6321,15 +6350,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;
@@ -6379,6 +6399,7 @@ x_delete_display (struct w32_display_info *dpyinfo)
 
   w32_reset_fringes ();
 }
+
 \f
 /* Set up use of W32.  */
 
@@ -6416,6 +6437,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,
@@ -6576,4 +6602,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);
 }
diff --git a/src/w32term.h b/src/w32term.h
index 42b5074..5c583a3 100644
--- a/src/w32term.h
+++ b/src/w32term.h
@@ -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"
 
 \f
 #define BLACK_PIX_DEFAULT(f) PALETTERGB(0,0,0)
@@ -195,11 +197,47 @@ 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, char *color,
+                              XColor *color_def, int alloc);
+extern void set_frame_menubar (struct frame *f, int first_time, int deep_p);
+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_wm_set_size_hint (struct frame *, long, int);
+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);
+
 
 \f
 #define PIX_TYPE COLORREF
@@ -576,8 +614,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)
@@ -599,6 +638,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.  */
@@ -702,3 +743,27 @@ 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);
+
+/* Ordinarily, we'd just send SIGIO to ourselves when we have input,
+ * terminating the main thread's normal select call with EINTR.
+ * However, Cygwin has a known bug [1] that causes us to crash when
+ * sending a signal to our main thread from our message pump thread.
+ * The workaround is to use an old-fashioned self-pipe.
+ *
+ * [1] <loom.20100428T060408-563@post.gmane.org>
+ */
+#ifdef CYGWIN
+extern int w32_message_fd;
+#endif /* CYGWIN */
diff --git a/src/w32xfns.c b/src/w32xfns.c
index 745a5cf..7436365 100644
--- a/src/w32xfns.c
+++ b/src/w32xfns.c
@@ -20,6 +20,7 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #include <signal.h>
 #include <stdio.h>
 #include <setjmp.h>
+
 #include "lisp.h"
 #include "keyboard.h"
 #include "frame.h"
@@ -33,7 +34,11 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #define myfree(lp) GlobalFreePtr (lp)
 
 CRITICAL_SECTION critsect;
+
+#if WINDOWSNT
 extern HANDLE keyboard_handle;
+#endif
+
 HANDLE input_available = NULL;
 HANDLE interrupt_handle = NULL;
 
@@ -44,7 +49,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);
+
+#if WINDOWSNT
+  keyboard_handle = input_available;
+#endif
 
   /* interrupt_handle is signaled when quit (C-g) is detected, so that
      blocking system calls can be interrupted.  We make it a manual
@@ -241,6 +250,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)
 {
@@ -264,8 +289,7 @@ post_msg (W32Msg * lpmsg)
     }
 
   lpTail = lpNew;
-  SetEvent (input_available);
-
+  notify_msg_ready ();
   leave_crit ();
 
   return (TRUE);
@@ -286,7 +310,7 @@ prepend_msg (W32Msg *lpmsg)
   nQueue++;
   lpNew->lpNext = lpHead;
   lpHead = lpNew;
-
+  notify_msg_ready ();
   leave_crit ();
 
   return (TRUE);
@@ -438,6 +462,6 @@ XParseGeometry (char *string,
 
 /* x_sync is a no-op on W32.  */
 void
-x_sync (void *f)
+x_sync (struct frame *f)
 {
 }
diff --git a/src/window.c b/src/window.c
index a71fa0b..e743257 100644
--- a/src/window.c
+++ b/src/window.c
@@ -41,7 +41,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
diff --git a/src/xdisp.c b/src/xdisp.c
index d0338db..58eb672 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -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
@@ -29320,7 +29320,7 @@ init_xdisp (void)
 
 /* Since w32 does not support atimers, it defines its own implementation of
    the following three functions in w32fns.c.  */
-#ifndef WINDOWSNT
+#ifndef HAVE_NTGUI
 
 /* Platform-independent portion of hourglass implementation. */
 
@@ -29366,4 +29366,4 @@ cancel_hourglass (void)
     hide_hourglass ();
 #endif
 }
-#endif /* ! WINDOWSNT  */
+#endif /* ! HAVE_NTGUI  */
diff --git a/src/xfaces.c b/src/xfaces.c
index a81bd55..60d6d1d 100644
--- a/src/xfaces.c
+++ b/src/xfaces.c
@@ -228,13 +228,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
@@ -663,7 +663,7 @@ x_free_gc (struct frame *f, GC gc)
 
 #endif /* HAVE_X_WINDOWS */
 
-#ifdef WINDOWSNT
+#ifdef HAVE_NTGUI
 /* W32 emulation of GCs */
 
 static inline GC
@@ -687,7 +687,7 @@ x_free_gc (struct frame *f, GC gc)
   xfree (gc);
 }
 
-#endif  /* WINDOWSNT */
+#endif  /* HAVE_NTGUI */
 
 #ifdef HAVE_NS
 /* NS emulation of GCs */
@@ -757,7 +757,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
@@ -1136,7 +1136,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
@@ -3270,7 +3270,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
@@ -3280,7 +3280,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
@@ -6387,7 +6387,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)),
diff --git a/src/xterm.h b/src/xterm.h
index cd02ff0..06fa4b5 100644
--- a/src/xterm.h
+++ b/src/xterm.h
@@ -970,7 +970,6 @@ extern int x_alloc_lighter_color_for_widget (Widget, Display *, Colormap,
                                              double, int);
 #endif
 extern int x_alloc_nearest_color (struct frame *, Colormap, XColor *);
-extern void x_query_color (struct frame *f, XColor *);
 extern void x_clear_area (Display *, Window, int, int, int, int, int);
 #if defined HAVE_MENUS && !defined USE_X_TOOLKIT && !defined USE_GTK
 extern void x_mouse_leave (struct x_display_info *);
-- 
1.7.2.5





^ permalink raw reply related	[flat|nested] 51+ messages in thread

* [PATCH 8/9] Generalize fork+exec logic, add DAEMON_MUST_EXEC
  2012-08-07  8:19 [PATCH 0/9] Support Win32 GUI in Cygwin Emacs Daniel Colascione
                   ` (7 preceding siblings ...)
  2012-08-07  8:19 ` [PATCH 2/9] Refactor window-system configuration Daniel Colascione
@ 2012-08-07  8:19 ` Daniel Colascione
  2012-08-07 17:22 ` [PATCH 0/9] Support Win32 GUI in Cygwin Emacs Eli Zaretskii
  9 siblings, 0 replies; 51+ messages in thread
From: Daniel Colascione @ 2012-08-07  8:19 UTC (permalink / raw)
  To: emacs-devel

---
 src/emacs.c |   38 ++++++++++++++++++++++++--------------
 1 files changed, 24 insertions(+), 14 deletions(-)

diff --git a/src/emacs.c b/src/emacs.c
index a4fab12..022d46d 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -161,6 +161,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
+
 /* Nonzero means running Emacs without interactive terminal.  */
 int noninteractive;
 
@@ -706,9 +722,9 @@ main (int argc, char **argv)
   int 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
@@ -1010,25 +1026,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;
@@ -1064,7 +1074,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'))
@@ -1100,7 +1110,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);
-- 
1.7.2.5





^ permalink raw reply related	[flat|nested] 51+ messages in thread

* [PATCH 6/9] Rename `w32' local to `nt' for clarity
  2012-08-07  8:19 [PATCH 0/9] Support Win32 GUI in Cygwin Emacs Daniel Colascione
                   ` (3 preceding siblings ...)
  2012-08-07  8:19 ` [PATCH 1/9] Under Remote Desktop, NUMCOLORS is unreliable; workaround Daniel Colascione
@ 2012-08-07  8:19 ` Daniel Colascione
  2012-08-07 10:49   ` Lennart Borgman
  2012-08-07 15:45   ` Stefan Monnier
  2012-08-07  8:19 ` [PATCH 5/9] Prevent crash if w32 used before it's initialized Daniel Colascione
                   ` (4 subsequent siblings)
  9 siblings, 2 replies; 51+ messages in thread
From: Daniel Colascione @ 2012-08-07  8:19 UTC (permalink / raw)
  To: emacs-devel

---
 lisp/server.el |    8 ++++----
 1 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/lisp/server.el b/lisp/server.el
index 0ef76dc..656be75 100644
--- a/lisp/server.el
+++ b/lisp/server.el
@@ -519,10 +519,10 @@ Creates the directory if necessary and makes sure:
 
     ;; Check that it's safe for use.
     (let* ((uid (nth 2 attrs))
-	   (w32 (eq system-type 'windows-nt))
+	   (nt (eq system-type 'windows-nt))
 	   (safe (cond
 		  ((not (eq t (car attrs))) nil)  ; is a dir?
-		  ((and w32 (zerop uid))	  ; on FAT32?
+		  ((and nt (zerop uid))	  ; on FAT32?
 		   (display-warning
 		    'server
 		    (format "Using `%s' to store Emacs-server authentication files.
@@ -532,13 +532,13 @@ See variable `server-auth-dir' for details."
 		    :warning)
 		   t)
 		  ((and (/= uid (user-uid))	  ; is the dir ours?
-			(or (not w32)
+			(or (not nt)
 			    ;; Files created on Windows by Administrator
 			    ;; (RID=500) have the Administrators (RID=544)
 			    ;; group recorded as the owner.
 			    (/= uid 544) (/= (user-uid) 500)))
 		   nil)
-		  (w32 t)			  ; on NTFS?
+		  (nt t)			  ; on NTFS?
 		  (t				  ; else, check permissions
 		   (zerop (logand ?\077 (file-modes dir)))))))
       (unless safe
-- 
1.7.2.5





^ permalink raw reply related	[flat|nested] 51+ messages in thread

* [PATCH 2/9] Refactor window-system configuration
  2012-08-07  8:19 [PATCH 0/9] Support Win32 GUI in Cygwin Emacs Daniel Colascione
                   ` (6 preceding siblings ...)
  2012-08-07  8:19 ` [PATCH 9/9] Detect window-system from display name Daniel Colascione
@ 2012-08-07  8:19 ` Daniel Colascione
  2012-08-07 17:20   ` Eli Zaretskii
  2012-08-07  8:19 ` [PATCH 8/9] Generalize fork+exec logic, add DAEMON_MUST_EXEC Daniel Colascione
  2012-08-07 17:22 ` [PATCH 0/9] Support Win32 GUI in Cygwin Emacs Eli Zaretskii
  9 siblings, 1 reply; 51+ messages in thread
From: Daniel Colascione @ 2012-08-07  8:19 UTC (permalink / raw)
  To: emacs-devel

This change streamlines the window system selection code in
configure.in and moves many common function declarations from
window-specific headers to frame.h.  It introduces a new TERM_HEADER
macro in config.h: we set this macro to the right header to use for
the window system for which we're compiling Emacs and have source
files include it indirectly.  This way, we don't have to teach every
file about every window system.
---
 configure.ac    |   51 ++++++++++++++++++++++++++++++++++++++-------------
 src/Makefile.in |   11 +++++++----
 src/ccl.h       |    2 ++
 src/dispnew.c   |   14 +++-----------
 src/emacs.c     |   12 ++++--------
 src/font.c      |   14 +++-----------
 src/frame.c     |   19 +++++--------------
 src/frame.h     |   30 ++++++++++++++++++++++++++++++
 src/gtkutil.h   |    1 +
 src/image.c     |   30 +++++++++++-------------------
 src/keyboard.c  |   19 +++++--------------
 src/keyboard.h  |    2 +-
 src/menu.c      |   17 +++--------------
 src/nsterm.h    |   27 ++-------------------------
 src/process.c   |    7 ++++---
 src/w32font.h   |    4 ++++
 src/w32term.h   |    2 +-
 src/xfaces.c    |   20 ++++++++------------
 src/xterm.h     |   26 ++++++++------------------
 19 files changed, 140 insertions(+), 168 deletions(-)

diff --git a/configure.ac b/configure.ac
index 81d80a5..9331bec 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1348,10 +1348,14 @@ AC_SYS_LONG_FILE_NAMES
 
 #### Choose a window system.
 
+## We leave window_system equal to none if
+## we end up building without one.  Any new window system should
+## set window_system to an appropriate value and add objects to
+## window-system-specific substs.
+
+window_system=none
 AC_PATH_X
-if test "$no_x" = yes; then
-  window_system=none
-else
+if test "$no_x" != yes; then
   window_system=x11
 fi
 
@@ -1490,7 +1494,6 @@ if test "${HAVE_NS}" = yes; then
   fi
 
   window_system=nextstep
-  with_xft=no
   # set up packaging dirs
   if test "${EN_NS_SELF_CONTAINED}" = yes; then
      ns_self_contained=yes
@@ -1510,7 +1513,6 @@ if test "${HAVE_NS}" = yes; then
      INSTALL_ARCH_INDEP_EXTRA=
   fi
   ns_frag=$srcdir/src/ns.mk
-  NS_OBJ="fontset.o fringe.o image.o"
   NS_OBJC_OBJ="nsterm.o nsfns.o nsmenu.o nsselect.o nsimage.o nsfont.o"
 fi
 CFLAGS="$tmp_CFLAGS"
@@ -1522,18 +1524,29 @@ AC_SUBST(NS_OBJC_OBJ)
 AC_SUBST(LIB_STANDARD)
 AC_SUBST_FILE(ns_frag)
 
+## $window_system is now set to the window system we will
+## ultimately use.
+
+term_header=
+HAVE_X_WINDOWS=no
+HAVE_X11=no
+USE_X_TOOLKIT=none
+
 case "${window_system}" in
   x11 )
     HAVE_X_WINDOWS=yes
     HAVE_X11=yes
+    term_header=xterm.h
     case "${with_x_toolkit}" in
       athena | lucid ) USE_X_TOOLKIT=LUCID ;;
       motif ) USE_X_TOOLKIT=MOTIF ;;
       gtk ) with_gtk=yes
+            term_header=gtkutil.h
 dnl Don't set this for GTK.  A lot of tests below assumes Xt when
 dnl USE_X_TOOLKIT is set.
             USE_X_TOOLKIT=none ;;
       gtk3 ) with_gtk3=yes
+             term_header=gtkutil.h
              USE_X_TOOLKIT=none ;;
       no ) USE_X_TOOLKIT=none ;;
 dnl If user did not say whether to use a toolkit, make this decision later:
@@ -1541,13 +1554,16 @@ dnl use the toolkit if we have gtk, or X11R5 or newer.
       * ) USE_X_TOOLKIT=maybe ;;
     esac
   ;;
-  nextstep | none )
-    HAVE_X_WINDOWS=no
-    HAVE_X11=no
-    USE_X_TOOLKIT=none
+  nextstep )
+    term_header=nsterm.h
   ;;
 esac
 
+if test -n "${term_header}"; then
+    AC_DEFINE_UNQUOTED(TERM_HEADER, "${term_header}",
+        [Define to the header for the built-in window system.])
+fi
+
 if test "$window_system" = none && test "X$with_x" != "Xno"; then
    AC_CHECK_PROG(HAVE_XSERVER, X, true, false)
    if test "$HAVE_XSERVER" = true ||
@@ -1863,6 +1879,7 @@ if test "${with_gtk3}" = "yes"; then
   fi
   AC_DEFINE(HAVE_GTK3, 1, [Define to 1 if using GTK 3 or later.])
   GTK_OBJ=emacsgtkfixed.o
+  term_header=gtkutil.h
 fi
 
 if test "$pkg_check_gtk" != "yes"; then
@@ -1941,6 +1958,8 @@ if test "${HAVE_GTK}" = "yes"; then
                  gtk_widget_get_mapped gtk_adjustment_get_page_size \
                  gtk_orientable_set_orientation \
 		 gtk_window_set_has_resize_grip)
+
+ term_header=gtkutil.h
 fi
 
 dnl D-Bus has been tested under GNU/Linux only.  Must be adapted for
@@ -3927,6 +3946,11 @@ AC_SUBST(ns_appsrc)
 AC_SUBST(GNU_OBJC_CFLAGS)
 AC_SUBST(OTHER_FILES)
 
+if test -n "${term_header}"; then
+    AC_DEFINE_UNQUOTED(TERM_HEADER, "${term_header}",
+        [Define to the header for the built-in window system.])
+fi
+
 AC_DEFINE_UNQUOTED(EMACS_CONFIGURATION,  "${canonical}",
 		   [Define to the canonical Emacs configuration name.])
 AC_DEFINE_UNQUOTED(EMACS_CONFIG_OPTIONS, "${ac_configure_args}",
@@ -3941,7 +3965,7 @@ if test "${HAVE_X_WINDOWS}" = "yes" ; then
   AC_DEFINE(HAVE_X_WINDOWS, 1,
 	    [Define to 1 if you want to use the X window system.])
   XMENU_OBJ=xmenu.o
-  XOBJ="xterm.o xfns.o xselect.o xrdb.o fontset.o xsmfns.o fringe.o image.o xsettings.o xgselect.o"
+  XOBJ="xterm.o xfns.o xselect.o xrdb.o xsmfns.o xsettings.o xgselect.o"
   FONT_OBJ=xfont.o
   if test "$HAVE_XFT" = "yes"; then
     FONT_OBJ="$FONT_OBJ ftfont.o xftfont.o ftxfont.o"
@@ -4231,13 +4255,14 @@ if test "x$GCC" = "xyes" && test "x$ORDINARY_LINK" != "xyes"; then
 fi                              dnl if $GCC
 AC_SUBST(LIB_GCC)
 
-
-## If we're using X11/GNUstep, define some consequences.
-if test "$HAVE_X_WINDOWS" = "yes" || test "$HAVE_NS" = "yes"; then
+## Common for all window systems
+if test "$window_system" != "none"; then
   AC_DEFINE(HAVE_WINDOW_SYSTEM, 1, [Define if you have a window system.])
   AC_DEFINE(HAVE_MOUSE, 1, [Define if you have mouse support.])
+  WINDOW_SYSTEM_OBJ="fontset.o fringe.o image.o"
 fi
 
+AC_SUBST(WINDOW_SYSTEM_OBJ)
 
 AH_TOP([/* GNU Emacs site configuration template file.
 
diff --git a/src/Makefile.in b/src/Makefile.in
index 687b3ce..38ce194 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -209,8 +209,8 @@ LIBXMENU=@LIBXMENU@
 
 ## xmenu.o if HAVE_X_WINDOWS, else empty.
 XMENU_OBJ=@XMENU_OBJ@
-## xterm.o xfns.o xselect.o xrdb.o fontset.o xsmfns.o fringe.o image.o
-## xsettings.o xgselect.o if HAVE_X_WINDOWS, else empty.
+## xterm.o xfns.o xselect.o xrdb.o xsmfns.o xsettings.o xgselect.o if
+## HAVE_X_WINDOWS, else empty.
 XOBJ=@XOBJ@
 
 TOOLKIT_LIBW=@TOOLKIT_LIBW@
@@ -245,6 +245,9 @@ WIDGET_OBJ=@WIDGET_OBJ@
 ## sheap.o if CYGWIN, otherwise empty.
 CYGWIN_OBJ=@CYGWIN_OBJ@
 
+## fontset.o fringe.o image.o if we have any window system
+WINDOW_SYSTEM_OBJ=@WINDOW_SYSTEM_OBJ@
+
 ## dosfns.o msdos.o w16select.o if MSDOS.
 MSDOS_OBJ =
 ## w16select.o termcap.o if MSDOS && HAVE_X_WINDOWS.
@@ -253,7 +256,6 @@ MSDOS_X_OBJ =
 ns_appdir=@ns_appdir@
 ns_appbindir=@ns_appbindir@
 ns_appsrc=@ns_appsrc@
-## fontset.o fringe.o image.o if HAVE_NS, else empty.
 NS_OBJ=@NS_OBJ@
 ## nsterm.o nsfns.o nsmenu.o nsselect.o nsimage.o nsfont.o if HAVE_NS.
 NS_OBJC_OBJ=@NS_OBJC_OBJ@
@@ -338,7 +340,8 @@ base_obj = dispnew.o frame.o scroll.o xdisp.o menu.o $(XMENU_OBJ) window.o \
 	process.o gnutls.o callproc.o \
 	region-cache.o sound.o atimer.o \
 	doprnt.o intervals.o textprop.o composite.o xml.o \
-	$(MSDOS_OBJ) $(MSDOS_X_OBJ) $(NS_OBJ) $(CYGWIN_OBJ) $(FONT_OBJ)
+	$(MSDOS_OBJ) $(MSDOS_X_OBJ) $(NS_OBJ) $(CYGWIN_OBJ) $(FONT_OBJ) \
+	$(WINDOW_SYSTEM_OBJ)
 obj = $(base_obj) $(NS_OBJC_OBJ)
 
 ## Object files used on some machine or other.
diff --git a/src/ccl.h b/src/ccl.h
index 7113917..cc5daf1 100644
--- a/src/ccl.h
+++ b/src/ccl.h
@@ -26,6 +26,8 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #ifndef EMACS_CCL_H
 #define EMACS_CCL_H
 
+#include "character.h" /* For MAX_MULTIBYTE_LENGTH */
+
 /* Macros for exit status of CCL program.  */
 #define CCL_STAT_SUCCESS	0 /* Terminated successfully.  */
 #define CCL_STAT_SUSPEND_BY_SRC	1 /* Terminated by empty input.  */
diff --git a/src/dispnew.c b/src/dispnew.c
index d06ab59..64926d9 100644
--- a/src/dispnew.c
+++ b/src/dispnew.c
@@ -48,17 +48,9 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "syssignal.h"
 
-#ifdef HAVE_X_WINDOWS
-#include "xterm.h"
-#endif /* HAVE_X_WINDOWS */
-
-#ifdef HAVE_NTGUI
-#include "w32term.h"
-#endif /* HAVE_NTGUI */
-
-#ifdef HAVE_NS
-#include "nsterm.h"
-#endif
+#ifdef HAVE_WINDOW_SYSTEM
+#include TERM_HEADER
+#endif /* HAVE_WINDOW_SYSTEM */
 
 /* Include systime.h after xterm.h to avoid double inclusion of time.h.  */
 
diff --git a/src/emacs.c b/src/emacs.c
index 8d458c6..c86f4b2 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -31,6 +31,10 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "lisp.h"
 
+#ifdef HAVE_WINDOW_SYSTEM
+#include TERM_HEADER
+#endif /* HAVE_WINDOW_SYSTEM */
+
 #ifdef WINDOWSNT
 #include <fcntl.h>
 #include <windows.h> /* just for w32.h */
@@ -62,20 +66,12 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #include "gnutls.h"
 #endif
 
-#ifdef HAVE_NS
-#include "nsterm.h"
-#endif
-
 #if (defined PROFILING \
      && (defined __FreeBSD__ || defined GNU_LINUX || defined __MINGW32__))
 # include <sys/gmon.h>
 extern void moncontrol (int mode);
 #endif
 
-#ifdef HAVE_X_WINDOWS
-#include "xterm.h"
-#endif
-
 #ifdef HAVE_SETLOCALE
 #include <locale.h>
 #endif
diff --git a/src/font.c b/src/font.c
index db1d12d..f0ccbb3 100644
--- a/src/font.c
+++ b/src/font.c
@@ -37,17 +37,9 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #include "fontset.h"
 #include "font.h"
 
-#ifdef HAVE_X_WINDOWS
-#include "xterm.h"
-#endif /* HAVE_X_WINDOWS */
-
-#ifdef HAVE_NTGUI
-#include "w32term.h"
-#endif /* HAVE_NTGUI */
-
-#ifdef HAVE_NS
-#include "nsterm.h"
-#endif /* HAVE_NS */
+#ifdef HAVE_WINDOW_SYSTEM
+#include TERM_HEADER
+#endif /* HAVE_WINDOW_SYSTEM */
 
 Lisp_Object Qopentype;
 
diff --git a/src/frame.c b/src/frame.c
index cb94143..651d27e 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -26,15 +26,11 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #include <setjmp.h>
 #include "lisp.h"
 #include "character.h"
-#ifdef HAVE_X_WINDOWS
-#include "xterm.h"
-#endif
-#ifdef WINDOWSNT
-#include "w32term.h"
-#endif
-#ifdef HAVE_NS
-#include "nsterm.h"
-#endif
+
+#ifdef HAVE_WINDOW_SYSTEM
+#include TERM_HEADER
+#endif /* HAVE_WINDOW_SYSTEM */
+
 #include "buffer.h"
 /* These help us bind and responding to switch-frame events.  */
 #include "commands.h"
@@ -54,11 +50,6 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #include "dosfns.h"
 #endif
 
-
-#ifdef HAVE_WINDOW_SYSTEM
-
-#endif
-
 #ifdef HAVE_NS
 Lisp_Object Qns_parse_geometry;
 #endif
diff --git a/src/frame.h b/src/frame.h
index 7c4ccc1..629f050 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -1143,10 +1143,40 @@ extern Lisp_Object display_x_get_resource (Display_Info *,
 					   Lisp_Object component,
 					   Lisp_Object subclass);
 
+extern void set_frame_menubar (struct frame *f, int first_time, int deep_p);
+extern void x_set_window_size (struct frame *f, int change_grav,
+                              int cols, int rows);
+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 void x_real_positions (struct frame *, int *, int *);
+extern int x_bitmap_icon (struct frame *, Lisp_Object);
+extern void x_set_menu_bar_lines (struct frame *,
+                                  Lisp_Object,
+                                  Lisp_Object);
+extern void free_frame_menubar (struct frame *);
+extern void x_free_frame_resources (struct frame *);
+
 #if defined HAVE_X_WINDOWS && !defined USE_X_TOOLKIT
 extern char *x_get_resource_string (const char *, const char *);
 #endif
 
+extern void x_query_colors (struct frame *f, XColor *, int);
+
 /* In xmenu.c */
 extern void set_frame_menubar (FRAME_PTR, int, int);
 
diff --git a/src/gtkutil.h b/src/gtkutil.h
index 94c1a1d..c3946fc 100644
--- a/src/gtkutil.h
+++ b/src/gtkutil.h
@@ -25,6 +25,7 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include <gtk/gtk.h>
 #include "frame.h"
+#include "xterm.h"
 
 /* Minimum and maximum values used for GTK scroll bars  */
 
diff --git a/src/image.c b/src/image.c
index 8a318c2..34faa87 100644
--- a/src/image.c
+++ b/src/image.c
@@ -49,11 +49,19 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #include "termhooks.h"
 #include "font.h"
 
-#ifdef HAVE_X_WINDOWS
-#include "xterm.h"
-#include <sys/types.h>
+#ifdef HAVE_SYS_STAT_H
 #include <sys/stat.h>
+#endif /* HAVE_SYS_STAT_H */
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif /* HAVE_SYS_TYPES_H */
+
+#ifdef HAVE_WINDOW_SYSTEM
+#include TERM_HEADER
+#endif /* HAVE_WINDOW_SYSTEM */
 
+#ifdef HAVE_X_WINDOWS
 #define COLOR_TABLE_SUPPORT 1
 
 typedef struct x_bitmap_record Bitmap_Record;
@@ -66,11 +74,7 @@ typedef struct x_bitmap_record Bitmap_Record;
 #define PIX_MASK_DRAW	1
 #endif /* HAVE_X_WINDOWS */
 
-
 #ifdef HAVE_NTGUI
-#include "w32.h"
-#include "w32term.h"
-
 /* W32_TODO : Color tables on W32.  */
 #undef COLOR_TABLE_SUPPORT
 
@@ -83,15 +87,9 @@ typedef struct w32_bitmap_record Bitmap_Record;
 #define PIX_MASK_RETAIN	0
 #define PIX_MASK_DRAW	1
 
-#define FRAME_X_VISUAL(f) FRAME_X_DISPLAY_INFO (f)->visual
 #define x_defined_color w32_defined_color
 #define DefaultDepthOfScreen(screen) (one_w32_display_info.n_cbits)
 
-/* Functions from w32term.c that depend on XColor (so can't go in w32term.h
-   without modifying lots of files).  */
-extern void x_query_colors (struct frame *f, XColor *colors, int ncolors);
-extern void x_query_color (struct frame *f, XColor *color);
-
 /* Version of libpng that we were compiled with, or -1 if no PNG
    support was compiled in.  This is tested by w32-win.el to correctly
    set up the alist used to search for PNG libraries.  */
@@ -99,10 +97,6 @@ Lisp_Object Qlibpng_version;
 #endif /* HAVE_NTGUI */
 
 #ifdef HAVE_NS
-#include "nsterm.h"
-#include <sys/types.h>
-#include <sys/stat.h>
-
 #undef COLOR_TABLE_SUPPORT
 
 typedef struct ns_bitmap_record Bitmap_Record;
@@ -116,10 +110,8 @@ typedef struct ns_bitmap_record Bitmap_Record;
 #define PIX_MASK_RETAIN	0
 #define PIX_MASK_DRAW	1
 
-#define FRAME_X_VISUAL FRAME_NS_DISPLAY_INFO (f)->visual
 #define x_defined_color(f, name, color_def, alloc) \
   ns_defined_color (f, name, color_def, alloc, 0)
-#define FRAME_X_SCREEN(f) 0
 #define DefaultDepthOfScreen(screen) x_display_list->n_planes
 #endif /* HAVE_NS */
 
diff --git a/src/keyboard.c b/src/keyboard.c
index 49ea168..7cc6069 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -60,20 +60,11 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #include <unistd.h>
 #include <fcntl.h>
 
-/* This is to get the definitions of the XK_ symbols.  */
-#ifdef HAVE_X_WINDOWS
-#include "xterm.h"
-#endif
-
-#ifdef HAVE_NTGUI
-#include "w32term.h"
-#endif /* HAVE_NTGUI */
-
-#ifdef HAVE_NS
-#include "nsterm.h"
-#endif
+#ifdef HAVE_WINDOW_SYSTEM
+#include TERM_HEADER
+#endif /* HAVE_WINDOW_SYSTEM */
 
-/* Variables for blockinput.h:  */
+/* Variables for blockinput.h: */
 
 /* Non-zero if interrupt input is blocked right now.  */
 volatile int interrupt_input_blocked;
@@ -1272,7 +1263,7 @@ usage: (track-mouse BODY...)  */)
    If ignore_mouse_drag_p is non-zero, ignore (implicit) mouse movement
    after resizing the tool-bar window.  */
 
-#if !defined HAVE_WINDOW_SYSTEM || defined USE_GTK || defined HAVE_NS
+#if !defined HAVE_WINDOW_SYSTEM
 static
 #endif
 int ignore_mouse_drag_p;
diff --git a/src/keyboard.h b/src/keyboard.h
index 4006c67..bfdcd0d 100644
--- a/src/keyboard.h
+++ b/src/keyboard.h
@@ -423,7 +423,7 @@ extern int waiting_for_input;
    happens.  */
 extern EMACS_TIME *input_available_clear_time;
 
-#if defined HAVE_WINDOW_SYSTEM && !defined USE_GTK && !defined HAVE_NS
+#if defined HAVE_WINDOW_SYSTEM
 extern int ignore_mouse_drag_p;
 #endif
 
diff --git a/src/menu.c b/src/menu.c
index 3e466b4..2077053 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -36,24 +36,13 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #include "../lwlib/lwlib.h"
 #endif
 
-#ifdef HAVE_X_WINDOWS
-#include "xterm.h"
-#endif
-
-#ifdef HAVE_NS
-#include "nsterm.h"
-#endif
-
-#ifdef USE_GTK
-#include "gtkutil.h"
-#endif
+#ifdef HAVE_WINDOW_SYSTEM
+#include TERM_HEADER
+#endif /* HAVE_WINDOW_SYSTEM */
 
 #ifdef HAVE_NTGUI
-#include "w32term.h"
-
 extern AppendMenuW_Proc unicode_append_menu;
 extern HMENU current_popup_menu;
-
 #endif /* HAVE_NTGUI  */
 
 #include "menu.h"
diff --git a/src/nsterm.h b/src/nsterm.h
index b20621a..100c2d3 100644
--- a/src/nsterm.h
+++ b/src/nsterm.h
@@ -623,6 +623,8 @@ struct x_output
 /* This is the `Display *' which frame F is on.  */
 #define FRAME_NS_DISPLAY(f) (0)
 #define FRAME_X_DISPLAY(f) (0)
+#define FRAME_X_SCREEN(f) (0)
+#define FRAME_X_VISUAL(f) FRAME_NS_DISPLAY_INFO(f)->visual
 
 #define FRAME_FOREGROUND_COLOR(f) ((f)->output_data.ns->foreground_color)
 #define FRAME_BACKGROUND_COLOR(f) ((f)->output_data.ns->background_color)
@@ -773,31 +775,6 @@ extern Lisp_Object find_and_return_menu_selection (FRAME_PTR f,
 extern Lisp_Object ns_popup_dialog (Lisp_Object position, Lisp_Object contents,
                                     Lisp_Object header);
 
-/* More prototypes that should be moved to a more general include file */
-extern void set_frame_menubar (struct frame *f, int first_time, int deep_p);
-extern void x_set_window_size (struct frame *f, int change_grav,
-                              int cols, int rows);
-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 void free_frame_menubar (struct frame *);
-extern void x_free_frame_resources (struct frame *);
-extern void x_destroy_window (struct frame *);
-
 #define NSAPP_DATA2_RUNASSCRIPT 10
 extern void ns_run_ascript (void);
 
diff --git a/src/process.c b/src/process.c
index fbc0349..f7f0d10 100644
--- a/src/process.c
+++ b/src/process.c
@@ -113,12 +113,13 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #include "gnutls.h"
 #endif
 
+#ifdef HAVE_WINDOW_SYSTEM
+#include TERM_HEADER
+#endif /* HAVE_WINDOW_SYSTEM */
+
 #if defined (USE_GTK) || defined (HAVE_GCONF) || defined (HAVE_GSETTINGS)
 #include "xgselect.h"
 #endif
-#ifdef HAVE_NS
-#include "nsterm.h"
-#endif
 
 /* Work around GCC 4.7.0 bug with strict overflow checking; see
    <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52904>.
diff --git a/src/w32font.h b/src/w32font.h
index b08d48a..a29ddbe 100644
--- a/src/w32font.h
+++ b/src/w32font.h
@@ -19,6 +19,7 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #ifndef EMACS_W32FONT_H
 #define EMACS_W32FONT_H
 
+#include "font.h"
 
 /* Bit 17 of ntmFlags in NEWTEXTMETRIC is set for PostScript OpenType fonts,
    bit 18 for TrueType OpenType fonts, bit 20 for Type1 fonts.  */
@@ -83,4 +84,7 @@ int uniscribe_check_otf (LOGFONT *font, Lisp_Object otf_spec);
 
 Lisp_Object intern_font_name (char *);
 
+extern void syms_of_w32font (void);
+extern void globals_of_w32font (void);
+
 #endif
diff --git a/src/w32term.h b/src/w32term.h
index ccbf3c4..42b5074 100644
--- a/src/w32term.h
+++ b/src/w32term.h
@@ -345,7 +345,7 @@ extern struct w32_output w32term_display;
 
 /* Return the window associated with the frame F.  */
 #define FRAME_W32_WINDOW(f) ((f)->output_data.w32->window_desc)
-#define FRAME_X_WINDOW(f) ((f)->output_data.w32->window_desc)
+#define FRAME_X_WINDOW(f) FRAME_W32_WINDOW (f)
 
 #define FRAME_FONT(f) ((f)->output_data.w32->font)
 #define FRAME_FONTSET(f) ((f)->output_data.w32->fontset)
diff --git a/src/xfaces.c b/src/xfaces.c
index ff9df49..a81bd55 100644
--- a/src/xfaces.c
+++ b/src/xfaces.c
@@ -225,11 +225,10 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #include "dosfns.h"
 #endif
 
-#ifdef WINDOWSNT
-#include "w32term.h"
+#ifdef HAVE_WINDOW_SYSTEM
+#include TERM_HEADER
 #include "fontset.h"
-/* Redefine X specifics to W32 equivalents to avoid cluttering the
-   code with #ifdef blocks. */
+#ifdef WINDOWSNT
 #undef FRAME_X_DISPLAY_INFO
 #define FRAME_X_DISPLAY_INFO FRAME_W32_DISPLAY_INFO
 #define x_display_info w32_display_info
@@ -238,13 +237,13 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #endif /* WINDOWSNT */
 
 #ifdef HAVE_NS
-#include "nsterm.h"
 #undef FRAME_X_DISPLAY_INFO
 #define FRAME_X_DISPLAY_INFO FRAME_NS_DISPLAY_INFO
 #define x_display_info ns_display_info
 #define check_x check_ns
 #define GCGraphicsExposures 0
 #endif /* HAVE_NS */
+#endif /* HAVE_WINDOW_SYSTEM */
 
 #include "buffer.h"
 #include "dispextern.h"
@@ -254,9 +253,6 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #include "termchar.h"
 
 #include "font.h"
-#ifdef HAVE_WINDOW_SYSTEM
-#include "fontset.h"
-#endif /* HAVE_WINDOW_SYSTEM */
 
 #ifdef HAVE_X_WINDOWS
 
@@ -2557,13 +2553,13 @@ merge_face_ref (struct frame *f, Lisp_Object face_ref, Lisp_Object *to,
 		}
 	      else if (EQ (keyword, QCstipple))
 		{
-#if defined (HAVE_X_WINDOWS) || defined (HAVE_NS)
+#if defined (HAVE_WINDOW_SYSTEM)
 		  Lisp_Object pixmap_p = Fbitmap_spec_p (value);
 		  if (!NILP (pixmap_p))
 		    to[LFACE_STIPPLE_INDEX] = value;
 		  else
 		    err = 1;
-#endif
+#endif /* HAVE_WINDOW_SYSTEM */
 		}
 	      else if (EQ (keyword, QCwidth))
 		{
@@ -3112,14 +3108,14 @@ FRAME 0 means change the face on all frames, and change the default
     }
   else if (EQ (attr, QCstipple))
     {
-#if defined (HAVE_X_WINDOWS) || defined (HAVE_NS)
+#if defined (HAVE_WINDOW_SYSTEM)
       if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value)
 	  && !NILP (value)
 	  && NILP (Fbitmap_spec_p (value)))
 	signal_error ("Invalid stipple attribute", value);
       old_value = LFACE_STIPPLE (lface);
       ASET (lface, LFACE_STIPPLE_INDEX, value);
-#endif /* HAVE_X_WINDOWS || HAVE_NS */
+#endif /* HAVE_WINDOW_SYSTEM */
     }
   else if (EQ (attr, QCwidth))
     {
diff --git a/src/xterm.h b/src/xterm.h
index 86a76fd..cd02ff0 100644
--- a/src/xterm.h
+++ b/src/xterm.h
@@ -16,6 +16,9 @@ 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 XTERM_H
+#define XTERM_H
+
 #include <X11/Xlib.h>
 #include <X11/cursorfont.h>
 
@@ -367,13 +370,14 @@ extern int use_xim;
 extern void check_x (void);
 
 extern struct frame *x_window_to_frame (struct x_display_info *, int);
-
 extern struct frame *x_any_window_to_frame (struct x_display_info *, int);
 extern struct frame *x_menubar_window_to_frame (struct x_display_info *,
 						XEvent *);
-
 extern struct frame *x_top_window_to_frame (struct x_display_info *, int);
 
+extern struct frame *x_menubar_window_to_frame (struct x_display_info *,
+						XEvent *);
+
 #if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK)
 #define x_any_window_to_frame x_window_to_frame
 #define x_top_window_to_frame x_window_to_frame
@@ -389,7 +393,6 @@ extern struct x_display_info *x_display_list;
 extern Lisp_Object x_display_name_list;
 
 extern struct x_display_info *x_display_info_for_display (Display *);
-extern void x_set_frame_alpha (struct frame *);
 
 extern struct x_display_info *x_term_init (Lisp_Object, char *, char *);
 extern int x_display_ok  (const char *);
@@ -944,7 +947,6 @@ XrmDatabase x_load_resources (Display *, const char *, const char *,
 /* Defined in xterm.c */
 
 extern int x_text_icon (struct frame *, const char *);
-extern int x_bitmap_icon (struct frame *, Lisp_Object);
 extern void x_catch_errors (Display *);
 extern void x_check_errors (Display *, const char *)
   ATTRIBUTE_FORMAT_PRINTF (2, 0);
@@ -956,11 +958,6 @@ extern void x_set_mouse_position (struct frame *, int, int);
 extern void x_set_mouse_pixel_position (struct frame *, int, int);
 extern void xembed_request_focus (struct frame *);
 extern void x_ewmh_activate_frame (struct frame *);
-extern void x_make_frame_visible (struct frame *);
-extern void x_make_frame_invisible (struct frame *);
-extern void x_iconify_frame (struct frame *);
-extern void x_free_frame_resources (struct frame *);
-extern void x_wm_set_size_hint (struct frame *, long, int);
 extern void x_delete_terminal (struct terminal *terminal);
 extern unsigned long x_copy_color (struct frame *, unsigned long);
 #ifdef USE_X_TOOLKIT
@@ -973,7 +970,6 @@ extern int x_alloc_lighter_color_for_widget (Widget, Display *, Colormap,
                                              double, int);
 #endif
 extern int x_alloc_nearest_color (struct frame *, Colormap, XColor *);
-extern void x_query_colors (struct frame *f, XColor *, int);
 extern void x_query_color (struct frame *f, XColor *);
 extern void x_clear_area (Display *, Window, int, int, int, int, int);
 #if defined HAVE_MENUS && !defined USE_X_TOOLKIT && !defined USE_GTK
@@ -1032,8 +1028,6 @@ extern int xg_set_icon (struct frame *, Lisp_Object);
 extern int xg_set_icon_from_xpm_data (struct frame *, const char**);
 #endif /* USE_GTK */
 
-extern void x_real_positions (struct frame *, int *, int *);
-extern void x_set_menu_bar_lines (struct frame *, Lisp_Object, Lisp_Object);
 extern void x_implicitly_set_name (struct frame *, Lisp_Object, Lisp_Object);
 extern void xic_free_xfontset (struct frame *);
 extern void create_frame_xic (struct frame *);
@@ -1043,9 +1037,6 @@ extern void xic_set_statusarea (struct frame *);
 extern void xic_set_xfontset (struct frame *, const char *);
 extern int x_pixel_width (struct frame *);
 extern int x_pixel_height (struct frame *);
-extern int x_char_width (struct frame *);
-extern int x_char_height (struct frame *);
-extern void x_sync (struct frame *);
 extern int x_defined_color (struct frame *, const char *, XColor *, int);
 #ifdef HAVE_X_I18N
 extern void free_frame_xic (struct frame *);
@@ -1053,7 +1044,6 @@ extern void free_frame_xic (struct frame *);
 extern char * xic_create_fontsetname (const char *base_fontname, int motif);
 # endif
 #endif
-extern void x_set_tool_bar_lines (struct frame *, Lisp_Object, Lisp_Object);
 
 /* Defined in xfaces.c */
 
@@ -1070,10 +1060,8 @@ extern void x_menu_set_in_use (int);
 #ifdef USE_MOTIF
 extern void x_menu_wait_for_event (void *data);
 #endif
-extern void x_activate_menubar (struct frame *);
 extern int popup_activated (void);
 extern void initialize_frame_menubar (struct frame *);
-extern void free_frame_menubar (struct frame *);
 
 /* Defined in widget.c */
 
@@ -1115,3 +1103,5 @@ extern Lisp_Object Qx_gtk_map_stock;
    (nr).y = (ry),					\
    (nr).width = (rwidth),				\
    (nr).height = (rheight))
+
+#endif /* XTERM_H */
-- 
1.7.2.5





^ permalink raw reply related	[flat|nested] 51+ messages in thread

* Re: [PATCH 6/9] Rename `w32' local to `nt' for clarity
  2012-08-07  8:19 ` [PATCH 6/9] Rename `w32' local to `nt' for clarity Daniel Colascione
@ 2012-08-07 10:49   ` Lennart Borgman
  2012-08-07 15:45   ` Stefan Monnier
  1 sibling, 0 replies; 51+ messages in thread
From: Lennart Borgman @ 2012-08-07 10:49 UTC (permalink / raw)
  To: Daniel Colascione; +Cc: emacs-devel

Maybe "w32nt" is better than just "nt"? It is much easier to search for.



^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 7/9] Add alt_display to emacsclient for w32, ns
  2012-08-07  8:19 ` [PATCH 7/9] Add alt_display to emacsclient for w32, ns Daniel Colascione
@ 2012-08-07 15:22   ` Stefan Monnier
  0 siblings, 0 replies; 51+ messages in thread
From: Stefan Monnier @ 2012-08-07 15:22 UTC (permalink / raw)
  To: Daniel Colascione; +Cc: emacs-devel

> +      alt_display = "windows";

Please use "w32" as the magical name since that's what we use elsewhere.

> -	  if (strprefix ("-emacs-pid ", p))

Try to get rid of these extra "convert TAB to SPC" changes which make
the patch harder to read.


        Stefan



^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 3/9] Implement cygw32
  2012-08-07  8:19 ` [PATCH 3/9] Implement cygw32 Daniel Colascione
@ 2012-08-07 15:40   ` Stefan Monnier
  2012-08-07 18:02   ` Eli Zaretskii
  1 sibling, 0 replies; 51+ messages in thread
From: Stefan Monnier @ 2012-08-07 15:40 UTC (permalink / raw)
  To: Daniel Colascione; +Cc: emacs-devel

> +    AC_MSG_ERROR([Using win32 with an autotools build is only supported for Cygwin.])

Try to stick to "w32" and especially avoid "win32" since we don't like
to make it sound like this is a win.

BTW, the next step is probably to support a w32 GUI under GNU+Wine ;-)

> --- a/lisp/international/mule-cmds.el
> +++ b/lisp/international/mule-cmds.el
> @@ -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))

Does w32-ansi-code-page ever make sense under Cygwin?
If it can be useful for Cygwin, is it only useful in combination with
the w32 GUI, or can it also be useful for Cygwin+X11?

Wouldn't it be more correct to change w32fns.c so it does not define
w32-ansi-code-page when built for Cygwin?  Or on the contrary to move
the definition of w32-ansi-code-page so it always gets defined under
Windows, whether we build for Cygwin or not?

> +(unless (eq system-type 'cygwin)
> +  (defcustom w32-allow-system-shell nil
> +    "Disable startup warning when using \"system\" shells."
> +    :type 'boolean
> +    :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))

You can use a single `unless' around the two defcustoms.

Hopefully someone else can review the core of your code.  I'm familiar
with none of those Windows thingies.  I do like the feature, tho,


        Stefan



^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 6/9] Rename `w32' local to `nt' for clarity
  2012-08-07  8:19 ` [PATCH 6/9] Rename `w32' local to `nt' for clarity Daniel Colascione
  2012-08-07 10:49   ` Lennart Borgman
@ 2012-08-07 15:45   ` Stefan Monnier
  2012-08-07 16:31     ` Eli Zaretskii
  1 sibling, 1 reply; 51+ messages in thread
From: Stefan Monnier @ 2012-08-07 15:45 UTC (permalink / raw)
  To: Daniel Colascione; +Cc: emacs-devel

> -	   (w32 (eq system-type 'windows-nt))
> +	   (nt (eq system-type 'windows-nt))

I do see that we now have a problem where w32 can refer either to "using
the w32 API for things like process and file system operations" and
"using the w32 GUI".  But "nt" doesn't sound too good for the first.
Maybe "w32os"?


        Stefan



^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 9/9] Detect window-system from display name
  2012-08-07  8:19 ` [PATCH 9/9] Detect window-system from display name Daniel Colascione
@ 2012-08-07 15:50   ` Stefan Monnier
  2012-08-07 17:09     ` Daniel Colascione
  2012-08-07 18:18   ` Eli Zaretskii
  2012-08-08 16:50   ` Eli Zaretskii
  2 siblings, 1 reply; 51+ messages in thread
From: Stefan Monnier @ 2012-08-07 15:50 UTC (permalink / raw)
  To: Daniel Colascione; +Cc: emacs-devel

> +(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.")
[...]
> +(add-to-list 'display-format-alist '("\\`ns\\'" . ns))
[...]
> +(add-to-list 'display-format-alist '("\\`windows\\'" . w32))
[...]
> +(add-to-list 'display-format-alist '("\\`[^:]*:[0-9]+\\(\\.[0-9]+\\)?\\'" . x))

Better just put all three entries directly in the defvar.


        Stefan



^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 6/9] Rename `w32' local to `nt' for clarity
  2012-08-07 15:45   ` Stefan Monnier
@ 2012-08-07 16:31     ` Eli Zaretskii
  2012-08-07 16:40       ` Drew Adams
  2012-08-07 20:00       ` Stefan Monnier
  0 siblings, 2 replies; 51+ messages in thread
From: Eli Zaretskii @ 2012-08-07 16:31 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: dancol, emacs-devel

> From: Stefan Monnier <monnier@IRO.UMontreal.CA>
> Date: Tue, 07 Aug 2012 11:45:08 -0400
> Cc: emacs-devel@gnu.org
> 
> > -	   (w32 (eq system-type 'windows-nt))
> > +	   (nt (eq system-type 'windows-nt))
> 
> I do see that we now have a problem where w32 can refer either to "using
> the w32 API for things like process and file system operations" and
> "using the w32 GUI".

It's just a local variable, so I really don't see the problem with it.

> But "nt" doesn't sound too good for the first.
> Maybe "w32os"?

How about "windows" or "ms-windows"?  w32os is misleading, or will be,
once Emacs could be built as a 64-bit process.



^ permalink raw reply	[flat|nested] 51+ messages in thread

* RE: [PATCH 6/9] Rename `w32' local to `nt' for clarity
  2012-08-07 16:31     ` Eli Zaretskii
@ 2012-08-07 16:40       ` Drew Adams
  2012-08-07 17:07         ` Daniel Colascione
  2012-08-07 20:00       ` Stefan Monnier
  1 sibling, 1 reply; 51+ messages in thread
From: Drew Adams @ 2012-08-07 16:40 UTC (permalink / raw)
  To: 'Eli Zaretskii', 'Stefan Monnier'; +Cc: dancol, emacs-devel

> How about "windows" or "ms-windows"?  w32os is misleading, or will be,
> once Emacs could be built as a 64-bit process.

FWIW, I vote against just "windows" because of possible confusion with other
meanings of "window".  Yes, I understand that the context probably dispels
confusion here.  Still, it's a good idea to avoid it consistently (and to
facilitate searching etc.).

"ms-windows" is pretty clear.  But if you also sometimes need something shorter
and not 32/64-specific as a replacement for "w32", try "msw" or some such.
Whatever you choose, please use it consistently throughout Emacs.




^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 6/9] Rename `w32' local to `nt' for clarity
  2012-08-07 16:40       ` Drew Adams
@ 2012-08-07 17:07         ` Daniel Colascione
  0 siblings, 0 replies; 51+ messages in thread
From: Daniel Colascione @ 2012-08-07 17:07 UTC (permalink / raw)
  To: Drew Adams; +Cc: 'Eli Zaretskii', 'Stefan Monnier', emacs-devel

[-- Attachment #1: Type: text/plain, Size: 828 bytes --]

On 8/7/12 9:40 AM, Drew Adams wrote:
>> How about "windows" or "ms-windows"?  w32os is misleading, or will be,
>> once Emacs could be built as a 64-bit process.
> 
> FWIW, I vote against just "windows" because of possible confusion with other
> meanings of "window".  Yes, I understand that the context probably dispels
> confusion here.  Still, it's a good idea to avoid it consistently (and to
> facilitate searching etc.).
> 
> "ms-windows" is pretty clear.  But if you also sometimes need something shorter
> and not 32/64-specific as a replacement for "w32", try "msw" or some such.
> Whatever you choose, please use it consistently throughout Emacs.

We use WINDOWSNT in the C source, we might as well use 'windowsnt on
the Lisp side. I'd thought 'nt would be a decent-enough shorthand for
'windowsnt.



[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 235 bytes --]

^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 1/9] Under Remote Desktop, NUMCOLORS is unreliable; workaround
  2012-08-07  8:19 ` [PATCH 1/9] Under Remote Desktop, NUMCOLORS is unreliable; workaround Daniel Colascione
@ 2012-08-07 17:07   ` Eli Zaretskii
  0 siblings, 0 replies; 51+ messages in thread
From: Eli Zaretskii @ 2012-08-07 17:07 UTC (permalink / raw)
  To: Daniel Colascione; +Cc: emacs-devel

> Date: Tue, 07 Aug 2012 01:19:27 -0700
> From: Daniel Colascione <dancol@dancol.org>
> 
> Under remote desktop, Windows returns the wrong number of colors from
> GetDeviceCaps (hdc, NUMCOLORS).  I hit this bug myself, and MSDN
> comments seem to indicate that others hit it as well.  The workaround
> seems harmless: on non-palettized displays, calculating the number of
> display colors based on display bitness should produce good results.

Thanks.

This is bug #10397, so I will reply there.  Please follow up there,
not here.



^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 9/9] Detect window-system from display name
  2012-08-07 15:50   ` Stefan Monnier
@ 2012-08-07 17:09     ` Daniel Colascione
  2012-08-07 20:01       ` Stefan Monnier
  0 siblings, 1 reply; 51+ messages in thread
From: Daniel Colascione @ 2012-08-07 17:09 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 836 bytes --]

On 8/7/12 8:50 AM, Stefan Monnier wrote:
>> +(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.")
> [...]
>> +(add-to-list 'display-format-alist '("\\`ns\\'" . ns))
> [...]
>> +(add-to-list 'display-format-alist '("\\`windows\\'" . w32))
> [...]
>> +(add-to-list 'display-format-alist '("\\`[^:]*:[0-9]+\\(\\.[0-9]+\\)?\\'" . x))
> 
> Better just put all three entries directly in the defvar.

But then the code that defvars the variable needs to know about all
the window systems we might use. It seems cleaner to have the
window-system-specific code add the window-system-specific alist entries.



[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 235 bytes --]

^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 2/9] Refactor window-system configuration
  2012-08-07  8:19 ` [PATCH 2/9] Refactor window-system configuration Daniel Colascione
@ 2012-08-07 17:20   ` Eli Zaretskii
  2012-08-07 17:31     ` Daniel Colascione
  2012-08-07 20:47     ` Stefan Monnier
  0 siblings, 2 replies; 51+ messages in thread
From: Eli Zaretskii @ 2012-08-07 17:20 UTC (permalink / raw)
  To: Daniel Colascione; +Cc: emacs-devel

> Date: Tue, 07 Aug 2012 01:19:27 -0700
> From: Daniel Colascione <dancol@dancol.org>
> 
> This change streamlines the window system selection code in
> configure.in and moves many common function declarations from
> window-specific headers to frame.h.  It introduces a new TERM_HEADER
> macro in config.h: we set this macro to the right header to use for
> the window system for which we're compiling Emacs and have source
> files include it indirectly.  This way, we don't have to teach every
> file about every window system.

A general comment on this refactoring: the current code does not
necessarily assume that a build must have only one type of window
system.  Your refactoring forces that.  Here's an example:

> --- a/src/dispnew.c
> +++ b/src/dispnew.c
> @@ -48,17 +48,9 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
>  
>  #include "syssignal.h"
>  
> -#ifdef HAVE_X_WINDOWS
> -#include "xterm.h"
> -#endif /* HAVE_X_WINDOWS */
> -
> -#ifdef HAVE_NTGUI
> -#include "w32term.h"
> -#endif /* HAVE_NTGUI */
> -
> -#ifdef HAVE_NS
> -#include "nsterm.h"
> -#endif
> +#ifdef HAVE_WINDOW_SYSTEM
> +#include TERM_HEADER
> +#endif /* HAVE_WINDOW_SYSTEM */

The current code could well enough use all 3 of the headers.  Your new
code precludes that.

(Yes, I know that currently including more than one means trouble,
because there will be conflicting declarations.  But still, your
change sets one more obstacle to the long-term goal of allowing
several different frame types in the same session.)

I'd like Stefan's and Chong's opinion on this before delving into the
details of this changeset.



^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 0/9] Support Win32 GUI in Cygwin Emacs
  2012-08-07  8:19 [PATCH 0/9] Support Win32 GUI in Cygwin Emacs Daniel Colascione
                   ` (8 preceding siblings ...)
  2012-08-07  8:19 ` [PATCH 8/9] Generalize fork+exec logic, add DAEMON_MUST_EXEC Daniel Colascione
@ 2012-08-07 17:22 ` Eli Zaretskii
  2012-08-07 17:29   ` Daniel Colascione
  9 siblings, 1 reply; 51+ messages in thread
From: Eli Zaretskii @ 2012-08-07 17:22 UTC (permalink / raw)
  To: Daniel Colascione; +Cc: emacs-devel

> Date: Tue, 07 Aug 2012 01:19:27 -0700
> From: Daniel Colascione <dancol@dancol.org>
> 
> This set of patches allows a Cygwin Emacs to use the w32 window-system
> instead of X11.  (The ability to use X11 with Cygwin is retained.)
> This patchset also fixes a few bugs in the Windows code and makes the
> window-system configuration mechanism more generic, eliminating
> inclusion of window-system specific headers in most of the code.

Thanks.  Just for my information: did you try building the modified
sources with MinGW?



^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 5/9] Prevent crash if w32 used before it's initialized
  2012-08-07  8:19 ` [PATCH 5/9] Prevent crash if w32 used before it's initialized Daniel Colascione
@ 2012-08-07 17:23   ` Eli Zaretskii
  2012-08-07 17:28     ` Daniel Colascione
  0 siblings, 1 reply; 51+ messages in thread
From: Eli Zaretskii @ 2012-08-07 17:23 UTC (permalink / raw)
  To: Daniel Colascione; +Cc: emacs-devel

> Date: Tue, 07 Aug 2012 01:19:27 -0700
> From: Daniel Colascione <dancol@dancol.org>
> 
> ---
>  src/w32fns.c |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)
> 
> diff --git a/src/w32fns.c b/src/w32fns.c
> index 8ef4982..9743822 100644
> --- a/src/w32fns.c
> +++ b/src/w32fns.c
> @@ -4833,7 +4833,7 @@ x_display_info_for_name (Lisp_Object name)
>    CHECK_STRING (name);
>  
>    for (dpyinfo = &one_w32_display_info, names = w32_display_name_list;
> -       dpyinfo;
> +       dpyinfo && !NILP (w32_display_name_list);
>         dpyinfo = dpyinfo->next, names = XCDR (names))
>      {
>        Lisp_Object tem;

Is this a real problem with the native w32 build?  If so, can you tell
how to reproduce it?



^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 5/9] Prevent crash if w32 used before it's initialized
  2012-08-07 17:23   ` Eli Zaretskii
@ 2012-08-07 17:28     ` Daniel Colascione
  2012-08-07 18:11       ` Eli Zaretskii
  0 siblings, 1 reply; 51+ messages in thread
From: Daniel Colascione @ 2012-08-07 17:28 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 987 bytes --]

On 8/7/12 10:23 AM, Eli Zaretskii wrote:
>> Date: Tue, 07 Aug 2012 01:19:27 -0700
>> From: Daniel Colascione <dancol@dancol.org>
>>
>> ---
>>  src/w32fns.c |    2 +-
>>  1 files changed, 1 insertions(+), 1 deletions(-)
>>
>> diff --git a/src/w32fns.c b/src/w32fns.c
>> index 8ef4982..9743822 100644
>> --- a/src/w32fns.c
>> +++ b/src/w32fns.c
>> @@ -4833,7 +4833,7 @@ x_display_info_for_name (Lisp_Object name)
>>    CHECK_STRING (name);
>>  
>>    for (dpyinfo = &one_w32_display_info, names = w32_display_name_list;
>> -       dpyinfo;
>> +       dpyinfo && !NILP (w32_display_name_list);
>>         dpyinfo = dpyinfo->next, names = XCDR (names))
>>      {
>>        Lisp_Object tem;
> 
> Is this a real problem with the native w32 build?  If so, can you tell
> how to reproduce it?

No --- it's something that came up in my testing late last year, and
I've forgotten the exact circumstances of the problem now. The change
seems harmless enough though.



[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 235 bytes --]

^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 0/9] Support Win32 GUI in Cygwin Emacs
  2012-08-07 17:22 ` [PATCH 0/9] Support Win32 GUI in Cygwin Emacs Eli Zaretskii
@ 2012-08-07 17:29   ` Daniel Colascione
  2012-08-07 18:10     ` Eli Zaretskii
  2012-08-08  2:33     ` Daniel Colascione
  0 siblings, 2 replies; 51+ messages in thread
From: Daniel Colascione @ 2012-08-07 17:29 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 839 bytes --]

On 8/7/12 10:22 AM, Eli Zaretskii wrote:
>> Date: Tue, 07 Aug 2012 01:19:27 -0700
>> From: Daniel Colascione <dancol@dancol.org>
>>
>> This set of patches allows a Cygwin Emacs to use the w32 window-system
>> instead of X11.  (The ability to use X11 with Cygwin is retained.)
>> This patchset also fixes a few bugs in the Windows code and makes the
>> window-system configuration mechanism more generic, eliminating
>> inclusion of window-system specific headers in most of the code.
> 
> Thanks.  Just for my information: did you try building the modified
> sources with MinGW?

Not yet, but definitely before I check in. Doing so looks like a pain
because I have a Cygwin build environment, not a MinGW one, and Emacs
won't build as NT-native under cross-compilation from Cygwin. (But
it'd be nice to make that work.)


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 235 bytes --]

^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 2/9] Refactor window-system configuration
  2012-08-07 17:20   ` Eli Zaretskii
@ 2012-08-07 17:31     ` Daniel Colascione
  2012-08-07 20:47     ` Stefan Monnier
  1 sibling, 0 replies; 51+ messages in thread
From: Daniel Colascione @ 2012-08-07 17:31 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 991 bytes --]

On 8/7/12 10:20 AM, Eli Zaretskii wrote:
> The current code could well enough use all 3 of the headers.  Your new
> code precludes that.
> 
> (Yes, I know that currently including more than one means trouble,
> because there will be conflicting declarations.  But still, your
> change sets one more obstacle to the long-term goal of allowing
> several different frame types in the same session.)
> 
> I'd like Stefan's and Chong's opinion on this before delving into the
> details of this changeset.

I gave this subject some thought. I'd also like to see Emacs support
multiple window systems in the future, but the way to do that isn't to
include more than one window-system header. Instead, it's to entirely
decouple the core code from the window system entirely, moving
everything necessary into frame.h itself.

The right thing to do in the future is to move to including no
window-system headers at all. I don't think my patch moves us further
from that goal.



[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 235 bytes --]

^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 3/9] Implement cygw32
  2012-08-07  8:19 ` [PATCH 3/9] Implement cygw32 Daniel Colascione
  2012-08-07 15:40   ` Stefan Monnier
@ 2012-08-07 18:02   ` Eli Zaretskii
  2012-08-07 20:11     ` Daniel Colascione
  1 sibling, 1 reply; 51+ messages in thread
From: Eli Zaretskii @ 2012-08-07 18:02 UTC (permalink / raw)
  To: Daniel Colascione; +Cc: emacs-devel

> Date: Tue, 07 Aug 2012 01:19:27 -0700
> From: Daniel Colascione <dancol@dancol.org>
> 
> +(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"))

I don't like to rely on environment variables for system-type
detection.  It's all to easy to remove or add environment variables.
If there's no better way that is already there, I'd prefer a new
primitive that is based on os_subtype variable in C, or something
similar.

(Yes, I know the current code uses getenv as well, but we might as
well fix it while at that.)

> --- a/lisp/w32-fns.el
> +++ b/lisp/w32-fns.el
> @@ -26,34 +26,20 @@
>  
>  ;;; Code:
>  (require 'w32-vars)
> +(require 'w32-common-fns)

Why do we need this require?  loadup.el loads w32-common-fns before
w32-fns, so it's already loaded here.  If you need this for
compilation, won't eval-when-compile be better?

> +wchar_t*
> +to_unicode (Lisp_Object str, Lisp_Object* buf)

A minor style issue: please leave a blank between '*' and the
preceding token.

> +  *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;

Can't you append a zero byte to the original str, before encoding it
with code_convert_string_norecord?  Copying it after encoding looks
inelegant.

> +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));
> +}

This function is only used from C.  Do we really need its Lisp
binding?

> +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);
> +}

I wonder why this couldn't be implemented in Lisp.  Isn't it just
decoding from UTF-16 followed by mirroring the backslashes?  If
there's more to it than that, please reflect that in the doc string.

> +#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"

I think it's a bad mojo for a header to include other Emacs headers.
Is it really needed?

> +/* Access the wide-character string stored in a Lisp string object.  */
> +#define WCSDATA(x) ((wchar_t*) SDATA (x))

This is IMO yucky, and I'd like to avoid this if possible.  Can you
explain why it is needed?

> +#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 */

I'd like to make tests of NTGUI_UNICODE at run time rather than at
compile time.  That's because we are gradually moving Emacs to using
Unicode APIs when available, so making these tests at run time will
allow to share more code between the Cygwin and native Windows builds.

There's already a variable w32_console_unicode_input in w32inevt.c
that is used for a similar purpose, and I believe there will be soon
another for a GUI input.  Can you define a similar variable for menus
or whatever, and either initialize it on some file that is compiled
both in the native and the Cygwin builds, or just unconditionally set
it to non-zero in some Cygwin specific function?  Then test it
whenever you need a Unicode API.

> --- a/src/emacs.c
> +++ b/src/emacs.c
> @@ -37,9 +37,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 */

It looks like you are deleting the inclusion of windows.h.  Why?

> -#if defined (WINDOWSNT)
> +#if defined (HAVE_NTGUI)
>    LANGUAGE_CHANGE_EVENT,	/* A LANGUAGE_CHANGE_EVENT is
> -				   generated on WINDOWSNT or Mac OS
> +				   generated on HAVE_NTGUI or Mac OS

"On HAVE_NTGUI" does not sound right...

Thanks.



^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 0/9] Support Win32 GUI in Cygwin Emacs
  2012-08-07 17:29   ` Daniel Colascione
@ 2012-08-07 18:10     ` Eli Zaretskii
  2012-08-07 19:18       ` Eli Zaretskii
  2012-08-07 20:15       ` Daniel Colascione
  2012-08-08  2:33     ` Daniel Colascione
  1 sibling, 2 replies; 51+ messages in thread
From: Eli Zaretskii @ 2012-08-07 18:10 UTC (permalink / raw)
  To: Daniel Colascione; +Cc: emacs-devel

> Date: Tue, 07 Aug 2012 10:29:25 -0700
> From: Daniel Colascione <dancol@dancol.org>
> CC: emacs-devel@gnu.org
> 
> > Thanks.  Just for my information: did you try building the modified
> > sources with MinGW?
> 
> Not yet, but definitely before I check in.

Thanks.

> Doing so looks like a pain because I have a Cygwin build
> environment, not a MinGW one, and Emacs won't build as NT-native
> under cross-compilation from Cygwin.

Really?  It should, though.  Doesn't "configure --no-cygwin" work
anymore?  If it doesn't, what is the problem that prevents that?



^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 5/9] Prevent crash if w32 used before it's initialized
  2012-08-07 17:28     ` Daniel Colascione
@ 2012-08-07 18:11       ` Eli Zaretskii
  0 siblings, 0 replies; 51+ messages in thread
From: Eli Zaretskii @ 2012-08-07 18:11 UTC (permalink / raw)
  To: Daniel Colascione; +Cc: emacs-devel

> Date: Tue, 07 Aug 2012 10:28:08 -0700
> From: Daniel Colascione <dancol@dancol.org>
> CC: emacs-devel@gnu.org
> 
> >>    for (dpyinfo = &one_w32_display_info, names = w32_display_name_list;
> >> -       dpyinfo;
> >> +       dpyinfo && !NILP (w32_display_name_list);
> >>         dpyinfo = dpyinfo->next, names = XCDR (names))
> >>      {
> >>        Lisp_Object tem;
> > 
> > Is this a real problem with the native w32 build?  If so, can you tell
> > how to reproduce it?
> 
> No --- it's something that came up in my testing late last year, and
> I've forgotten the exact circumstances of the problem now. The change
> seems harmless enough though.

Then please go ahead and commit it.

Thanks.



^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 4/9] Fix emacsclient to work with cygw32
  2012-08-07  8:19 ` [PATCH 4/9] Fix emacsclient to work with cygw32 Daniel Colascione
@ 2012-08-07 18:14   ` Eli Zaretskii
  2012-08-07 20:16     ` Daniel Colascione
  0 siblings, 1 reply; 51+ messages in thread
From: Eli Zaretskii @ 2012-08-07 18:14 UTC (permalink / raw)
  To: Daniel Colascione; +Cc: emacs-devel

> Date: Tue, 07 Aug 2012 01:19:27 -0700
> From: Daniel Colascione <dancol@dancol.org>
> 
> @@ -188,9 +192,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 }
>  };

How will the -d switch react in the native Windows build of
emacsclient?



^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 9/9] Detect window-system from display name
  2012-08-07  8:19 ` [PATCH 9/9] Detect window-system from display name Daniel Colascione
  2012-08-07 15:50   ` Stefan Monnier
@ 2012-08-07 18:18   ` Eli Zaretskii
  2012-08-07 20:28     ` Daniel Colascione
  2012-08-08 16:50   ` Eli Zaretskii
  2 siblings, 1 reply; 51+ messages in thread
From: Eli Zaretskii @ 2012-08-07 18:18 UTC (permalink / raw)
  To: Daniel Colascione; +Cc: emacs-devel

> Date: Tue, 07 Aug 2012 01:19:27 -0700
> From: Daniel Colascione <dancol@dancol.org>
> 
> ---
>  lisp/frame.el        |   53 +++++++++++++++++++++++++----------------
>  lisp/server.el       |   63 +++++++++++++++++++++++++++-----------------------
>  lisp/startup.el      |    3 +-
>  lisp/term/ns-win.el  |    4 ++-
>  lisp/term/w32-win.el |    7 ++++-
>  lisp/term/x-win.el   |    5 ++++
>  src/w32fns.c         |    5 +++-
>  7 files changed, 85 insertions(+), 55 deletions(-)

Can you tell why this changeset is needed?



^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 0/9] Support Win32 GUI in Cygwin Emacs
  2012-08-07 18:10     ` Eli Zaretskii
@ 2012-08-07 19:18       ` Eli Zaretskii
  2012-08-07 20:15       ` Daniel Colascione
  1 sibling, 0 replies; 51+ messages in thread
From: Eli Zaretskii @ 2012-08-07 19:18 UTC (permalink / raw)
  To: dancol; +Cc: emacs-devel

> Date: Tue, 07 Aug 2012 21:10:03 +0300
> From: Eli Zaretskii <eliz@gnu.org>
> Cc: emacs-devel@gnu.org
> 
> > Date: Tue, 07 Aug 2012 10:29:25 -0700
> > From: Daniel Colascione <dancol@dancol.org>
> > CC: emacs-devel@gnu.org
> > 
> > > Thanks.  Just for my information: did you try building the modified
> > > sources with MinGW?
> > 
> > Not yet, but definitely before I check in.
> 
> Thanks.

And another request: if you didn't already, could you please revisit
the discussion we had a year ago, and see that the issues raised there
were all resolved in these new patches?  If you have left-overs from
then that you'd like to discuss again, please raise them in this
thread.

Thanks.



^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 6/9] Rename `w32' local to `nt' for clarity
  2012-08-07 16:31     ` Eli Zaretskii
  2012-08-07 16:40       ` Drew Adams
@ 2012-08-07 20:00       ` Stefan Monnier
  2012-08-08  2:50         ` Eli Zaretskii
  1 sibling, 1 reply; 51+ messages in thread
From: Stefan Monnier @ 2012-08-07 20:00 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: dancol, emacs-devel

>> > -	   (w32 (eq system-type 'windows-nt))
>> > +	   (nt (eq system-type 'windows-nt))
>> I do see that we now have a problem where w32 can refer either to "using
>> the w32 API for things like process and file system operations" and
>> "using the w32 GUI".
> It's just a local variable, so I really don't see the problem with it.

Yes, this particular use case is of no importance, but I meant to discuss
the general issue.

>> But "nt" doesn't sound too good for the first.
>> Maybe "w32os"?
> How about "windows" or "ms-windows"?  w32os is misleading, or will be,
> once Emacs could be built as a 64-bit process.

I doubt we're going to rename all the w32-foo functions and variables,
so for better or worse, "w32" is most likely the official name we will
use even when building against the w64 API.

Just like we use "ns" for GNUstep and Mac OS X.


        Stefan



^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 9/9] Detect window-system from display name
  2012-08-07 17:09     ` Daniel Colascione
@ 2012-08-07 20:01       ` Stefan Monnier
  2012-08-07 20:19         ` Daniel Colascione
  0 siblings, 1 reply; 51+ messages in thread
From: Stefan Monnier @ 2012-08-07 20:01 UTC (permalink / raw)
  To: Daniel Colascione; +Cc: emacs-devel

> But then the code that defvars the variable needs to know about all
> the window systems we might use. It seems cleaner to have the
> window-system-specific code add the window-system-specific alist entries.

But they all need to know about each other to avoid conflicts anyway.


        Stefan



^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 3/9] Implement cygw32
  2012-08-07 18:02   ` Eli Zaretskii
@ 2012-08-07 20:11     ` Daniel Colascione
  2012-08-08 17:15       ` Eli Zaretskii
  0 siblings, 1 reply; 51+ messages in thread
From: Daniel Colascione @ 2012-08-07 20:11 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 7944 bytes --]

Thanks for taking a look at the code.

On 8/7/2012 11:02 AM, Eli Zaretskii wrote:
>> Date: Tue, 07 Aug 2012 01:19:27 -0700
>> From: Daniel Colascione <dancol@dancol.org>
>>
>> +(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"))
> 
> I don't like to rely on environment variables for system-type
> detection.  It's all to easy to remove or add environment variables.
> If there's no better way that is already there, I'd prefer a new
> primitive that is based on os_subtype variable in C, or something
> similar.

I'll see what I can do.

> 
> (Yes, I know the current code uses getenv as well, but we might as
> well fix it while at that.)
> 
>> --- a/lisp/w32-fns.el
>> +++ b/lisp/w32-fns.el
>> @@ -26,34 +26,20 @@
>>  
>>  ;;; Code:
>>  (require 'w32-vars)
>> +(require 'w32-common-fns)
> 
> Why do we need this require?  loadup.el loads w32-common-fns before
> w32-fns, so it's already loaded here.  If you need this for
> compilation, won't eval-when-compile be better?

We require w32-common-fns here because we require functions from w32-common-fns.
I don't like writing a module that relies on _other_ modules being gracious
enough to load its own dependencies.

>> +wchar_t*
>> +to_unicode (Lisp_Object str, Lisp_Object* buf)
> 
> A minor style issue: please leave a blank between '*' and the
> preceding token.

Sure.

> 
>> +  *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;
> 
> Can't you append a zero byte to the original str, before encoding it
> with code_convert_string_norecord?  Copying it after encoding looks
> inelegant.

I don't think code_convert_string_norecord is _always_ guaranteed to make a
copy, and I don't want to modify the input string. This function isn't on a hot
path, and the extra copy adds safety. I can explain in the command why we don't
do what you suggest above.

> 
>> +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));
>> +}
> 
> This function is only used from C.  Do we really need its Lisp
> binding?

The function is generally useful for all sorts of things. If this functionality
isn't expose through lisp, lisp code would have to exec cygpath(1), and that's
going to be much slower than just using the Cygwin function in-process.

> 
>> +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);
>> +}
> 
> I wonder why this couldn't be implemented in Lisp.  Isn't it just
> decoding from UTF-16 followed by mirroring the backslashes?  If
> there's more to it than that, please reflect that in the doc string.

Cygwin has its own mount table, and converting between Cygwin and Windows paths
is non-trivial. Anyone who uses Cygwin will know about the differences between
Cygwin and Windows paths, and I'm not sure what additional information in the
docstring would be warranted.

> 
>> +#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"
> 
> I think it's a bad mojo for a header to include other Emacs headers.
> Is it really needed?

I think it's bad mojo for a header _not_ to include what it needs. We have
include guards for a reason.

>> +/* Access the wide-character string stored in a Lisp string object.  */
>> +#define WCSDATA(x) ((wchar_t*) SDATA (x))
> 
> This is IMO yucky, and I'd like to avoid this if possible.  Can you
> explain why it is needed?

We need wide-character strings. What other data type do you propose using for
the purpose?

>> +#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 */
> 
> I'd like to make tests of NTGUI_UNICODE at run time rather than at
> compile time.  That's because we are gradually moving Emacs to using
> Unicode APIs when available, so making these tests at run time will
> allow to share more code between the Cygwin and native Windows builds.

Look: I'd be 100% in favor of making Emacs UNICODE-only. In fact, the first
version of this patch did exactly that. You and RMS rejected the idea because we
want to be platform necrophiliacs and support Windows 9X. I have to repeat that
nobody actually uses those systems and that we're wasting our time with that
support. When was the last time somebody even tested Emacs on 9X?

In the current version of the patch, NTGUI_UNICODE means "assume at compile time
that we will run on a system with UNICODE support". This constant allows us to
make certain simplifying assumptions, especially in the Cygwin path conversion
code. !NTGUI_UNICODE means "use Unicode APIs when available".

I'm not interested in having the Cygwin build detect UNICODE at runtime. There's
no such thing as a non-UNICODE Cygwin 1.7 environment, and Emacs only supports
Cygwin 1.7 or better.

> There's already a variable w32_console_unicode_input in w32inevt.c
> that is used for a similar purpose, and I believe there will be soon
> another for a GUI input.  Can you define a similar variable for menus
> or whatever, and either initialize it on some file that is compiled
> both in the native and the Cygwin builds, or just unconditionally set
> it to non-zero in some Cygwin specific function?  Then test it
> whenever you need a Unicode API.

We already do that for menus --- in !NTGUI_UNICODE builds, the variable
unicode_append_menu is bound to AppendMenuW if available. In NTGUI_UNICODE
builds, unicode_append_menu _is_ AppendMenuW.

> 
>> --- a/src/emacs.c
>> +++ b/src/emacs.c
>> @@ -37,9 +37,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 */
> 
> It looks like you are deleting the inclusion of windows.h.  Why?

emacs.c doesn't need it.

> 
>> -#if defined (WINDOWSNT)
>> +#if defined (HAVE_NTGUI)
>>    LANGUAGE_CHANGE_EVENT,	/* A LANGUAGE_CHANGE_EVENT is
>> -				   generated on WINDOWSNT or Mac OS
>> +				   generated on HAVE_NTGUI or Mac OS
> 
> "On HAVE_NTGUI" does not sound right...

The phrasing is correct, but grammatically contorted. I'll fix it.



[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 259 bytes --]

^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 0/9] Support Win32 GUI in Cygwin Emacs
  2012-08-07 18:10     ` Eli Zaretskii
  2012-08-07 19:18       ` Eli Zaretskii
@ 2012-08-07 20:15       ` Daniel Colascione
  2012-08-07 20:24         ` Juanma Barranquero
  2012-08-08  2:53         ` Eli Zaretskii
  1 sibling, 2 replies; 51+ messages in thread
From: Daniel Colascione @ 2012-08-07 20:15 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 944 bytes --]

On 8/7/2012 11:10 AM, Eli Zaretskii wrote:
>> Doing so looks like a pain because I have a Cygwin build
>> environment, not a MinGW one, and Emacs won't build as NT-native
>> under cross-compilation from Cygwin.
> 
> Really?  It should, though.  Doesn't "configure --no-cygwin" work
> anymore?  If it doesn't, what is the problem that prevents that?
> 

_configure.bat_ --no-cygwin exists, but because I don't use configure.bat, I
didn't notice it. I'm building Emacs using the usual autoconf machinery and
bash. I'd like to make it possible to cross-compile an NT-native Emacs in the
Cygwin environment using the autoconf machinery.

By the way: -mno-cygwin hasn't worked for a few years now. The Cygwin people now
recommend using a real cross-compiler to compile for MinGW --- e.g.,
i686-w64-mingw32-gcc.

If I had my way, we'd drop configure.bat entirely and always build NT-native
Emacs by cross-compiling from Cygwin.


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 259 bytes --]

^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 4/9] Fix emacsclient to work with cygw32
  2012-08-07 18:14   ` Eli Zaretskii
@ 2012-08-07 20:16     ` Daniel Colascione
  2012-08-08  2:55       ` Eli Zaretskii
  0 siblings, 1 reply; 51+ messages in thread
From: Daniel Colascione @ 2012-08-07 20:16 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 827 bytes --]

On 8/7/2012 11:14 AM, Eli Zaretskii wrote:
>> Date: Tue, 07 Aug 2012 01:19:27 -0700
>> From: Daniel Colascione <dancol@dancol.org>
>>
>> @@ -188,9 +192,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 }
>>  };
> 
> How will the -d switch react in the native Windows build of
> emacsclient?
> 

NT-native emacsclient would bail out and die. Hrm: maybe it'd be better to
retain the functionality? But what would we do with DISPLAY information there?
It'd be nice if any emacsclient could work with any emacs, but I don't think
we're there yet.


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 259 bytes --]

^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 9/9] Detect window-system from display name
  2012-08-07 20:01       ` Stefan Monnier
@ 2012-08-07 20:19         ` Daniel Colascione
  2012-08-07 22:52           ` Lennart Borgman
  0 siblings, 1 reply; 51+ messages in thread
From: Daniel Colascione @ 2012-08-07 20:19 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 605 bytes --]

On 8/7/2012 1:01 PM, Stefan Monnier wrote:
>> But then the code that defvars the variable needs to know about all
>> the window systems we might use. It seems cleaner to have the
>> window-system-specific code add the window-system-specific alist entries.
> 
> But they all need to know about each other to avoid conflicts anyway.

Not really --- different window-systems just need to avoid having the same
display-string prefix. This approach works well enough in other pieces of code:
org-mode doesn't need to know about cc-mode specifically in order not to trample
on cc-mode's namespace.


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 259 bytes --]

^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 0/9] Support Win32 GUI in Cygwin Emacs
  2012-08-07 20:15       ` Daniel Colascione
@ 2012-08-07 20:24         ` Juanma Barranquero
  2012-08-08  2:53         ` Eli Zaretskii
  1 sibling, 0 replies; 51+ messages in thread
From: Juanma Barranquero @ 2012-08-07 20:24 UTC (permalink / raw)
  To: Daniel Colascione; +Cc: Eli Zaretskii, emacs-devel

On Tue, Aug 7, 2012 at 10:15 PM, Daniel Colascione <dancol@dancol.org> wrote:

> If I had my way, we'd drop configure.bat entirely and always build NT-native
> Emacs by cross-compiling from Cygwin.

That'd be the day I would leave Emacs development for good :-)

    Juanma



^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 9/9] Detect window-system from display name
  2012-08-07 18:18   ` Eli Zaretskii
@ 2012-08-07 20:28     ` Daniel Colascione
  0 siblings, 0 replies; 51+ messages in thread
From: Daniel Colascione @ 2012-08-07 20:28 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 849 bytes --]

On 8/7/2012 11:18 AM, Eli Zaretskii wrote:
>> Date: Tue, 07 Aug 2012 01:19:27 -0700
>> From: Daniel Colascione <dancol@dancol.org>
>>
>> ---
>>  lisp/frame.el        |   53 +++++++++++++++++++++++++----------------
>>  lisp/server.el       |   63 +++++++++++++++++++++++++++-----------------------
>>  lisp/startup.el      |    3 +-
>>  lisp/term/ns-win.el  |    4 ++-
>>  lisp/term/w32-win.el |    7 ++++-
>>  lisp/term/x-win.el   |    5 ++++
>>  src/w32fns.c         |    5 +++-
>>  7 files changed, 85 insertions(+), 55 deletions(-)
> 
> Can you tell why this changeset is needed?
> 

This change helps emacsclient work with both kinds of Cygwin builds, and we'll
eventually need exactly this machinery if we're to support multiple window
systems. With this change, all the supported window systems are on an equal footing.


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 259 bytes --]

^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 2/9] Refactor window-system configuration
  2012-08-07 17:20   ` Eli Zaretskii
  2012-08-07 17:31     ` Daniel Colascione
@ 2012-08-07 20:47     ` Stefan Monnier
  1 sibling, 0 replies; 51+ messages in thread
From: Stefan Monnier @ 2012-08-07 20:47 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Daniel Colascione, emacs-devel

> The current code could well enough use all 3 of the headers.  Your new
> code precludes that.

> (Yes, I know that currently including more than one means trouble,
> because there will be conflicting declarations.  But still, your
> change sets one more obstacle to the long-term goal of allowing
> several different frame types in the same session.)

> I'd like Stefan's and Chong's opinion on this before delving into the
> details of this changeset.

Indeed, we'd like to allow building with several GUI libs at the same
time, so it would be good to try and restructure this change so it
doesn't assume a single GUI library.  But in order to get such
a "multi-GUI" Emacs, we'll need to refactor a fair bit of the code, so
I'm not sure this change would be a real impediment.

Also, this "multi-GUI" goal is just a "would be nice to have" and while
someone mentioned interest in hacking on it a while ago, I don't think
he still plans to do it, and I don't know of anybody who does, so it may
stay as a wishlist item for many more years.

IOW, I don't think this patch 2/9 should worry too much about this issue.


        Stefan



^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 9/9] Detect window-system from display name
  2012-08-07 20:19         ` Daniel Colascione
@ 2012-08-07 22:52           ` Lennart Borgman
  2012-08-07 22:54             ` Daniel Colascione
  0 siblings, 1 reply; 51+ messages in thread
From: Lennart Borgman @ 2012-08-07 22:52 UTC (permalink / raw)
  To: Daniel Colascione; +Cc: Stefan Monnier, emacs-devel

On Tue, Aug 7, 2012 at 10:19 PM, Daniel Colascione <dancol@dancol.org> wrote:
>>
>> But they all need to know about each other to avoid conflicts anyway.
>
> Not really --- different window-systems just need to avoid having the same
> display-string prefix. This approach works well enough in other pieces of code:
> org-mode doesn't need to know about cc-mode specifically in order not to trample
> on cc-mode's namespace.

Can't emacs' server have clients from different systems?



^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 9/9] Detect window-system from display name
  2012-08-07 22:52           ` Lennart Borgman
@ 2012-08-07 22:54             ` Daniel Colascione
  2012-08-07 23:02               ` Lennart Borgman
  0 siblings, 1 reply; 51+ messages in thread
From: Daniel Colascione @ 2012-08-07 22:54 UTC (permalink / raw)
  To: Lennart Borgman; +Cc: Stefan Monnier, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 573 bytes --]

On 8/7/2012 3:52 PM, Lennart Borgman wrote:
> On Tue, Aug 7, 2012 at 10:19 PM, Daniel Colascione <dancol@dancol.org> wrote:
>>>
>>> But they all need to know about each other to avoid conflicts anyway.
>>
>> Not really --- different window-systems just need to avoid having the same
>> display-string prefix. This approach works well enough in other pieces of code:
>> org-mode doesn't need to know about cc-mode specifically in order not to trample
>> on cc-mode's namespace.
> 
> Can't emacs' server have clients from different systems?
> 
> 

Yes. And?


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 259 bytes --]

^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 9/9] Detect window-system from display name
  2012-08-07 22:54             ` Daniel Colascione
@ 2012-08-07 23:02               ` Lennart Borgman
  0 siblings, 0 replies; 51+ messages in thread
From: Lennart Borgman @ 2012-08-07 23:02 UTC (permalink / raw)
  To: Daniel Colascione; +Cc: Stefan Monnier, emacs-devel

On Wed, Aug 8, 2012 at 12:54 AM, Daniel Colascione <dancol@dancol.org> wrote:
> On 8/7/2012 3:52 PM, Lennart Borgman wrote:
>> On Tue, Aug 7, 2012 at 10:19 PM, Daniel Colascione <dancol@dancol.org> wrote:
>>>>
>>>> But they all need to know about each other to avoid conflicts anyway.
>>>
>>> Not really --- different window-systems just need to avoid having the same
>>> display-string prefix. This approach works well enough in other pieces of code:
>>> org-mode doesn't need to know about cc-mode specifically in order not to trample
>>> on cc-mode's namespace.
>>
>> Can't emacs' server have clients from different systems?
>>
>>
>
> Yes. And?

Maybe having all the systems mentioned (in form of the values) in the
declaration of display-format-alist is at least a bit informative?



^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 0/9] Support Win32 GUI in Cygwin Emacs
  2012-08-07 17:29   ` Daniel Colascione
  2012-08-07 18:10     ` Eli Zaretskii
@ 2012-08-08  2:33     ` Daniel Colascione
  2012-08-08  3:03       ` Eli Zaretskii
  1 sibling, 1 reply; 51+ messages in thread
From: Daniel Colascione @ 2012-08-08  2:33 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 1548 bytes --]

On 8/7/2012 10:29 AM, Daniel Colascione wrote:
> On 8/7/12 10:22 AM, Eli Zaretskii wrote:
>>> Date: Tue, 07 Aug 2012 01:19:27 -0700
>>> From: Daniel Colascione <dancol@dancol.org>
>>>
>>> This set of patches allows a Cygwin Emacs to use the w32 window-system
>>> instead of X11.  (The ability to use X11 with Cygwin is retained.)
>>> This patchset also fixes a few bugs in the Windows code and makes the
>>> window-system configuration mechanism more generic, eliminating
>>> inclusion of window-system specific headers in most of the code.
>>
>> Thanks.  Just for my information: did you try building the modified
>> sources with MinGW?
> 
> Not yet, but definitely before I check in. Doing so looks like a pain
> because I have a Cygwin build environment, not a MinGW one, and Emacs
> won't build as NT-native under cross-compilation from Cygwin. (But
> it'd be nice to make that work.)
> 

Is building with cl.exe (Visual Studio) supposed to work? I remember some
discussion on the mailing list, but I don't know whether compilation was made to
actually work. When I try building with CL, I get a bunch of errors, many
apparently unrelated to my changes. For example,

emacs.c
c:\users\dancol\software\emacs\cyg.w32test\src\lisp.h(336) : error C2065: 'PTRDI
FF_MIN' : undeclared identifier
c:\users\dancol\software\emacs\cyg.w32test\src\lisp.h(336) : error C2099: initia
lizer is not a constant
c:\users\dancol\software\emacs\cyg.w32test\src\lisp.h(2375) : error C2065: 'PTRD
IFF_MIN' : undeclared identifier



[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 259 bytes --]

^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 6/9] Rename `w32' local to `nt' for clarity
  2012-08-07 20:00       ` Stefan Monnier
@ 2012-08-08  2:50         ` Eli Zaretskii
  0 siblings, 0 replies; 51+ messages in thread
From: Eli Zaretskii @ 2012-08-08  2:50 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: dancol, emacs-devel

> From: Stefan Monnier <monnier@IRO.UMontreal.CA>
> Cc: dancol@dancol.org, emacs-devel@gnu.org
> Date: Tue, 07 Aug 2012 16:00:01 -0400
> 
> I doubt we're going to rename all the w32-foo functions and variables,
> so for better or worse, "w32" is most likely the official name we will
> use even when building against the w64 API.

Then I vote for leaving this particular variable alone.



^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 0/9] Support Win32 GUI in Cygwin Emacs
  2012-08-07 20:15       ` Daniel Colascione
  2012-08-07 20:24         ` Juanma Barranquero
@ 2012-08-08  2:53         ` Eli Zaretskii
  1 sibling, 0 replies; 51+ messages in thread
From: Eli Zaretskii @ 2012-08-08  2:53 UTC (permalink / raw)
  To: Daniel Colascione; +Cc: emacs-devel

> Date: Tue, 07 Aug 2012 13:15:30 -0700
> From: Daniel Colascione <dancol@dancol.org>
> CC: emacs-devel@gnu.org
> 
> _configure.bat_ --no-cygwin exists, but because I don't use configure.bat, I
> didn't notice it. I'm building Emacs using the usual autoconf machinery and
> bash. I'd like to make it possible to cross-compile an NT-native Emacs in the
> Cygwin environment using the autoconf machinery.

Using configure.bat is currently the only way to build the native
Windows Emacs.

> By the way: -mno-cygwin hasn't worked for a few years now. The Cygwin people now
> recommend using a real cross-compiler to compile for MinGW --- e.g.,
> i686-w64-mingw32-gcc.

Yes, I know.  If that's the only problem with using Cygwin tools to
build a native Windows binary, making the change is very easy.

> If I had my way, we'd drop configure.bat entirely and always build NT-native
> Emacs by cross-compiling from Cygwin.

We could support that option (as well as using MSYS tools with MinGW
compiler), if someone did the job of adapting the configury.



^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 4/9] Fix emacsclient to work with cygw32
  2012-08-07 20:16     ` Daniel Colascione
@ 2012-08-08  2:55       ` Eli Zaretskii
  0 siblings, 0 replies; 51+ messages in thread
From: Eli Zaretskii @ 2012-08-08  2:55 UTC (permalink / raw)
  To: Daniel Colascione; +Cc: emacs-devel

> Date: Tue, 07 Aug 2012 13:16:47 -0700
> From: Daniel Colascione <dancol@dancol.org>
> CC: emacs-devel@gnu.org
> 
> On 8/7/2012 11:14 AM, Eli Zaretskii wrote:
> >> Date: Tue, 07 Aug 2012 01:19:27 -0700
> >> From: Daniel Colascione <dancol@dancol.org>
> >>
> >> @@ -188,9 +192,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 }
> >>  };
> > 
> > How will the -d switch react in the native Windows build of
> > emacsclient?
> > 
> 
> NT-native emacsclient would bail out and die.

So then this change needs to be only for Cygwin.

> Hrm: maybe it'd be better to
> retain the functionality? But what would we do with DISPLAY information there?
> It'd be nice if any emacsclient could work with any emacs, but I don't think
> we're there yet.

That's right, we are not.  That's a separate project.



^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 0/9] Support Win32 GUI in Cygwin Emacs
  2012-08-08  2:33     ` Daniel Colascione
@ 2012-08-08  3:03       ` Eli Zaretskii
  0 siblings, 0 replies; 51+ messages in thread
From: Eli Zaretskii @ 2012-08-08  3:03 UTC (permalink / raw)
  To: Daniel Colascione; +Cc: emacs-devel

> Date: Tue, 07 Aug 2012 19:33:12 -0700
> From: Daniel Colascione <dancol@dancol.org>
> CC: emacs-devel@gnu.org
> 
> Is building with cl.exe (Visual Studio) supposed to work?

Yes, but it currently has a couple of known (to me) problems due to
the latest changes.  I've been waiting for the dust to settle to fix
them.

> emacs.c
> c:\users\dancol\software\emacs\cyg.w32test\src\lisp.h(336) : error C2065: 'PTRDIFF_MIN' : undeclared identifier

This one I didn't know about.

> c:\users\dancol\software\emacs\cyg.w32test\src\lisp.h(336) : error C2099: initializer is not a constant

This one I did.



^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 9/9] Detect window-system from display name
  2012-08-07  8:19 ` [PATCH 9/9] Detect window-system from display name Daniel Colascione
  2012-08-07 15:50   ` Stefan Monnier
  2012-08-07 18:18   ` Eli Zaretskii
@ 2012-08-08 16:50   ` Eli Zaretskii
  2 siblings, 0 replies; 51+ messages in thread
From: Eli Zaretskii @ 2012-08-08 16:50 UTC (permalink / raw)
  To: Daniel Colascione; +Cc: emacs-devel

> Date: Tue, 07 Aug 2012 01:19:27 -0700
> From: Daniel Colascione <dancol@dancol.org>
> 
> +(add-to-list 'display-format-alist '("\\`windows\\'" . w32))

Is this kind of addition needed only for make-frame-on-display, or is
it used for other functions as well?

> +  CHECK_STRING (display);
> +  if (strcmp (SSDATA (display), "windows"))
> +    error ("The name of the Windows display must be \"windows\"");

Why signal an error here?

In any case, please use 'strcmp (...) != 0' here.

I think the bulk of this changeset should be reviewed by someone else,
as it has very little to do with Windows.



^ permalink raw reply	[flat|nested] 51+ messages in thread

* Re: [PATCH 3/9] Implement cygw32
  2012-08-07 20:11     ` Daniel Colascione
@ 2012-08-08 17:15       ` Eli Zaretskii
  0 siblings, 0 replies; 51+ messages in thread
From: Eli Zaretskii @ 2012-08-08 17:15 UTC (permalink / raw)
  To: Daniel Colascione; +Cc: emacs-devel

> Date: Tue, 07 Aug 2012 13:11:36 -0700
> From: Daniel Colascione <dancol@dancol.org>
> CC: emacs-devel@gnu.org
> 
> Thanks for taking a look at the code.

Thanks for writing it in the first place.

> >> +  (getenv "SystemRoot"))
> > 
> > I don't like to rely on environment variables for system-type
> > detection.  It's all to easy to remove or add environment variables.
> > If there's no better way that is already there, I'd prefer a new
> > primitive that is based on os_subtype variable in C, or something
> > similar.
> 
> I'll see what I can do.

Thanks.  let me know if you need help.

> >> +  *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;
> > 
> > Can't you append a zero byte to the original str, before encoding it
> > with code_convert_string_norecord?  Copying it after encoding looks
> > inelegant.
> 
> I don't think code_convert_string_norecord is _always_ guaranteed to make a
> copy, and I don't want to modify the input string. This function isn't on a hot
> path, and the extra copy adds safety.

OK, but then please at least use make_specified_string to enlarge the
encoded string, instead of repeating what it does in-line.

Alternatively, you could avoid the extra copy in a way similar to what
w32select.c does:

  setup_windows_coding_system (coding_system, &coding);
  coding.dst_bytes = SBYTES (current_text) * 2;
  coding.destination = xmalloc (coding.dst_bytes);
  encode_coding_object (&coding, current_text, 0, 0,
			SCHARS (current_text), SBYTES (current_text), Qnil);

After this, you have the encoded string in coding.destination.  If you
make sure the malloc'ed buffer is large enough to allow one more byte
for the extra null (which the above snippet doesn't do, btw), you are
home free.

I'll leave it up to you to decide which method is more elegant.

> >> +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);
> >> +}
> > 
> > I wonder why this couldn't be implemented in Lisp.  Isn't it just
> > decoding from UTF-16 followed by mirroring the backslashes?  If
> > there's more to it than that, please reflect that in the doc string.
> 
> Cygwin has its own mount table, and converting between Cygwin and Windows paths
> is non-trivial.

OK.

> Anyone who uses Cygwin will know about the differences between
> Cygwin and Windows paths, and I'm not sure what additional
> information in the docstring would be warranted.

Most Emacs maintainers are not users of Cygwin, and they still need to
know something about the functions we provide (e.g., to be able to
review patches ;-).  The additional information that will suffice is
just what you said above: that the conversion consults Cygwin mount
tables to convert Windows drive letters to Posix file names.

And btw, please don't use "path" here, but "filename".  GNU coding
standards frown on using "path" for anything but PATH-style directory
lists.

> >> +#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"
> > 
> > I think it's a bad mojo for a header to include other Emacs headers.
> > Is it really needed?
> 
> I think it's bad mojo for a header _not_ to include what it needs. We have
> include guards for a reason.

It makes dependency checking harder and more error prone.

None of the Emacs headers includes config.h or lisp.h, so please move
those at least to the .c file.

> >> +/* Access the wide-character string stored in a Lisp string object.  */
> >> +#define WCSDATA(x) ((wchar_t*) SDATA (x))
> > 
> > This is IMO yucky, and I'd like to avoid this if possible.  Can you
> > explain why it is needed?
> 
> We need wide-character strings. What other data type do you propose using for
> the purpose?

Like we do with any encoded string: a unibyte string.

> When was the last time somebody even tested Emacs on 9X?

AFAIK, 9 months ago.  See bug #8562.

> I'm not interested in having the Cygwin build detect UNICODE at runtime.

You don't need to: you can unconditionally set some flag variable to a
non-zero value in the Cygwin initialization code, and then test that
variable where you need to use either the ANSI or the Unicode APIs.
The native Windows port, OTOH, will set that variable as appropriate
 for the underlying platform.

> > There's already a variable w32_console_unicode_input in w32inevt.c
> > that is used for a similar purpose, and I believe there will be soon
> > another for a GUI input.  Can you define a similar variable for menus
> > or whatever, and either initialize it on some file that is compiled
> > both in the native and the Cygwin builds, or just unconditionally set
> > it to non-zero in some Cygwin specific function?  Then test it
> > whenever you need a Unicode API.
> 
> We already do that for menus --- in !NTGUI_UNICODE builds, the variable
> unicode_append_menu is bound to AppendMenuW if available. In NTGUI_UNICODE
> builds, unicode_append_menu _is_ AppendMenuW.

I see that.  But what I'm asking is to make one more step, and make
that test at run time, rather than at compile time.  The advantage of
that is that the code you wrote will then be used by the native
Windows build as well, and will get much more testing and user
feedback than if it were an obscure Cygwin-only feature.  I hope you
will agree that it's a win-win situation.

Thanks.



^ permalink raw reply	[flat|nested] 51+ messages in thread

end of thread, other threads:[~2012-08-08 17:15 UTC | newest]

Thread overview: 51+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-08-07  8:19 [PATCH 0/9] Support Win32 GUI in Cygwin Emacs Daniel Colascione
2012-08-07  8:19 ` [PATCH 3/9] Implement cygw32 Daniel Colascione
2012-08-07 15:40   ` Stefan Monnier
2012-08-07 18:02   ` Eli Zaretskii
2012-08-07 20:11     ` Daniel Colascione
2012-08-08 17:15       ` Eli Zaretskii
2012-08-07  8:19 ` [PATCH 7/9] Add alt_display to emacsclient for w32, ns Daniel Colascione
2012-08-07 15:22   ` Stefan Monnier
2012-08-07  8:19 ` [PATCH 4/9] Fix emacsclient to work with cygw32 Daniel Colascione
2012-08-07 18:14   ` Eli Zaretskii
2012-08-07 20:16     ` Daniel Colascione
2012-08-08  2:55       ` Eli Zaretskii
2012-08-07  8:19 ` [PATCH 1/9] Under Remote Desktop, NUMCOLORS is unreliable; workaround Daniel Colascione
2012-08-07 17:07   ` Eli Zaretskii
2012-08-07  8:19 ` [PATCH 6/9] Rename `w32' local to `nt' for clarity Daniel Colascione
2012-08-07 10:49   ` Lennart Borgman
2012-08-07 15:45   ` Stefan Monnier
2012-08-07 16:31     ` Eli Zaretskii
2012-08-07 16:40       ` Drew Adams
2012-08-07 17:07         ` Daniel Colascione
2012-08-07 20:00       ` Stefan Monnier
2012-08-08  2:50         ` Eli Zaretskii
2012-08-07  8:19 ` [PATCH 5/9] Prevent crash if w32 used before it's initialized Daniel Colascione
2012-08-07 17:23   ` Eli Zaretskii
2012-08-07 17:28     ` Daniel Colascione
2012-08-07 18:11       ` Eli Zaretskii
2012-08-07  8:19 ` [PATCH 9/9] Detect window-system from display name Daniel Colascione
2012-08-07 15:50   ` Stefan Monnier
2012-08-07 17:09     ` Daniel Colascione
2012-08-07 20:01       ` Stefan Monnier
2012-08-07 20:19         ` Daniel Colascione
2012-08-07 22:52           ` Lennart Borgman
2012-08-07 22:54             ` Daniel Colascione
2012-08-07 23:02               ` Lennart Borgman
2012-08-07 18:18   ` Eli Zaretskii
2012-08-07 20:28     ` Daniel Colascione
2012-08-08 16:50   ` Eli Zaretskii
2012-08-07  8:19 ` [PATCH 2/9] Refactor window-system configuration Daniel Colascione
2012-08-07 17:20   ` Eli Zaretskii
2012-08-07 17:31     ` Daniel Colascione
2012-08-07 20:47     ` Stefan Monnier
2012-08-07  8:19 ` [PATCH 8/9] Generalize fork+exec logic, add DAEMON_MUST_EXEC Daniel Colascione
2012-08-07 17:22 ` [PATCH 0/9] Support Win32 GUI in Cygwin Emacs Eli Zaretskii
2012-08-07 17:29   ` Daniel Colascione
2012-08-07 18:10     ` Eli Zaretskii
2012-08-07 19:18       ` Eli Zaretskii
2012-08-07 20:15       ` Daniel Colascione
2012-08-07 20:24         ` Juanma Barranquero
2012-08-08  2:53         ` Eli Zaretskii
2012-08-08  2:33     ` Daniel Colascione
2012-08-08  3:03       ` Eli Zaretskii

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).