diff --git a/bin/mac/cursorHider.jnilib b/bin/mac/cursorHider.jnilib new file mode 100755 index 000000000000..b8567b1f7a4f Binary files /dev/null and b/bin/mac/cursorHider.jnilib differ diff --git a/native/cursorHider/cursorHider.c b/native/cursorHider/cursorHider.c new file mode 100644 index 000000000000..763837605958 --- /dev/null +++ b/native/cursorHider/cursorHider.c @@ -0,0 +1,13 @@ +#include +#include + +JNIEXPORT void JNICALL Java_com_intellij_util_ui_MacUIUtil_doHideCursor + (JNIEnv *env, jclass clazz) { + CGDisplayHideCursor(kCGDirectMainDisplay); +} + +JNIEXPORT void JNICALL Java_com_intellij_util_ui_MacUIUtil_doShowCursor + (JNIEnv *env, jclass clazz) { + CGDisplayShowCursor(kCGDirectMainDisplay); +} + diff --git a/native/cursorHider/make.sh b/native/cursorHider/make.sh new file mode 100755 index 000000000000..fc78cd0789b1 --- /dev/null +++ b/native/cursorHider/make.sh @@ -0,0 +1 @@ +gcc -arch i386 -arch x86_64 -mmacosx-version-min=10.5 -framework ApplicationServices -I/System/Library/Frameworks/JavaVM.framework/Headers/ cursorHider.c -shared -fPIC -o cursorHider.jnilib \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/IdeKeyEventDispatcher.java b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/IdeKeyEventDispatcher.java index afe0571efd51..d51391ad7c5e 100644 --- a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/IdeKeyEventDispatcher.java +++ b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/IdeKeyEventDispatcher.java @@ -34,6 +34,7 @@ import com.intellij.openapi.keymap.impl.keyGestures.KeyboardGestureProcessor; import com.intellij.openapi.keymap.impl.ui.ShortcutTextField; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.TypingTarget; import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.openapi.ui.popup.ListPopupStep; import com.intellij.openapi.ui.popup.PopupStep; @@ -57,12 +58,14 @@ import com.intellij.ui.popup.list.ListPopupImpl; import com.intellij.util.Alarm; import com.intellij.util.Processor; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.ui.MacUIUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.plaf.basic.ComboPopup; +import javax.swing.text.JTextComponent; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.InputEvent; @@ -162,6 +165,13 @@ public final class IdeKeyEventDispatcher implements Disposable { if (focusOwner instanceof ShortcutTextField) { return false; } + if (Registry.is("ide.mac.hide.cursor.when.typing") && + (focusOwner instanceof TypingTarget || + (focusOwner instanceof JTextComponent && ((JTextComponent)focusOwner).isEditable()))) { + if (e.getKeyChar() != KeyEvent.CHAR_UNDEFINED && e.getKeyChar() != KeyEvent.VK_ESCAPE) { + MacUIUtil.hideCursor(); + } + } MenuSelectionManager menuSelectionManager=MenuSelectionManager.defaultManager(); MenuElement[] selectedPath = menuSelectionManager.getSelectedPath(); diff --git a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/IdeMouseEventDispatcher.java b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/IdeMouseEventDispatcher.java index cf6f53ac30aa..69e154d42484 100644 --- a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/IdeMouseEventDispatcher.java +++ b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/IdeMouseEventDispatcher.java @@ -26,6 +26,7 @@ import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.wm.impl.IdeGlassPaneImpl; import com.intellij.util.containers.HashMap; +import com.intellij.util.ui.MacUIUtil; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.Nullable; @@ -129,6 +130,8 @@ public final class IdeMouseEventDispatcher { resetPopupTrigger(e); } + MacUIUtil.showCursor(); + if (!(e.getID() == MouseEvent.MOUSE_PRESSED || e.getID() == MouseEvent.MOUSE_RELEASED || e.getID() == MOUSE_CLICKED)) { diff --git a/platform/platform-resources-en/src/misc/registry.properties b/platform/platform-resources-en/src/misc/registry.properties index 9aa929eeb832..7ab40a0d3cfc 100644 --- a/platform/platform-resources-en/src/misc/registry.properties +++ b/platform/platform-resources-en/src/misc/registry.properties @@ -106,6 +106,7 @@ ide.mac.filechooser.showhidden.files=false ide.mac.filechooser.native=true ide.mac.message.dialogs.as.sheets=true ide.mac.inplaceDialogMnemonicsFix=true +ide.mac.hide.cursor.when.typing=true debugger.valueTooltipAutoShow=true debugger.valueTooltipAutoShow.description=Auto show tooltip on mouse over diff --git a/platform/util/src/com/intellij/util/ui/MacUIUtil.java b/platform/util/src/com/intellij/util/ui/MacUIUtil.java index f47dd8ff7e56..46d5f9ee1ed1 100644 --- a/platform/util/src/com/intellij/util/ui/MacUIUtil.java +++ b/platform/util/src/com/intellij/util/ui/MacUIUtil.java @@ -15,6 +15,7 @@ */ package com.intellij.util.ui; +import com.intellij.openapi.application.PathManager; import com.intellij.openapi.util.SystemInfo; import com.intellij.ui.Gray; import org.jetbrains.annotations.NotNull; @@ -25,6 +26,7 @@ import javax.swing.plaf.TreeUI; import javax.swing.tree.DefaultTreeCellRenderer; import java.awt.*; import java.awt.geom.GeneralPath; +import java.io.File; import java.lang.reflect.Field; /** @@ -36,10 +38,34 @@ public class MacUIUtil { public static final String MAC_FILL_BORDER = "MAC_FILL_BORDER"; public static final int MAC_COMBO_BORDER_V_OFFSET = SystemInfo.isMacOSLion ? 1 : 0; private static Cursor INVERTED_TEXT_CURSOR; + private static boolean CURSOR_HIDER_LOADED = false; + + static { + if (SystemInfo.isMac) { + try { + System.load(PathManager.getBinPath() + File.separatorChar + "cursorHider.jnilib"); + CURSOR_HIDER_LOADED = true; + } catch (UnsatisfiedLinkError ignored) {} + } + } private MacUIUtil() { } + public static void hideCursor() { + if (CURSOR_HIDER_LOADED) { + doHideCursor(); + } + } + private static native void doHideCursor(); + + public static void showCursor() { + if (CURSOR_HIDER_LOADED) { + doShowCursor(); + } + } + private static native void doShowCursor(); + public static class EditorTextFieldBorder implements Border { private JComponent myEnabledComponent;