#include <stdio.h>
#include <errno.h>
+#include <time.h>
#include <utime.h>
#include <dirent.h>
#include <sys/types.h>
#undef realloc
#undef init_process
#include <Carbon/Carbon.h>
+#undef mktime
+#define mktime emacs_mktime
#undef free
#define free unexec_free
#undef malloc
#include "process.h"
#include "sysselect.h"
#include "systime.h"
+#include "blockinput.h"
Lisp_Object QCLIPBOARD;
return 1;
}
+#if TARGET_API_MAC_CARBON
+CFStringRef
+cfstring_create_with_utf8_cstring (c_str)
+ const char *c_str;
+{
+ CFStringRef str;
+
+ str = CFStringCreateWithCString (NULL, c_str, kCFStringEncodingUTF8);
+ if (str == NULL)
+ /* Failed to interpret as UTF 8. Fall back on Mac Roman. */
+ str = CFStringCreateWithCString (NULL, c_str, kCFStringEncodingMacRoman);
+
+ return str;
+}
+#endif
+
#ifndef MAC_OSX
/* The following functions with "sys_" prefix are stubs to Unix
CHECK_STRING (script);
+ BLOCK_INPUT;
status = do_applescript (SDATA (script), &result);
+ UNBLOCK_INPUT;
if (status)
{
if (!result)
()
{
#if TARGET_API_MAC_CARBON
+ OSStatus err;
ScrapRef scrap;
ScrapFlavorFlags sff;
Size s;
int i;
char *data;
- if (GetCurrentScrap (&scrap) != noErr)
- return Qnil;
-
- if (GetScrapFlavorFlags (scrap, kScrapFlavorTypeText, &sff) != noErr)
- return Qnil;
-
- if (GetScrapFlavorSize (scrap, kScrapFlavorTypeText, &s) != noErr)
- return Qnil;
-
- if ((data = (char*) alloca (s)) == NULL)
- return Qnil;
-
- if (GetScrapFlavorData (scrap, kScrapFlavorTypeText, &s, data) != noErr
- || s == 0)
+ BLOCK_INPUT;
+ err = GetCurrentScrap (&scrap);
+ if (err == noErr)
+ err = GetScrapFlavorFlags (scrap, kScrapFlavorTypeText, &sff);
+ if (err == noErr)
+ err = GetScrapFlavorSize (scrap, kScrapFlavorTypeText, &s);
+ if (err == noErr && (data = (char*) alloca (s)))
+ err = GetScrapFlavorData (scrap, kScrapFlavorTypeText, &s, data);
+ UNBLOCK_INPUT;
+ if (err != noErr || s == 0)
return Qnil;
/* Emacs expects clipboard contents have Unix-style eol's */
#if TARGET_API_MAC_CARBON
{
ScrapRef scrap;
+
+ BLOCK_INPUT;
ClearCurrentScrap ();
if (GetCurrentScrap (&scrap) != noErr)
- error ("cannot get current scrap");
+ {
+ UNBLOCK_INPUT;
+ error ("cannot get current scrap");
+ }
if (PutScrapFlavor (scrap, kScrapFlavorTypeText, kScrapFlavorMaskNone, len,
buf) != noErr)
- error ("cannot put to scrap");
+ {
+ UNBLOCK_INPUT;
+ error ("cannot put to scrap");
+ }
+ UNBLOCK_INPUT;
}
#else /* not TARGET_API_MAC_CARBON */
ZeroScrap ();
ScrapRef scrap;
ScrapFlavorFlags sff;
+ BLOCK_INPUT;
if (GetCurrentScrap (&scrap) == noErr)
if (GetScrapFlavorFlags (scrap, kScrapFlavorTypeText, &sff) == noErr)
val = Qt;
+ UNBLOCK_INPUT;
#else /* not TARGET_API_MAC_CARBON */
Handle my_handle;
long rc, scrap_offset;
the system call SELECT corrects this discrepancy. */
int
sys_select (n, rfds, wfds, efds, timeout)
- int n;
- SELECT_TYPE *rfds;
- SELECT_TYPE *wfds;
- SELECT_TYPE *efds;
- struct timeval *timeout;
+ int n;
+ SELECT_TYPE *rfds;
+ SELECT_TYPE *wfds;
+ SELECT_TYPE *efds;
+ struct timeval *timeout;
{
+ OSErr err;
+ EMACS_TIME end_time, now, remaining_time;
+
if (inhibit_window_system || noninteractive
|| rfds == NULL || !FD_ISSET (0, rfds))
- return select(n, rfds, wfds, efds, timeout);
- else
- {
- EMACS_TIME end_time, now;
-
- EMACS_GET_TIME (end_time);
- if (timeout)
- EMACS_ADD_TIME (end_time, end_time, *timeout);
-
- do
- {
- EMACS_TIME select_timeout
- SELECT_TYPE orfds = *rfds;
- int r;
- OSErr err;
-
- EMACS_SET_SECS (select_timeout, 0);
- EMACS_SET_USECS (select_timeout, 100);
-
- if (timeout && EMACS_TIME_LT (*timeout, select_timeout))
- select_timeout = *timeout;
-
- r = select (n, &orfds, wfds, efds, &select_timeout);
- err = ReceiveNextEvent (0, NULL, kEventDurationNoWait, false, NULL);
- if (r > 0)
- {
- *rfds = orfds;
- if (err == noErr)
- {
- FD_SET (0, rfds);
- r++;
- }
- return r;
- }
- else if (err == noErr)
+ return select (n, rfds, wfds, efds, timeout);
+
+ if (wfds == NULL && efds == NULL)
+ {
+ int i;
+
+ for (i = 1; i < n; i++)
+ if (FD_ISSET (i, rfds))
+ break;
+ if (i == n)
+ {
+ EventTimeout timeout_sec =
+ (timeout
+ ? (EMACS_SECS (*timeout) * kEventDurationSecond
+ + EMACS_USECS (*timeout) * kEventDurationMicrosecond)
+ : kEventDurationForever);
+
+ BLOCK_INPUT;
+ err = ReceiveNextEvent (0, NULL, timeout_sec,
+ kEventLeaveInQueue, NULL);
+ UNBLOCK_INPUT;
+ if (err == noErr)
{
FD_ZERO (rfds);
FD_SET (0, rfds);
return 1;
}
-
- EMACS_GET_TIME (now);
- EMACS_SUB_TIME (now, end_time, now);
+ else
+ return 0;
}
- while (!timeout || !EMACS_TIME_NEG_P (now));
+ }
- return 0;
+ if (timeout)
+ {
+ remaining_time = *timeout;
+ EMACS_GET_TIME (now);
+ EMACS_ADD_TIME (end_time, now, remaining_time);
}
-}
+ FD_CLR (0, rfds);
+ do
+ {
+ EMACS_TIME select_timeout;
+ SELECT_TYPE orfds = *rfds;
+ int r;
-#undef read
-int sys_read (fds, buf, nbyte)
- int fds;
- char *buf;
- unsigned int nbyte;
-{
- SELECT_TYPE rfds;
- EMACS_TIME one_second;
- int r;
-
- /* Use select to block on IO while still checking for quit_char */
- if (!inhibit_window_system && !noninteractive &&
- ! (fcntl(fds, F_GETFL, 0) & O_NONBLOCK))
- {
- FD_ZERO (&rfds);
- FD_SET (fds, &rfds);
- if (sys_select (fds+1, &rfds, 0, 0, NULL) < 0)
- return -1;
+ EMACS_SET_SECS_USECS (select_timeout, 0, 20000);
+
+ if (timeout && EMACS_TIME_LT (remaining_time, select_timeout))
+ select_timeout = remaining_time;
+
+ r = select (n, &orfds, wfds, efds, &select_timeout);
+ BLOCK_INPUT;
+ err = ReceiveNextEvent (0, NULL, kEventDurationNoWait,
+ kEventLeaveInQueue, NULL);
+ UNBLOCK_INPUT;
+ if (r > 0)
+ {
+ *rfds = orfds;
+ if (err == noErr)
+ {
+ FD_SET (0, rfds);
+ r++;
+ }
+ return r;
+ }
+ else if (err == noErr)
+ {
+ FD_ZERO (rfds);
+ FD_SET (0, rfds);
+ return 1;
+ }
+
+ if (timeout)
+ {
+ EMACS_GET_TIME (now);
+ EMACS_SUB_TIME (remaining_time, end_time, now);
+ }
}
+ while (!timeout || EMACS_TIME_LT (now, end_time));
- return read (fds, buf, nbyte);
+ return 0;
}
-
/* Set up environment variables so that Emacs can correctly find its
support files when packaged as an application bundle. Directories
placed in /usr/local/share/emacs/<emacs-version>/, /usr/local/bin,