* lisp/files.el (write-file): Do not display confirm dialog for NS,
it does its own dialog, which can't be cancelled. * src/nsfns.m: Remove panelOK. (ns_fd_data): New. (ns_run_file_dialog): New function. (Fns_read_file_name): Fill in ns_fd_data, post an event and start the event loop, so file dialog is popped up by ns_run_file_dialog, called by sendEvent (Bug#14578). (EmacsSavePanel, EmacsOpenPanel): Remove ok and cancel methods. * src/nsterm.h (NSSavePanel): Update comment. (NSAPP_DATA2_RUNFILEDIALOG): Define. (ns_run_file_dialog): Declare. * src/nsterm.m (sendEvent:): Handle NSAPP_DATA2_RUNFILEDIALOG.
This commit is contained in:
parent
23de972aa7
commit
1afb1d0715
6 changed files with 105 additions and 68 deletions
|
@ -1,3 +1,8 @@
|
|||
2013-07-06 Jan Djärv <jan.h.d@swipnet.se>
|
||||
|
||||
* files.el (write-file): Do not display confirm dialog for NS,
|
||||
it does its own dialog, which can't be cancelled (Bug#14578).
|
||||
|
||||
2013-07-06 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
* simple.el (line-move-partial): Adjust the row returned by
|
||||
|
|
|
@ -3878,6 +3878,10 @@ Interactively, confirmation is required unless you supply a prefix argument."
|
|||
(or buffer-file-name (buffer-name))))))
|
||||
(and confirm
|
||||
(file-exists-p filename)
|
||||
;; NS does its own confirm dialog.
|
||||
(not (and (eq (framep-on-display) 'ns)
|
||||
(listp last-nonmenu-event)
|
||||
use-dialog-box))
|
||||
(or (y-or-n-p (format "File `%s' exists; overwrite? " filename))
|
||||
(error "Canceled")))
|
||||
(set-visited-file-name filename (not confirm))))
|
||||
|
|
|
@ -1,3 +1,19 @@
|
|||
2013-07-06 Jan Djärv <jan.h.d@swipnet.se>
|
||||
|
||||
* nsterm.m (sendEvent:): Handle NSAPP_DATA2_RUNFILEDIALOG.
|
||||
|
||||
* nsterm.h (NSSavePanel): Update comment.
|
||||
(NSAPP_DATA2_RUNFILEDIALOG): Define.
|
||||
(ns_run_file_dialog): Declare.
|
||||
|
||||
* nsfns.m: Remove panelOK.
|
||||
(ns_fd_data): New.
|
||||
(ns_run_file_dialog): New function.
|
||||
(Fns_read_file_name): Fill in ns_fd_data, post an event and start the
|
||||
event loop, so file dialog is popped up by ns_run_file_dialog, called
|
||||
by sendEvent (Bug#14578).
|
||||
(EmacsSavePanel, EmacsOpenPanel): Remove ok and cancel methods.
|
||||
|
||||
2013-07-06 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
* xdisp.c (default_line_pixel_height): New function.
|
||||
|
|
121
src/nsfns.m
121
src/nsfns.m
|
@ -89,9 +89,6 @@ Updated by Christian Limpach (chris@nice.ch)
|
|||
Lisp_Object Qbuffered;
|
||||
Lisp_Object Qfontsize;
|
||||
|
||||
/* hack for OS X file panels */
|
||||
char panelOK = 0;
|
||||
|
||||
EmacsTooltip *ns_tooltip = nil;
|
||||
|
||||
/* Need forward declaration here to preserve organizational integrity of file */
|
||||
|
@ -1396,6 +1393,41 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side
|
|||
return Qnil;
|
||||
}
|
||||
|
||||
static struct
|
||||
{
|
||||
id panel;
|
||||
BOOL ret;
|
||||
#if ! defined (NS_IMPL_COCOA) || \
|
||||
MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6
|
||||
NSString *dirS, *initS;
|
||||
BOOL no_types;
|
||||
#endif
|
||||
} ns_fd_data;
|
||||
|
||||
void
|
||||
ns_run_file_dialog (void)
|
||||
{
|
||||
if (ns_fd_data.panel == nil) return;
|
||||
#if defined (NS_IMPL_COCOA) && \
|
||||
MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
|
||||
ns_fd_data.ret = [ns_fd_data.panel runModal];
|
||||
#else
|
||||
if (ns_fd_data.no_types)
|
||||
{
|
||||
ns_fd_data.ret = [ns_fd_data.panel
|
||||
runModalForDirectory: ns_fd_data.dirS
|
||||
file: ns_fd_data.initS];
|
||||
}
|
||||
else
|
||||
{
|
||||
ns_fd_data.ret = [ns_fd_data.panel
|
||||
runModalForDirectory: ns_fd_data.dirS
|
||||
file: ns_fd_data.initS
|
||||
types: nil];
|
||||
}
|
||||
#endif
|
||||
ns_fd_data.panel = nil;
|
||||
}
|
||||
|
||||
DEFUN ("ns-read-file-name", Fns_read_file_name, Sns_read_file_name, 1, 5, 0,
|
||||
doc: /* Use a graphical panel to read a file name, using prompt PROMPT.
|
||||
|
@ -1420,6 +1452,7 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side
|
|||
[NSString stringWithUTF8String: SSDATA (dir)];
|
||||
NSString *initS = NILP (init) || !STRINGP (init) ? nil :
|
||||
[NSString stringWithUTF8String: SSDATA (init)];
|
||||
NSEvent *nxev;
|
||||
|
||||
check_window_system (NULL);
|
||||
|
||||
|
@ -1440,7 +1473,6 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side
|
|||
[panel setTreatsFilePackagesAsDirectories: YES];
|
||||
[panel setDelegate: fileDelegate];
|
||||
|
||||
panelOK = 0;
|
||||
if (! NILP (dir_only_p))
|
||||
{
|
||||
[panel setCanChooseDirectories: YES];
|
||||
|
@ -1454,7 +1486,9 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side
|
|||
[panel setCanChooseFiles: YES];
|
||||
}
|
||||
|
||||
block_input ();
|
||||
block_input ();
|
||||
ns_fd_data.panel = panel;
|
||||
ns_fd_data.ret = NO;
|
||||
#if defined (NS_IMPL_COCOA) && \
|
||||
MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
|
||||
if (! NILP (mustmatch) || ! NILP (dir_only_p))
|
||||
|
@ -1465,19 +1499,32 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side
|
|||
else
|
||||
[panel setNameFieldStringValue: @""];
|
||||
|
||||
ret = [panel runModal];
|
||||
#else
|
||||
if (NILP (mustmatch) && NILP (dir_only_p))
|
||||
{
|
||||
ret = [panel runModalForDirectory: dirS file: initS];
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = [panel runModalForDirectory: dirS file: initS types: nil];
|
||||
}
|
||||
ns_fd_data.no_types = NILP (mustmatch) && NILP (dir_only_p);
|
||||
ns_fd_data.dirS = dirS;
|
||||
ns_fd_data.initS = initS;
|
||||
#endif
|
||||
|
||||
ret = (ret == NSOKButton) || panelOK;
|
||||
/* runModalForDirectory/runModal restarts the main event loop when done,
|
||||
so we must start an event loop and then pop up the file dialog.
|
||||
The file dialog may pop up a confirm dialog after Ok has been pressed,
|
||||
so we can not simply pop down on the Ok/Cancel press.
|
||||
*/
|
||||
nxev = [NSEvent otherEventWithType: NSApplicationDefined
|
||||
location: NSMakePoint (0, 0)
|
||||
modifierFlags: 0
|
||||
timestamp: 0
|
||||
windowNumber: [[NSApp mainWindow] windowNumber]
|
||||
context: [NSApp context]
|
||||
subtype: 0
|
||||
data1: 0
|
||||
data2: NSAPP_DATA2_RUNFILEDIALOG];
|
||||
|
||||
[NSApp postEvent: nxev atStart: NO];
|
||||
while (ns_fd_data.panel != nil)
|
||||
[NSApp run];
|
||||
|
||||
ret = (ns_fd_data.ret == NSOKButton);
|
||||
|
||||
if (ret)
|
||||
{
|
||||
|
@ -2755,25 +2802,6 @@ DY added (default is -10).
|
|||
}
|
||||
|
||||
@implementation EmacsSavePanel
|
||||
#ifdef NS_IMPL_COCOA
|
||||
/* --------------------------------------------------------------------------
|
||||
These are overridden to intercept on OS X: ending panel restarts NSApp
|
||||
event loop if it is stopped. Not sure if this is correct behavior,
|
||||
perhaps should check if running and if so send an appdefined.
|
||||
-------------------------------------------------------------------------- */
|
||||
- (void) ok: (id)sender
|
||||
{
|
||||
[super ok: sender];
|
||||
panelOK = 1;
|
||||
[NSApp stop: self];
|
||||
}
|
||||
- (void) cancel: (id)sender
|
||||
{
|
||||
[super cancel: sender];
|
||||
[NSApp stop: self];
|
||||
}
|
||||
#endif
|
||||
|
||||
- (BOOL)performKeyEquivalent:(NSEvent *)theEvent
|
||||
{
|
||||
BOOL ret = handlePanelKeys (self, theEvent);
|
||||
|
@ -2785,31 +2813,6 @@ - (BOOL)performKeyEquivalent:(NSEvent *)theEvent
|
|||
|
||||
|
||||
@implementation EmacsOpenPanel
|
||||
#ifdef NS_IMPL_COCOA
|
||||
/* --------------------------------------------------------------------------
|
||||
These are overridden to intercept on OS X: ending panel restarts NSApp
|
||||
event loop if it is stopped. Not sure if this is correct behavior,
|
||||
perhaps should check if running and if so send an appdefined.
|
||||
-------------------------------------------------------------------------- */
|
||||
- (void) ok: (id)sender
|
||||
{
|
||||
[super ok: sender];
|
||||
|
||||
// If not choosing directories, and Open is pressed on a directory, return.
|
||||
if (! [self canChooseDirectories] && ns_directory_from_panel (self) &&
|
||||
! ns_filename_from_panel (self))
|
||||
return;
|
||||
|
||||
panelOK = 1;
|
||||
[NSApp stop: self];
|
||||
}
|
||||
- (void) cancel: (id)sender
|
||||
{
|
||||
[super cancel: sender];
|
||||
[NSApp stop: self];
|
||||
}
|
||||
|
||||
#endif
|
||||
- (BOOL)performKeyEquivalent:(NSEvent *)theEvent
|
||||
{
|
||||
// NSOpenPanel inherits NSSavePanel, so passing self is OK.
|
||||
|
|
|
@ -286,8 +286,7 @@ typedef float EmacsCGFloat;
|
|||
/* ==========================================================================
|
||||
|
||||
File open/save panels
|
||||
This and next override methods to work around OS X behavior of
|
||||
restarting application loop when user dismisses panel.
|
||||
This and next override methods to handle keyboard input in panels.
|
||||
|
||||
========================================================================== */
|
||||
|
||||
|
@ -838,6 +837,9 @@ extern Lisp_Object ns_popup_dialog (Lisp_Object position, Lisp_Object contents,
|
|||
#define NSAPP_DATA2_RUNASSCRIPT 10
|
||||
extern void ns_run_ascript (void);
|
||||
|
||||
#define NSAPP_DATA2_RUNFILEDIALOG 11
|
||||
extern void ns_run_file_dialog (void);
|
||||
|
||||
extern const char *ns_etc_directory (void);
|
||||
extern const char *ns_exec_path (void);
|
||||
extern const char *ns_load_path (void);
|
||||
|
|
21
src/nsterm.m
21
src/nsterm.m
|
@ -4419,15 +4419,22 @@ - (void)sendEvent: (NSEvent *)theEvent
|
|||
/* NSTRACE (sendEvent); */
|
||||
/*fprintf (stderr, "received event of type %d\t%d\n", type);*/
|
||||
|
||||
#ifdef NS_IMPL_COCOA
|
||||
if (type == NSApplicationDefined
|
||||
&& [theEvent data2] == NSAPP_DATA2_RUNASSCRIPT)
|
||||
if (type == NSApplicationDefined)
|
||||
{
|
||||
ns_run_ascript ();
|
||||
[self stop: self];
|
||||
return;
|
||||
}
|
||||
switch ([theEvent data2])
|
||||
{
|
||||
#ifdef NS_IMPL_COCOA
|
||||
case NSAPP_DATA2_RUNASSCRIPT:
|
||||
ns_run_ascript ();
|
||||
[self stop: self];
|
||||
return;
|
||||
#endif
|
||||
case NSAPP_DATA2_RUNFILEDIALOG:
|
||||
ns_run_file_dialog ();
|
||||
[self stop: self];
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (type == NSCursorUpdate && window == nil)
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue