Commit 819e2da9 authored by Daniel Colascione's avatar Daniel Colascione

2013-03-10 Daniel Colascione <dancol@dancol.org>

	* w32term.h (GUISTR, GUI_ENCODE_FILE, GUI_ENCODE_SYSTEM, GUI_FN)
	(GUI_SDATA, guichar_t): Macros to abstract out differences between
	NTGUI_UNICODE and !NTGUI_UNICODE builds, some moved out of
	w32fns.c.

	* w32term.c (construct_drag_n_drop): Use the above macros to make
	drag-and-drop work for non-ASCII filenames in cygw32 builds.

	* w32fns.c (x_set_name, x_set_title): Use the above macros to
	properly display non-ASCII frame titles in cygw32 builds.

	* w32fns.c (Fw32_shell_execute): Use the above macros to properly
	call ShellExecute in cygw32 builds.

	* w32fn.c (Fx_file_dialog): Use the above macros to simplify the
	common file dialog code.

	* w32fns.c (Ffile_system_info): Remove from cygw32 builds, which
	can just use du like other systems.

	* coding.c (from_unicode_buffer): Declare.
	* coding.c (from_unicode_buffer): Implement.
parent d2e24f92
2013-03-10 Daniel Colascione <dancol@dancol.org>
* w32term.h (GUISTR, GUI_ENCODE_FILE, GUI_ENCODE_SYSTEM, GUI_FN)
(GUI_SDATA, guichar_t): Macros to abstract out differences between
NTGUI_UNICODE and !NTGUI_UNICODE builds, some moved out of
w32fns.c.
* w32term.c (construct_drag_n_drop): Use the above macros to make
drag-and-drop work for non-ASCII filenames in cygw32 builds.
* w32fns.c (x_set_name, x_set_title): Use the above macros to
properly display non-ASCII frame titles in cygw32 builds.
* w32fns.c (Fw32_shell_execute): Use the above macros to properly
call ShellExecute in cygw32 builds.
* w32fn.c (Fx_file_dialog): Use the above macros to simplify the
common file dialog code.
* w32fns.c (Ffile_system_info): Remove from cygw32 builds, which
can just use du like other systems.
* coding.c (from_unicode_buffer): Declare.
* coding.c (from_unicode_buffer): Implement.
2013-03-10 Stefan Monnier <monnier@iro.umontreal.ca> 2013-03-10 Stefan Monnier <monnier@iro.umontreal.ca>
* lread.c: Minor cleanup. * lread.c: Minor cleanup.
......
...@@ -286,6 +286,10 @@ encode_coding_XXX (struct coding_system *coding) ...@@ -286,6 +286,10 @@ encode_coding_XXX (struct coding_system *coding)
#include <config.h> #include <config.h>
#include <stdio.h> #include <stdio.h>
#ifdef HAVE_WCHAR_H
#include <wchar.h>
#endif /* HAVE_WCHAR_H */
#include "lisp.h" #include "lisp.h"
#include "character.h" #include "character.h"
#include "buffer.h" #include "buffer.h"
...@@ -8003,6 +8007,16 @@ from_unicode (Lisp_Object str) ...@@ -8003,6 +8007,16 @@ from_unicode (Lisp_Object str)
return code_convert_string_norecord (str, Qutf_16le, 0); return code_convert_string_norecord (str, Qutf_16le, 0);
} }
Lisp_Object
from_unicode_buffer (const wchar_t* wstr)
{
return from_unicode (
make_unibyte_string (
(char*) wstr,
/* we get one of the two final 0 bytes for free. */
1 + sizeof (wchar_t) * wcslen (wstr)));
}
wchar_t * wchar_t *
to_unicode (Lisp_Object str, Lisp_Object *buf) to_unicode (Lisp_Object str, Lisp_Object *buf)
{ {
......
...@@ -715,6 +715,9 @@ extern wchar_t *to_unicode (Lisp_Object str, Lisp_Object *buf); ...@@ -715,6 +715,9 @@ extern wchar_t *to_unicode (Lisp_Object str, Lisp_Object *buf);
failure modes. STR itself is not modified. */ failure modes. STR itself is not modified. */
extern Lisp_Object from_unicode (Lisp_Object str); extern Lisp_Object from_unicode (Lisp_Object str);
/* Convert WSTR to an Emacs string. */
extern Lisp_Object from_unicode_buffer (const wchar_t* wstr);
#endif /* WINDOWSNT || CYGWIN */ #endif /* WINDOWSNT || CYGWIN */
/* Macros for backward compatibility. */ /* Macros for backward compatibility. */
......
...@@ -1721,11 +1721,9 @@ x_set_name (struct frame *f, Lisp_Object name, int explicit) ...@@ -1721,11 +1721,9 @@ x_set_name (struct frame *f, Lisp_Object name, int explicit)
if (FRAME_W32_WINDOW (f)) if (FRAME_W32_WINDOW (f))
{ {
if (STRING_MULTIBYTE (name))
name = ENCODE_SYSTEM (name);
block_input (); block_input ();
SetWindowText (FRAME_W32_WINDOW (f), SDATA (name)); GUI_FN (SetWindowText) (FRAME_W32_WINDOW (f),
GUI_SDATA (GUI_ENCODE_SYSTEM (name)));
unblock_input (); unblock_input ();
} }
} }
...@@ -1767,11 +1765,9 @@ x_set_title (struct frame *f, Lisp_Object name, Lisp_Object old_name) ...@@ -1767,11 +1765,9 @@ x_set_title (struct frame *f, Lisp_Object name, Lisp_Object old_name)
if (FRAME_W32_WINDOW (f)) if (FRAME_W32_WINDOW (f))
{ {
if (STRING_MULTIBYTE (name))
name = ENCODE_SYSTEM (name);
block_input (); block_input ();
SetWindowText (FRAME_W32_WINDOW (f), SDATA (name)); GUI_FN (SetWindowText) (FRAME_W32_WINDOW (f),
GUI_SDATA (GUI_ENCODE_SYSTEM (name)));
unblock_input (); unblock_input ();
} }
} }
...@@ -6006,14 +6002,6 @@ Value is t if tooltip was open, nil otherwise. */) ...@@ -6006,14 +6002,6 @@ Value is t if tooltip was open, nil otherwise. */)
#define FILE_NAME_COMBO_BOX cmb13 #define FILE_NAME_COMBO_BOX cmb13
#define FILE_NAME_LIST lst1 #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. /* Callback for altering the behavior of the Open File dialog.
Makes the Filename text field contain "Current Directory" and be Makes the Filename text field contain "Current Directory" and be
read-only when "Directories" is selected in the filter. This read-only when "Directories" is selected in the filter. This
...@@ -6230,11 +6218,7 @@ Otherwise, if ONLY-DIR-P is non-nil, the user can only select directories. */) ...@@ -6230,11 +6218,7 @@ Otherwise, if ONLY-DIR-P is non-nil, the user can only select directories. */)
block_input (); block_input ();
file_details->lpfnHook = file_dialog_callback; file_details->lpfnHook = file_dialog_callback;
#ifdef NTGUI_UNICODE file_opened = GUI_FN (GetOpenFileName) (file_details);
file_opened = GetOpenFileNameW (file_details);
#else /* !NTGUI_UNICODE */
file_opened = GetOpenFileNameA (file_details);
#endif /* NTGUI_UNICODE */
unblock_input (); unblock_input ();
unbind_to (count, Qnil); unbind_to (count, Qnil);
} }
...@@ -6243,11 +6227,7 @@ Otherwise, if ONLY-DIR-P is non-nil, the user can only select directories. */) ...@@ -6243,11 +6227,7 @@ Otherwise, if ONLY-DIR-P is non-nil, the user can only select directories. */)
{ {
/* Get an Emacs string from the value Windows gave us. */ /* Get an Emacs string from the value Windows gave us. */
#ifdef NTGUI_UNICODE #ifdef NTGUI_UNICODE
filename = from_unicode ( filename = from_unicode_buffer (filename_buf);
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 */ #else /* !NTGUI_UNICODE */
dostounix_filename (filename_buf, 0); dostounix_filename (filename_buf, 0);
filename = DECODE_FILE (build_string (filename_buf)); filename = DECODE_FILE (build_string (filename_buf));
...@@ -6421,20 +6401,29 @@ an integer representing a ShowWindow flag: ...@@ -6421,20 +6401,29 @@ an integer representing a ShowWindow flag:
CHECK_STRING (document); CHECK_STRING (document);
/* Encode filename, current directory and parameters. */ /* Encode filename, current directory and parameters. */
current_dir = ENCODE_FILE (BVAR (current_buffer, directory)); current_dir = BVAR (current_buffer, directory);
document = ENCODE_FILE (document);
#ifdef CYGWIN
current_dir = Fcygwin_convert_file_name_to_windows (current_dir, Qt);
if (STRINGP (document))
document = Fcygwin_convert_file_name_to_windows (document, Qt);
#endif /* CYGWIN */
current_dir = GUI_ENCODE_FILE (current_dir);
if (STRINGP (document))
document = GUI_ENCODE_FILE (document);
if (STRINGP (parameters)) if (STRINGP (parameters))
parameters = ENCODE_SYSTEM (parameters); parameters = GUI_ENCODE_SYSTEM (parameters);
if ((int) ShellExecute (NULL, if ((int) GUI_FN (ShellExecute) (NULL,
(STRINGP (operation) ? (STRINGP (operation) ?
SDATA (operation) : NULL), GUI_SDATA (operation) : NULL),
SDATA (document), GUI_SDATA (document),
(STRINGP (parameters) ? (STRINGP (parameters) ?
SDATA (parameters) : NULL), GUI_SDATA (parameters) : NULL),
SDATA (current_dir), GUI_SDATA (current_dir),
(INTEGERP (show_flag) ? (INTEGERP (show_flag) ?
XINT (show_flag) : SW_SHOWDEFAULT)) XINT (show_flag) : SW_SHOWDEFAULT))
> 32) > 32)
return Qt; return Qt;
errstr = w32_strerror (0); errstr = w32_strerror (0);
...@@ -6803,6 +6792,7 @@ The following %-sequences are provided: ...@@ -6803,6 +6792,7 @@ The following %-sequences are provided:
} }
#ifdef WINDOWSNT
DEFUN ("file-system-info", Ffile_system_info, Sfile_system_info, 1, 1, 0, DEFUN ("file-system-info", Ffile_system_info, Sfile_system_info, 1, 1, 0,
doc: /* Return storage information about the file system FILENAME is on. doc: /* Return storage information about the file system FILENAME is on.
Value is a list of floats (TOTAL FREE AVAIL), where TOTAL is the total Value is a list of floats (TOTAL FREE AVAIL), where TOTAL is the total
...@@ -6898,6 +6888,8 @@ If the underlying system call fails, value is nil. */) ...@@ -6898,6 +6888,8 @@ If the underlying system call fails, value is nil. */)
return value; return value;
} }
#endif /* WINDOWSNT */
DEFUN ("default-printer-name", Fdefault_printer_name, Sdefault_printer_name, DEFUN ("default-printer-name", Fdefault_printer_name, Sdefault_printer_name,
0, 0, 0, doc: /* Return the name of Windows default printer device. */) 0, 0, 0, doc: /* Return the name of Windows default printer device. */)
...@@ -7624,7 +7616,10 @@ only be necessary if the default setting causes problems. */); ...@@ -7624,7 +7616,10 @@ only be necessary if the default setting causes problems. */);
defsubr (&Sw32_window_exists_p); defsubr (&Sw32_window_exists_p);
defsubr (&Sw32_battery_status); defsubr (&Sw32_battery_status);
#ifdef WINDOWSNT
defsubr (&Sfile_system_info); defsubr (&Sfile_system_info);
#endif
defsubr (&Sdefault_printer_name); defsubr (&Sdefault_printer_name);
defsubr (&Sset_message_beep); defsubr (&Sset_message_beep);
...@@ -7805,3 +7800,15 @@ emacs_abort (void) ...@@ -7805,3 +7800,15 @@ emacs_abort (void)
} }
} }
} }
#ifdef NTGUI_UNICODE
Lisp_Object
ntgui_encode_system (Lisp_Object str)
{
Lisp_Object encoded;
to_unicode (str, &encoded);
return encoded;
}
#endif /* NTGUI_UNICODE */
...@@ -3161,7 +3161,7 @@ construct_drag_n_drop (struct input_event *result, W32Msg *msg, struct frame *f) ...@@ -3161,7 +3161,7 @@ construct_drag_n_drop (struct input_event *result, W32Msg *msg, struct frame *f)
HDROP hdrop; HDROP hdrop;
POINT p; POINT p;
WORD num_files; WORD num_files;
char *name; guichar_t *name;
int i, len; int i, len;
result->kind = DRAG_N_DROP_EVENT; result->kind = DRAG_N_DROP_EVENT;
...@@ -3186,12 +3186,17 @@ construct_drag_n_drop (struct input_event *result, W32Msg *msg, struct frame *f) ...@@ -3186,12 +3186,17 @@ construct_drag_n_drop (struct input_event *result, W32Msg *msg, struct frame *f)
for (i = 0; i < num_files; i++) for (i = 0; i < num_files; i++)
{ {
len = DragQueryFile (hdrop, i, NULL, 0); len = GUI_FN (DragQueryFile) (hdrop, i, NULL, 0);
if (len <= 0) if (len <= 0)
continue; continue;
name = alloca (len + 1);
DragQueryFile (hdrop, i, name, len + 1); name = alloca ((len + 1) * sizeof (*name));
GUI_FN (DragQueryFile) (hdrop, i, name, len + 1);
#ifdef NTGUI_UNICODE
files = Fcons (from_unicode_buffer (name), files);
#else
files = Fcons (DECODE_FILE (build_string (name)), files); files = Fcons (DECODE_FILE (build_string (name)), files);
#endif /* NTGUI_UNICODE */
} }
DragFinish (hdrop); DragFinish (hdrop);
......
...@@ -761,6 +761,23 @@ extern const char* ...@@ -761,6 +761,23 @@ extern const char*
w32_name_of_message (UINT msg); w32_name_of_message (UINT msg);
#endif /* EMACSDEBUG */ #endif /* EMACSDEBUG */
#ifdef NTGUI_UNICODE
extern Lisp_Object ntgui_encode_system (Lisp_Object str);
#define GUISTR(x) (L ## x)
#define GUI_ENCODE_FILE GUI_ENCODE_SYSTEM
#define GUI_ENCODE_SYSTEM(x) ntgui_encode_system (x)
#define GUI_FN(fn) fn ## W
typedef wchar_t guichar_t;
#else /* !NTGUI_UNICODE */
#define GUISTR(x) x
#define GUI_ENCODE_FILE ENCODE_FILE
#define GUI_ENCODE_SYSTEM ENCODE_SYSTEM
#define GUI_FN(fn) fn
typedef char guichar_t;
#endif /* NTGUI_UNICODE */
#define GUI_SDATA(x) ((guichar_t*) SDATA (x))
extern void syms_of_w32term (void); extern void syms_of_w32term (void);
extern void syms_of_w32menu (void); extern void syms_of_w32menu (void);
extern void syms_of_w32fns (void); extern void syms_of_w32fns (void);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment