]> git.eshelyaron.com Git - emacs.git/commitdiff
* nsfns.m (handlePanelKeys): New function.
authorJan Djärv <jan.h.d@swipnet.se>
Sun, 28 Apr 2013 09:55:20 +0000 (11:55 +0200)
committerJan Djärv <jan.h.d@swipnet.se>
Sun, 28 Apr 2013 09:55:20 +0000 (11:55 +0200)
(EmacsOpenPanel:performKeyEquivalent:)
(EmacsSavePanel:performKeyEquivalent:): Call handlePanelKeys to handle
arrows/function/control and copy/paste keys.

Fixes: debbugs:14296
src/ChangeLog
src/nsfns.m

index c9d458c3479b5c15035e8d0601f877f98294ca79..84aa50f7047ccf7e9671e6f888ac61d1bc506592 100644 (file)
@@ -1,3 +1,10 @@
+2013-04-28  Jan Djärv  <jan.h.d@swipnet.se>
+
+       * nsfns.m (handlePanelKeys): New function.
+       (EmacsOpenPanel:performKeyEquivalent:)
+       (EmacsSavePanel:performKeyEquivalent:): Call handlePanelKeys to handle
+       arrows/function/control and copy/paste keys (Bug#14296).
+
 2013-04-27  Juri Linkov  <juri@jurta.org>
 
        * callint.c (Fcall_interactively): Call `Qread_number' for
index a483f847decd915bd7178d022b5f705364fc8dc8..0d6d0e72835bdba4e2251708badaf757aaa72106 100644 (file)
@@ -1477,7 +1477,7 @@ Optional arg DIR_ONLY_P, if non-nil, means choose only directories.  */)
       [panel setCanChooseFiles: YES];
     }
 
 block_input ();
+ block_input ();
 #if defined (NS_IMPL_COCOA) && \
   MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
   if (! NILP (mustmatch) || ! NILP (dir_only_p))
@@ -2544,6 +2544,75 @@ Value is t if tooltip was open, nil otherwise.  */)
 
    ========================================================================== */
 
+/*
+  Handle arrow/function/control keys and copy/paste/cut in file dialogs.
+  Return YES if handeled, NO if not.
+ */
+static BOOL
+handlePanelKeys (NSSavePanel *panel, NSEvent *theEvent)
+{
+  NSString *s;
+  int i;
+  BOOL ret = NO;
+
+  if ([theEvent type] != NSKeyDown) return NO;
+  s = [theEvent characters];
+
+  for (i = 0; i < [s length]; ++i)
+    {
+      int ch = (int) [s characterAtIndex: i];
+      switch (ch)
+        {
+        case NSHomeFunctionKey:
+        case NSDownArrowFunctionKey:
+        case NSUpArrowFunctionKey:
+        case NSLeftArrowFunctionKey:
+        case NSRightArrowFunctionKey:
+        case NSPageUpFunctionKey:
+        case NSPageDownFunctionKey:
+        case NSEndFunctionKey:
+          [panel sendEvent: theEvent];
+          ret = YES;
+          break;
+          /* As we don't have the standard key commands for
+             copy/paste/cut/select-all in our edit menu, we must handle
+             them here.  TODO: handle Emacs key bindings for copy/cut/select-all
+             here, paste works, because we have that in our Edit menu.
+             I.e. refactor out code in nsterm.m, keyDown: to figure out the
+             correct modifier.
+          */
+        case 'x': // Cut
+        case 'c': // Copy
+        case 'v': // Paste
+        case 'a': // Select all
+          if ([theEvent modifierFlags] & NSCommandKeyMask)
+            {
+              [NSApp sendAction:
+                       (ch == 'x'
+                        ? @selector(cut:)
+                        : (ch == 'c'
+                           ? @selector(copy:)
+                           : (ch == 'v'
+                              ? @selector(paste:)
+                              : @selector(selectAll:))))
+                             to:nil from:panel];
+              ret = YES;
+            }
+        default:
+          // Send all control keys, as the text field supports C-a, C-f, C-e
+          // C-b and more.
+          if ([theEvent modifierFlags] & NSControlKeyMask)
+            {
+              [panel sendEvent: theEvent];
+              ret = YES;
+            }
+          break;
+        }
+    }
+
+
+  return ret;
+}
 
 @implementation EmacsSavePanel
 #ifdef NS_IMPL_COCOA
@@ -2572,6 +2641,14 @@ Value is t if tooltip was open, nil otherwise.  */)
 {
   return ns_directory_from_panel (self);
 }
+
+- (BOOL)performKeyEquivalent:(NSEvent *)theEvent
+{
+  BOOL ret = handlePanelKeys (self, theEvent);
+  if (! ret)
+    ret = [super performKeyEquivalent:theEvent];
+  return ret;
+}
 @end
 
 
@@ -2609,7 +2686,14 @@ Value is t if tooltip was open, nil otherwise.  */)
 {
   return ns_directory_from_panel (self);
 }
-
+- (BOOL)performKeyEquivalent:(NSEvent *)theEvent
+{
+  // NSOpenPanel inherits NSSavePanel, so passing self is OK.
+  BOOL ret = handlePanelKeys (self, theEvent);
+  if (! ret)
+    ret = [super performKeyEquivalent:theEvent];
+  return ret;
+}
 @end