Mercurial > emacs
view src/w32select.c @ 15154:bcc66f4bc5ff
Include string.h.
(HAVE_FREXP, HAVE_FMOD): Macros removed.
(struct timeval, struct timezone, gettimeofday): Declarations removed.
(HAVE_SOCKETS, MAIL_USE_POP, MAIL_USE_SYSTEM_LOCK): Macros defined.
(DIRECTORY_SEP): Use Vdirectory_sep_char.
(EXEC_SUFFIXES): Add .cmd to list of suffixes.
(EXEC_SUFFIXES): Add .cmd to list of suffixes.
> (HAVE_SYS_TIMEB_H, HAVE_SYS_TIME_H, HAVE_UNISTD_H, STDC_HEADERS,
TIME_WITH_SYS_TIME, HAVE_GETTIMEOFDAY, HAVE_CLOSEDIR,
HAVE_LONG_FILE_NAMES, HAVE_BCOPY, HAVE_BCMP, HAVE_LOGB, HAVE_FREXP,
HAVE_FMOD, HAVE_FTIME, HAVE_MKTIME, HAVE_H_ERRNO): New macros.
(access, chdir, chmod, close, creat, ctime, dup, dup2, fopen,
link, mkdir, mktemp, open, pipe, read, rename, rmdir, select,
sleep, unlink, write, spawnve, wait, kill, signal):
Macros redefined from win32_* to sys_*.
[__STDC__]: Define when including direct.h, io.h, stdio.h.
(struct nt_stat): Definition removed.
(stat, st_dev, st_ino, st_mode, st_nlink, st_uid, st_gid,
st_rdev, st_size, st_atime, st_mtime, st_ctime): Macros undefined.
author | Geoff Voelker <voelker@cs.washington.edu> |
---|---|
date | Fri, 03 May 1996 18:50:05 +0000 |
parents | e37489592e27 |
children | 440d937a60f7 |
line wrap: on
line source
/* Win32 Selection processing for emacs Copyright (C) 1993, 1994 Free Software Foundation. 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 2, 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; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Written by Kevin Gallo */ #include <config.h> #include "lisp.h" #include "w32term.h" /* for all of the win32 includes */ #include "dispextern.h" /* frame.h seems to want this */ #include "frame.h" /* Need this to get the X window of selected_frame */ #include "blockinput.h" #if 0 DEFUN ("win32-open-clipboard", Fwin32_open_clipboard, Swin32_open_clipboard, 0, 1, 0, "This opens the clipboard with the given frame pointer.") (frame) Lisp_Object frame; { BOOL ok = FALSE; if (!NILP (frame)) CHECK_LIVE_FRAME (frame, 0); BLOCK_INPUT; ok = OpenClipboard ((!NILP (frame) && FRAME_WIN32_P (XFRAME (frame))) ? FRAME_WIN32_WINDOW (XFRAME (frame)) : NULL); UNBLOCK_INPUT; return (ok ? frame : Qnil); } DEFUN ("win32-empty-clipboard", Fwin32_empty_clipboard, Swin32_empty_clipboard, 0, 0, 0, "This empties the clipboard and assigns ownership to the window which opened the clipboard.") () { BOOL ok = FALSE; BLOCK_INPUT; ok = EmptyClipboard (); UNBLOCK_INPUT; return (ok ? Qt : Qnil); } DEFUN ("win32-close-clipboard", Fwin32_close_clipboard, Swin32_close_clipboard, 0, 0, 0, "This closes the clipboard.") () { BOOL ok = FALSE; BLOCK_INPUT; ok = CloseClipboard (); UNBLOCK_INPUT; return (ok ? Qt : Qnil); } #endif DEFUN ("win32-set-clipboard-data", Fwin32_set_clipboard_data, Swin32_set_clipboard_data, 1, 2, 0, "This sets the clipboard data to the given text.") (string, frame) Lisp_Object string, frame; { BOOL ok = TRUE; HANDLE htext; int nbytes; int truelen; unsigned char *src; unsigned char *dst; CHECK_STRING (string, 0); if (!NILP (frame)) CHECK_LIVE_FRAME (frame, 0); BLOCK_INPUT; nbytes = XSTRING (string)->size + 1; src = XSTRING (string)->data; /* need to know final size after '\r' chars are inserted (the standard CF_TEXT clipboard format uses CRLF line endings, while Emacs uses just LF internally) */ truelen = nbytes; dst = src; /* avoid using strchr because it recomputes the length everytime */ while ((dst = memchr (dst, '\n', nbytes - (dst - src))) != NULL) { truelen++; dst++; } if ((htext = GlobalAlloc (GMEM_MOVEABLE | GMEM_DDESHARE, truelen)) == NULL) goto error; if ((dst = (unsigned char *) GlobalLock (htext)) == NULL) goto error; /* convert to CRLF line endings expected by clipboard */ while (1) { unsigned char *next; /* copy next line or remaining bytes including '\0' */ next = _memccpy (dst, src, '\n', nbytes); if (next) { /* copied one line ending with '\n' */ int copied = next - dst; nbytes -= copied; src += copied; /* insert '\r' before '\n' */ next[-1] = '\r'; next[0] = '\n'; dst = next + 1; } else /* copied remaining partial line -> now finished */ break; } GlobalUnlock (htext); if (!OpenClipboard ((!NILP (frame) && FRAME_WIN32_P (XFRAME (frame))) ? FRAME_WIN32_WINDOW (XFRAME (frame)) : NULL)) goto error; ok = EmptyClipboard () && SetClipboardData (CF_TEXT, htext); CloseClipboard (); if (ok) goto done; error: ok = FALSE; if (htext) GlobalFree (htext); done: UNBLOCK_INPUT; return (ok ? string : Qnil); } DEFUN ("win32-get-clipboard-data", Fwin32_get_clipboard_data, Swin32_get_clipboard_data, 0, 1, 0, "This gets the clipboard data in text format.") (frame) Lisp_Object frame; { HANDLE htext; Lisp_Object ret = Qnil; if (!NILP (frame)) CHECK_LIVE_FRAME (frame, 0); BLOCK_INPUT; if (!OpenClipboard ((!NILP (frame) && FRAME_WIN32_P (XFRAME (frame))) ? FRAME_WIN32_WINDOW (XFRAME (frame)) : NULL)) goto done; if ((htext = GetClipboardData (CF_TEXT)) == NULL) goto closeclip; { unsigned char *src; unsigned char *dst; int nbytes; int truelen; if ((src = (unsigned char *) GlobalLock (htext)) == NULL) goto closeclip; nbytes = strlen (src); /* need to know final size after '\r' chars are removed because we can't change the string size manually, and doing an extra copy is silly */ truelen = nbytes; dst = src; /* avoid using strchr because it recomputes the length everytime */ while ((dst = memchr (dst, '\r', nbytes - (dst - src))) != NULL) { truelen--; dst++; } ret = make_uninit_string (truelen); /* convert CRLF line endings (the standard CF_TEXT clipboard format) to LF endings as used internally by Emacs */ dst = XSTRING (ret)->data; while (1) { unsigned char *next; /* copy next line or remaining bytes excluding '\0' */ next = _memccpy (dst, src, '\r', nbytes); if (next) { /* copied one line ending with '\r' */ int copied = next - dst; nbytes -= copied; dst += copied - 1; /* overwrite '\r' */ src += copied; } else /* copied remaining partial line -> now finished */ break; } GlobalUnlock (htext); } closeclip: CloseClipboard (); done: UNBLOCK_INPUT; return (ret); } void syms_of_win32select () { #if 0 defsubr (&Swin32_open_clipboard); defsubr (&Swin32_empty_clipboard); defsubr (&Swin32_close_clipboard); #endif defsubr (&Swin32_set_clipboard_data); defsubr (&Swin32_get_clipboard_data); }