From f08e6cf6171d670f10a404def3efde88c3981ddb Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Wed, 21 Dec 2011 23:31:37 +0400 Subject: [PATCH] IDEA-69397 On MacOS X, hide mouse cursor when typing --- bin/mac/cursorHider.jnilib | Bin 0 -> 24952 bytes native/cursorHider/cursorHider.c | 13 +++++++++ native/cursorHider/make.sh | 1 + .../keymap/impl/IdeKeyEventDispatcher.java | 10 +++++++ .../keymap/impl/IdeMouseEventDispatcher.java | 3 ++ .../src/misc/registry.properties | 1 + .../src/com/intellij/util/ui/MacUIUtil.java | 26 ++++++++++++++++++ 7 files changed, 54 insertions(+) create mode 100755 bin/mac/cursorHider.jnilib create mode 100644 native/cursorHider/cursorHider.c create mode 100755 native/cursorHider/make.sh diff --git a/bin/mac/cursorHider.jnilib b/bin/mac/cursorHider.jnilib new file mode 100755 index 0000000000000000000000000000000000000000..b8567b1f7a4f5498a277beda81d546d98ace048b GIT binary patch literal 24952 zcmeHOU2IfE6rP0zHoDLaX-q|s)wDzn+13OJz8DIvZlxu~wx&LiVY}VZ3)|ghe`sqY zHa41W8bV|6#TPJ|Xnf+yfH6h`PsRX=FFw`>k~YCajVAcV`h9oiZtw1v7JU(tbJDrz zoSAdZo%`Jj*)wzIn>(L>sgzoWwh3*$QW3BxF5(gnRQmR_Z<2jzLV|!GAP5Kof`A|( z2nYg#fFK|U2m*qDAn<@8aP5yD@7Tm&ZN%J};6D{q>TRq8Apci!T(s`*9PF=oFfJ32 z!0EpM4Q?)JT}Vw9tO8c+zpzEAbLc1cd|d0GnszxZTIZ+6hO%j$FBFGdy?PFX2Bo&5 zpPcjbD73-E;IkkGob_lbJ)X+BdUcFh_&$k#axQ>W$i|?qbulyHWQMhq8OgeOb&OBp z8%IC+-H7uGx;S>U_qY43h@r1}?*WT2E@?eHl^(VVnAY|FAr2!()%=%T;FC^xP>vUJ zbumKlA@;#FKV=Q}^ceKxq)!lXYP-jP%_dP|?2|opX z5g75lU=`X7X*XIEn!i6;%;mGWxHFu}#ZF|Lv@>MxO}oJ;o(KE}_yYLDXuW78V#~&P z@|*RrhFC|JqRRa@Q5k^#5R}Kzc%S!Qxcb?5!+Q_SZToQa=%uBd&FJH!s139-xQ>I< z*5L9qq=0Jeo5~kbW3AoJP%e?1YJD-67)woLb0_ny?c?KVCz&WX*-T$5cgjho^05(b zxb@XkE{_qItz_uF$30c|JA&7O`xW!KRv^T7Jekz_*t0QwS%j?KCve`((dT2P8#~}R z?SciLvo~sRhA1Qm2m*qDARq_`0)l`bAPC$S2+Z6H^&VN|R0ii}pFsvu>TV9t%|2qJ z&})NNM&|AC^q;UQFU(ibKEKd_w36j)UVa*2YR%M;|>`^5@HaA8OD z_BK2?S0x@t2UjMzUrITM7%|9Ou*pmN{g4~bA4Na+=PCC>{s=Ne{3&(WCtvf)+`Hu- zKlh9Ma#V58+-&?0Vc*`#9QO(U%yzmSDQ1#7oz0#sjvHG&mPn4mD1p6XrC&~*O6X*E z3>*H1R66aP(8Yq2)cfWuABP*04oKUPqP;M5~_w- z|4(A^!uQC;Yis!3L0*hmMfG$qFK2E}TI)=}G}Z}71;Z3|OkgKolxq;m_Uat+{>6Lgjg4U@~ z?N)-Df!gPtw(%ydA9cRdyAj_j>t1SW`MvjdH_rFUxZbnh%NYfjSHe+PZC-1gS1{Ew zrl#JFTNBTlAIC_1&N!OZE1Wx^f%pAJsVFsRKN80Ae=j_T(1ylZet-W;=MZ4x;zQeL z)T~i`0)7L!|11JA^cuhQ)o_`IzxS=e6oHMscNSr3&kx^5*0*h)J$>evv(KMD&F|EG zwEyue!amG_7?^Km?Xw6lb^rgV^1Fxg2=v>9#^-H{%9#YfAS4I~0)l`bAP5Kog1~)? zKzm>JnH>{9m&@&a<(4ddSvTxNWqbyLDZ?L#mu|*qZbjmy)3@WL;!lf*@F=CPOV=0o zLWs{?jnvfN*V^+3vTM)G*4UR@SpHvbX>zaIa8(Mk2tZg$qtYJo-{@L8X5`-~_pecb z&wSOZ!2iwWp34>Z>r|up6n7|6XRg+^XLf!AMAfyqc965bS=$0*M{yH)?9T7=MO7uF=1!(YX)m)${x1e^=Lk|5x$<1L6UH&;S4c literal 0 HcmV?d00001 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;