emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] /srv/bzr/emacs/trunk r112417: * nsfns.m (handlePanelKeys):


From: Jan D.
Subject: [Emacs-diffs] /srv/bzr/emacs/trunk r112417: * nsfns.m (handlePanelKeys): New function.
Date: Sun, 28 Apr 2013 11:55:20 +0200
User-agent: Bazaar (2.5.0)

------------------------------------------------------------
revno: 112417
fixes bug: http://debbugs.gnu.org/14296
committer: Jan D. <address@hidden>
branch nick: trunk
timestamp: Sun 2013-04-28 11:55:20 +0200
message:
  * nsfns.m (handlePanelKeys): New function.
  (EmacsOpenPanel:performKeyEquivalent:)
  (EmacsSavePanel:performKeyEquivalent:): Call handlePanelKeys to handle
  arrows/function/control and copy/paste keys.
modified:
  src/ChangeLog
  src/nsfns.m
=== modified file 'src/ChangeLog'
--- a/src/ChangeLog     2013-04-27 21:12:17 +0000
+++ b/src/ChangeLog     2013-04-28 09:55:20 +0000
@@ -1,3 +1,10 @@
+2013-04-28  Jan Djärv  <address@hidden>
+
+       * 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  <address@hidden>
 
        * callint.c (Fcall_interactively): Call `Qread_number' for

=== modified file 'src/nsfns.m'
--- a/src/nsfns.m       2013-04-07 04:41:19 +0000
+++ b/src/nsfns.m       2013-04-28 09:55:20 +0000
@@ -1477,7 +1477,7 @@
       [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 @@
 
    ========================================================================== 
*/
 
+/*
+  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 @@
 {
   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 @@
 {
   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
 
 


reply via email to

[Prev in Thread] Current Thread [Next in Thread]