diff options
author | anekos | 2011-03-31 11:52:18 +0900 |
---|---|---|
committer | anekos | 2011-03-31 22:40:43 +0900 |
commit | 5f835b756d6258550341a2f0601185d3a282e406 (patch) | |
tree | da1650d5c46efb4dd3fefad9a37b629f32f9235c | |
parent | 6c621962cd32b8f9588f2dc23485e1e015416986 (diff) | |
download | vimperator-plugins-5f835b756d6258550341a2f0601185d3a282e406.tar.bz2 |
修飾キーをクリック時に自動的にリリースして戻すように
-rw-r--r-- | win-mouse.js | 78 |
1 files changed, 62 insertions, 16 deletions
diff --git a/win-mouse.js b/win-mouse.js index 46f33e0..5e4c7e9 100644 --- a/win-mouse.js +++ b/win-mouse.js @@ -35,7 +35,7 @@ THE POSSIBILITY OF SUCH DAMAGE. // INFO {{{ let INFO = <> - <plugin name="Win Cursor" version="1.1.0" + <plugin name="Win Cursor" version="1.2.0" href="http://vimpr.github.com/" summary="Cursor control plugin for MS Windows" lang="en-US" @@ -129,6 +129,9 @@ let INFO = // #endif /* WINVER >= 0x0600 */ const MOUSEEVENTF_VIRTUALDESK = 0x4000; /* map to entire virtual desktop */ const MOUSEEVENTF_ABSOLUTE = 0x8000; /* absolute move */ + const KEYEVENTF_EXTENDEDKEY = 0x0001; + const KEYEVENTF_KEYDOWN = 0x0000; + const KEYEVENTF_KEYUP = 0x0002; // }}} // Color {{{ @@ -325,7 +328,7 @@ let INFO = ctypes.winapi_abi, ctypes.uint32_t, ctypes.uint32_t, - new ctypes.ArrayType(MouseInput, 2).ptr, + ctypes.voidptr_t, ctypes.uint32_t ); const GetDC = @@ -347,8 +350,6 @@ let INFO = // }}} // Functions {{{ - const ClickInput = new new ctypes.ArrayType(MouseInput, 2); - function buttonNameToClickValues (name) { if (typeof name != 'string') return; @@ -384,8 +385,44 @@ let INFO = if (!vs) throw 'Unknown button name'; - [ClickInput[0].flags, ClickInput[1].flags] = vs; - SendInput(2, ClickInput.address(), MouseInput.size); + let relKeys = []; + if (release) { + let ev = events.fromString(release).slice(-1)[0]; + if (ev.shiftKey) + relKeys.push(0x10); + if (ev.ctrlKey) + relKeys.push(0x11); + if (ev.altKey) + relKeys.push(0x12); + + if (relKeys.length > 0) { + setTimeout( + function () { + let ClickInput = new new ctypes.ArrayType(MouseInput, relKeys.length); + for (let [i, relKey] in Iterator(relKeys)) { + ClickInput[i].type = 1; + ClickInput[i].dx = relKey; + ClickInput[i].dy = KEYEVENTF_KEYDOWN; + } + SendInput(relKeys.length, ClickInput.address(), MouseInput.size) + }, + 50 + ); + } + } + + let inputSize = relKeys.length + 2; + let ClickInput = new new ctypes.ArrayType(MouseInput, inputSize); + for (let [i, relKey] in Iterator(relKeys)) { + ClickInput[i].type = 1; + ClickInput[i].dx = relKey; + ClickInput[i].dy = KEYEVENTF_KEYUP; + } + + ClickInput[relKeys.length + 0].flags = vs[0]; + ClickInput[relKeys.length + 1].flags = vs[1]; + + SendInput(inputSize, ClickInput.address(), MouseInput.size) let autoBlur = liberator.globalVariables.win_mouse_auto_blur; if (autoBlur) { @@ -420,14 +457,15 @@ let INFO = for (let i = 1; i <= modes.PROMPT; i *= 2) ALL_MODE.push(i); - function mapIfGiven (name, description, action, extra) { - let keys = liberator.globalVariables[name]; - if (!keys) + function mapIfGiven (name, func) { + let key = liberator.globalVariables[name]; + if (!key) return; + let [description, action, extra] = func(key); mappings.addUserMap( ALL_MODE, - [keys], + [key], description, action, extra @@ -443,18 +481,26 @@ let INFO = ].forEach(function ([name, dx, dy]) { mapIfGiven( 'win_mouse_map_move_' + name, - 'Move cursor to' + name, - function (count) API.move(D(dx, count), D(dy, count), true), - {count: true} + function (key) { + return [ + 'Move cursor to' + name, + function (count) API.move(D(dx, count), D(dy, count), true), + {count: true} + ]; + } ); }); ['left', 'right', 'middle'].forEach(function (name) { mapIfGiven( 'win_mouse_map_' + name + '_click', - name + ' click', - function () API.click(name), - {} + function (key) { + return [ + name + ' click', + function () API.click(name, key), + {} + ]; + } ); }); // }}} |