Fix expansion and encoding of sound file names on MS-Windows.
src/sound.c (Fplay_sound_internal): Encode the sound file name in the ANSI codepage. Expand it against data-directory, as per docs, not against the current directory. No need to make a local copy of the file name; pass the encoded file name directly to do_play_sound. (Bug#18463) src/w32.c (ansi_encode_filename): If w32_get_short_filename returns NULL, and the file name is not encodable in ANSI codepage, return the string with "?" replacement characters, which will fail the caller. This avoids returning a random value in that case.
This commit is contained in:
parent
e868e853a8
commit
a6cc335aef
3 changed files with 25 additions and 8 deletions
|
@ -1,3 +1,16 @@
|
|||
2014-09-13 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
* sound.c (Fplay_sound_internal): Encode the sound file name in
|
||||
the ANSI codepage. Expand it against data-directory, as per docs,
|
||||
not against the current directory. No need to make a local copy
|
||||
of the file name; pass the encoded file name directly to
|
||||
do_play_sound. (Bug#18463)
|
||||
|
||||
* w32.c (ansi_encode_filename): If w32_get_short_filename returns
|
||||
NULL, and the file name is not encodable in ANSI codepage, return
|
||||
the string with "?" replacement characters, which will fail the
|
||||
caller. This avoids returning a random value in that case.
|
||||
|
||||
2014-09-11 Martin Rudalics <rudalics@gmx.at>
|
||||
|
||||
* window.c (Fresize_mini_window_internal): Set w->total_lines
|
||||
|
|
18
src/sound.c
18
src/sound.c
|
@ -88,6 +88,9 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
#include <limits.h>
|
||||
#include <windows.h>
|
||||
#include <mmsystem.h>
|
||||
|
||||
#include "coding.h"
|
||||
#include "w32.h"
|
||||
/* END: Windows Specific Includes */
|
||||
|
||||
#endif /* WINDOWSNT */
|
||||
|
@ -1309,9 +1312,7 @@ Internal use only, use `play-sound' instead. */)
|
|||
struct gcpro gcpro1, gcpro2;
|
||||
Lisp_Object args[2];
|
||||
#else /* WINDOWSNT */
|
||||
int len = 0;
|
||||
Lisp_Object lo_file = {0};
|
||||
char * psz_file = NULL;
|
||||
Lisp_Object lo_file;
|
||||
unsigned long ui_volume_tmp = UINT_MAX;
|
||||
unsigned long ui_volume = UINT_MAX;
|
||||
#endif /* WINDOWSNT */
|
||||
|
@ -1383,10 +1384,11 @@ Internal use only, use `play-sound' instead. */)
|
|||
|
||||
#else /* WINDOWSNT */
|
||||
|
||||
lo_file = Fexpand_file_name (attrs[SOUND_FILE], Qnil);
|
||||
len = XSTRING (lo_file)->size;
|
||||
psz_file = alloca (len + 1);
|
||||
strcpy (psz_file, XSTRING (lo_file)->data);
|
||||
lo_file = Fexpand_file_name (attrs[SOUND_FILE], Vdata_directory);
|
||||
lo_file = ENCODE_FILE (lo_file);
|
||||
/* Since UNICOWS.DLL includes only a stub for mciSendStringW, we
|
||||
need to encode the file in the ANSI codepage. */
|
||||
lo_file = ansi_encode_filename (lo_file);
|
||||
if (INTEGERP (attrs[SOUND_VOLUME]))
|
||||
{
|
||||
ui_volume_tmp = XFASTINT (attrs[SOUND_VOLUME]);
|
||||
|
@ -1408,7 +1410,7 @@ Internal use only, use `play-sound' instead. */)
|
|||
{
|
||||
ui_volume = ui_volume_tmp * (UINT_MAX / 100);
|
||||
}
|
||||
do_play_sound (psz_file, ui_volume);
|
||||
do_play_sound (SDATA (lo_file), ui_volume);
|
||||
|
||||
#endif /* WINDOWSNT */
|
||||
|
||||
|
|
|
@ -2387,6 +2387,8 @@ ansi_encode_filename (Lisp_Object filename)
|
|||
dostounix_filename (shortname);
|
||||
encoded_filename = build_string (shortname);
|
||||
}
|
||||
else
|
||||
encoded_filename = build_unibyte_string (fname);
|
||||
}
|
||||
else
|
||||
encoded_filename = build_unibyte_string (fname);
|
||||
|
|
Loading…
Add table
Reference in a new issue