diff --git a/CMakeLists.txt b/CMakeLists.txt index 42019205..4e92183c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.6.0) -project(win-vind VERSION 5.12.0) +project(win-vind VERSION 5.13.2) set(INTERNAL_VERSION ${PROJECT_VERSION}.1) if(NOT CMAKE_BUILD_TYPE) diff --git a/README.md b/README.md index ad0f8174..a895b45d 100644 --- a/README.md +++ b/README.md @@ -64,12 +64,12 @@ $ scoop install win-vind ``` ### Executable Installer -- [win-vind_5.12.0_32bit_installer.zip](https://github.com/pit-ray/win-vind/releases/download/v5.12.0/win-vind_5.12.0_32bit_installer.zip) -- [win-vind_5.12.0_64bit_installer.zip](https://github.com/pit-ray/win-vind/releases/download/v5.12.0/win-vind_5.12.0_64bit_installer.zip) +- [win-vind_5.13.1_32bit_installer.zip](https://github.com/pit-ray/win-vind/releases/download/v5.13.1/win-vind_5.13.1_32bit_installer.zip) +- [win-vind_5.13.1_64bit_installer.zip](https://github.com/pit-ray/win-vind/releases/download/v5.13.1/win-vind_5.13.1_64bit_installer.zip) ### Portable Zip -- [win-vind_5.12.0_32bit_portable.zip](https://github.com/pit-ray/win-vind/releases/download/v5.12.0/win-vind_5.12.0_32bit_portable.zip) -- [win-vind_5.12.0_64bit_portable.zip](https://github.com/pit-ray/win-vind/releases/download/v5.12.0/win-vind_5.12.0_64bit_portable.zip) +- [win-vind_5.13.1_32bit_portable.zip](https://github.com/pit-ray/win-vind/releases/download/v5.13.1/win-vind_5.13.1_32bit_portable.zip) +- [win-vind_5.13.1_64bit_portable.zip](https://github.com/pit-ray/win-vind/releases/download/v5.13.1/win-vind_5.13.1_64bit_portable.zip) ## Usage diff --git a/docs/_config.yml b/docs/_config.yml index bf1b0a83..e2c0c155 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -13,7 +13,7 @@ translations: # label: 日本語 project: - version: 5.12.0 + version: 5.13.1 download_url: downloads download_text: Download @@ -43,10 +43,10 @@ links: icon: comments url: https://github.com/pit-ray/win-vind/discussions -dl_ins_32: https://github.com/pit-ray/win-vind/releases/download/v5.12.0/win-vind_5.12.0_32bit_installer.zip -dl_zip_32: https://github.com/pit-ray/win-vind/releases/download/v5.12.0/win-vind_5.12.0_32bit_portable.zip -dl_ins_64: https://github.com/pit-ray/win-vind/releases/download/v5.12.0/win-vind_5.12.0_64bit_installer.zip -dl_zip_64: https://github.com/pit-ray/win-vind/releases/download/v5.12.0/win-vind_5.12.0_64bit_portable.zip +dl_ins_32: https://github.com/pit-ray/win-vind/releases/download/v5.13.1/win-vind_5.13.1_32bit_installer.zip +dl_zip_32: https://github.com/pit-ray/win-vind/releases/download/v5.13.1/win-vind_5.13.1_32bit_portable.zip +dl_ins_64: https://github.com/pit-ray/win-vind/releases/download/v5.13.1/win-vind_5.13.1_64bit_installer.zip +dl_zip_64: https://github.com/pit-ray/win-vind/releases/download/v5.13.1/win-vind_5.13.1_64bit_portable.zip ui: mode: 'light' # 'auto', 'dark', 'light' diff --git a/docs/cheat_sheet/options/index.md b/docs/cheat_sheet/options/index.md index c5911c8e..04bdd2b3 100644 --- a/docs/cheat_sheet/options/index.md +++ b/docs/cheat_sheet/options/index.md @@ -49,12 +49,21 @@ Font size of GUI Specify the characters of hint used for EasyClick and GridMove. It accpets as input a set of non-duplicate characters and assigns them to the hints in order from the first to the last. - ## Command Line ### **`vcmdline`** **type**: bool, **default**: true -show virtual command line +Show virtual command line + +
+ +### **`showcmd`** +**type**: bool, **default**: true +Show the partial command in the virtual command line. +This feature causes some overhead. +If the count of repeats for a command is specified, the command is displayed following the count of repeats. +If you do not enter a repeat count for a command, then the repeat count is denoted as 1. +Unlike Vim, the repeat count is always explicitly displayed to reduce mistakes in the repeat count.
diff --git a/libs/fluent_tray/fluent_tray.hpp b/libs/fluent_tray/fluent_tray.hpp index a608c92a..234f2d4d 100644 --- a/libs/fluent_tray/fluent_tray.hpp +++ b/libs/fluent_tray/fluent_tray.hpp @@ -937,26 +937,24 @@ namespace fluent_tray } POINT pos ; - if(!GetCursorPos(&pos)) { - return false ; - } - - if(pos.x != previous_mouse_pos_.x || pos.y != previous_mouse_pos_.y) { - // The mouse cursor is moved, so switch to the mouse-mode. - for(int i = 0 ; i < static_cast(menus_.size()) ; i ++) { - auto& menu = menus_[i] ; - auto detected_hwnd = WindowFromPoint(pos) ; - if(!detected_hwnd) { - return false ; - } - // Checks whether the mouse cursor is over the menu or not. - if(detected_hwnd == menu.window_handle()) { - // Start selection by key from the currently selected menu. - select_index_ = i ; - break ; + if(GetCursorPos(&pos)) { + if(pos.x != previous_mouse_pos_.x || pos.y != previous_mouse_pos_.y) { + // The mouse cursor is moved, so switch to the mouse-mode. + for(int i = 0 ; i < static_cast(menus_.size()) ; i ++) { + auto& menu = menus_[i] ; + auto detected_hwnd = WindowFromPoint(pos) ; + if(!detected_hwnd) { + return false ; + } + // Checks whether the mouse cursor is over the menu or not. + if(detected_hwnd == menu.window_handle()) { + // Start selection by key from the currently selected menu. + select_index_ = i ; + break ; + } } + previous_mouse_pos_ = pos ; } - previous_mouse_pos_ = pos ; } if(select_index_ < 0) { @@ -1422,7 +1420,10 @@ namespace fluent_tray if(!Shell_NotifyIconW(NIM_ADD, &icon_data_)) { return false ; } - hide_menu_window() ; + + if(!hide_menu_window()) { + return false ; + } return true ; } diff --git a/src/bind/emu/motion.cpp b/src/bind/emu/motion.cpp index 5a71cffc..252f33f5 100644 --- a/src/bind/emu/motion.cpp +++ b/src/bind/emu/motion.cpp @@ -56,7 +56,9 @@ namespace vind auto solver = ihub.get_solver(Mode::EDI_NORMAL) ; while(true) { - pimpl->bg_.update() ; + if(!pimpl->bg_.update()) { + continue ; + } core::CmdUnit::SPtr input ; std::uint16_t in_count ; @@ -118,7 +120,9 @@ namespace vind auto solver = ihub.get_solver(Mode::EDI_NORMAL) ; while(true) { - pimpl->bg_.update() ; + if(!pimpl->bg_.update()) { + continue ; + } core::CmdUnit::SPtr input ; std::uint16_t in_count ; @@ -178,7 +182,9 @@ namespace vind auto solver = ihub.get_solver(Mode::EDI_NORMAL) ; while(true) { - pimpl->bg_.update() ; + if(!pimpl->bg_.update()) { + continue ; + } core::CmdUnit::SPtr input ; std::uint16_t in_count ; diff --git a/src/bind/emu/replacetext.cpp b/src/bind/emu/replacetext.cpp index 98189e7b..247495f5 100644 --- a/src/bind/emu/replacetext.cpp +++ b/src/bind/emu/replacetext.cpp @@ -66,7 +66,9 @@ namespace } while(true) { - bg_.update() ; + if(!bg_.update()) { + continue ; + } if(igate.is_pressed(KEYCODE_ESC)) { return ; diff --git a/src/bind/mode/command_mode.cpp b/src/bind/mode/command_mode.cpp index df012e44..553020e9 100644 --- a/src/bind/mode/command_mode.cpp +++ b/src/bind/mode/command_mode.cpp @@ -355,7 +355,9 @@ namespace vind auto result = SystemCall::SUCCEEDED ; ac.apply(core::get_enter_event(core::Mode::COMMAND)) ; while(true) { - pimpl->bg_.update() ; + if(!pimpl->bg_.update()) { + continue ; + } bool break_flag = false ; do { diff --git a/src/bind/mode/instant_mode.cpp b/src/bind/mode/instant_mode.cpp index 6ab75ec3..4edad75d 100644 --- a/src/bind/mode/instant_mode.cpp +++ b/src/bind/mode/instant_mode.cpp @@ -58,7 +58,9 @@ namespace vind auto res = SystemCall::SUCCEEDED ; while(true) { - pimpl->bg_.update() ; + if(!pimpl->bg_.update()) { + continue ; + } std::vector inputs ; std::vector in_counts ; diff --git a/src/bind/mouse/hinter.cpp b/src/bind/mouse/hinter.cpp index 2b644a42..aa9b9a9f 100644 --- a/src/bind/mouse/hinter.cpp +++ b/src/bind/mouse/hinter.cpp @@ -182,7 +182,9 @@ namespace vind points, hint_texts, start_indices, mtxes) ; while(true) { - pimpl->bg_.update() ; + if(!pimpl->bg_.update()) { + continue ; + } // To use combined macros like , // get the keys from the input queue rather than the mapped queue. diff --git a/src/bind/mouse/jump_keybrd.cpp b/src/bind/mouse/jump_keybrd.cpp index 80c4edfe..fca78a5a 100644 --- a/src/bind/mouse/jump_keybrd.cpp +++ b/src/bind/mouse/jump_keybrd.cpp @@ -70,7 +70,9 @@ namespace vind auto toggle_keys = igate.pressed_list() ; while(true) { - pimpl->bg_.update() ; + if(!pimpl->bg_.update()) { + continue ; + } core::CmdUnit::SPtr inputs ; std::uint16_t count ; diff --git a/src/bind/window/switch_win.cpp b/src/bind/window/switch_win.cpp index 288a131b..9f1bd633 100644 --- a/src/bind/window/switch_win.cpp +++ b/src/bind/window/switch_win.cpp @@ -60,7 +60,9 @@ namespace vind auto mode = core::get_global_mode() ; while(true) { - pimpl->bg_.update() ; + if(!pimpl->bg_.update()) { + continue ; + } bool break_flag = false ; do { diff --git a/src/bind/window/winresizer.cpp b/src/bind/window/winresizer.cpp index bc4e51b2..587bc421 100644 --- a/src/bind/window/winresizer.cpp +++ b/src/bind/window/winresizer.cpp @@ -234,7 +234,9 @@ namespace vind core::InstantKeyAbsorber ika ; while(true) { - pimpl->bg_.update() ; + if(!pimpl->bg_.update()) { + continue ; + } bool break_flag = false ; do { diff --git a/src/core/background.cpp b/src/core/background.cpp index ca923227..5c529a3a 100644 --- a/src/core/background.cpp +++ b/src/core/background.cpp @@ -14,11 +14,19 @@ namespace vind { struct Background::Impl { std::vector opts_ ; + bool screen_is_locked_ ; template Impl(T&& opts) - : opts_(std::forward(opts)) + : opts_(std::forward(opts)), + screen_is_locked_(false) {} + + bool is_screen_locked() { + // GetCursorPos fails when the screen is locked. + POINT pos ; + return GetCursorPos(&pos) == 0 ; + } } ; Background::Background() @@ -35,22 +43,37 @@ namespace vind Background::~Background() noexcept = default ; - void Background::update() { - util::get_win_message() ; - + bool Background::update() { + auto& igate = InputGate::get_instance() ; Sleep(5) ; + if(pimpl->is_screen_locked()) { + if(!pimpl->screen_is_locked_) { + // Release all keys when the screen is locked. + for(auto& key : igate.pressed_list()) { + igate.release_virtually(key) ; + } + pimpl->screen_is_locked_ = true ; + } + return false ; + } + else if(pimpl->screen_is_locked_) { + pimpl->screen_is_locked_ = false ; + } + + util::get_win_message() ; + for(const auto& op : pimpl->opts_) { op->process() ; } - auto& igate = InputGate::get_instance() ; igate.refresh_toggle_state() ; if(igate.is_really_pressed(KEYCODE_F8) && \ igate.is_really_pressed(KEYCODE_F9)) { throw SafeForcedTermination() ; } + return true ; } } } diff --git a/src/core/background.hpp b/src/core/background.hpp index d5d648a3..c01a7287 100644 --- a/src/core/background.hpp +++ b/src/core/background.hpp @@ -28,7 +28,8 @@ namespace vind // If you make some loop functions, the function is needed to call. // It includes Sleep(). - void update() ; + // If this function returns false, should skip an iteration. + bool update() ; Background(const Background&) = delete ; Background& operator=(const Background&) = delete ; diff --git a/src/core/entry.cpp b/src/core/entry.cpp index 9fc4804b..ef9b6dc8 100644 --- a/src/core/entry.cpp +++ b/src/core/entry.cpp @@ -60,6 +60,7 @@ SOFTWARE. #include #include #include +#include #include "autocmd.hpp" @@ -317,11 +318,16 @@ namespace vind void VindEntry::update() { auto& ihub = InputHub::get_instance() ; + auto& settable = SetTable::get_instance() ; // NOTE: it assume that these hwnd are fixed. static const auto desktop_hwnd = GetDesktopWindow() ; static const auto taskbar_hwnd = FindWindowA("Shell_TrayWnd", NULL) ; + if(!pimpl->bg_.update()) { + return ; + } + auto& ac = AutoCmd::get_instance() ; auto hwnd = util::get_foreground_window() ; auto procid = static_cast(0) ; @@ -341,8 +347,6 @@ namespace vind } } - pimpl->bg_.update() ; - // TODO: It is necessary to add exclusive handling when // write and read operations are performed at the same // time by multiple processes. However, these are extremely @@ -370,10 +374,43 @@ namespace vind do { CmdUnit::SPtr input ; - std::uint16_t count ; + std::uint16_t count = 0 ; if(!ihub.pull_input(input, count)) { + if(settable.get("showcmd").get()) { + if(count > 0) { + opt::VCmdLine::reset() ; + opt::VCmdLine::print(opt::StaticMessage(std::to_string(count))) ; + } + } continue ; } + + if(settable.get("showcmd").get()) { + auto solver = ihub.get_solver() ; + for(const auto& matcher : solver->get_trigger_matchers()) { + if(!matcher->is_matching()) { + continue ; + } + auto hist_size = matcher->history_size() ; + // If the any matcher isn't matched, the history size is zero. + if(hist_size == 0) { + opt::VCmdLine::reset() ; + break ; + } + std::stringstream ss ; + ss << count ; + + auto cmd = matcher->get_command() ; + auto end_itr = cmd.begin() + hist_size ; + for(auto itr = cmd.begin() ; itr != end_itr ; itr ++) { + ss << **itr ; + } + opt::VCmdLine::reset() ; + opt::VCmdLine::print(opt::StaticMessage(ss.str())) ; + break ; + } + } + handle_system_call(input->execute(count)) ; // correct the state to avoid cases that a virtual key diff --git a/src/core/inputhub.cpp b/src/core/inputhub.cpp index bbef4866..f30e3e76 100644 --- a/src/core/inputhub.cpp +++ b/src/core/inputhub.cpp @@ -151,6 +151,9 @@ namespace vind *input, pimpl->count_.size() > 0) ; if(!new_count.empty()) { pimpl->count_ += new_count ; + + // Store the count number, but return as false. + count = util::extract_num(pimpl->count_) ; return false ; } } diff --git a/src/core/inputhub.hpp b/src/core/inputhub.hpp index 3b2a1862..b6666d38 100644 --- a/src/core/inputhub.hpp +++ b/src/core/inputhub.hpp @@ -27,7 +27,7 @@ namespace vind public: static InputHub& get_instance() ; - std::shared_ptr get_solver(Mode mode) ; + std::shared_ptr get_solver(Mode mode=get_global_mode()) ; /* * Emulate text input and retrieve input at the appropriate time. diff --git a/src/core/settable.cpp b/src/core/settable.cpp index 5871310d..9d2ec132 100644 --- a/src/core/settable.cpp +++ b/src/core/settable.cpp @@ -82,6 +82,7 @@ namespace Param("uiacachebuild_stayend", 2000), Param("vcmdline", true), + Param("showcmd", true), Param("vscroll_pageratio", 0.125f), Param("vscroll_speed", 30), diff --git a/src/core/version.hpp b/src/core/version.hpp index 45521195..81bdb964 100644 --- a/src/core/version.hpp +++ b/src/core/version.hpp @@ -1,6 +1,6 @@ #ifndef _VERSION_HPP #define _VERSION_HPP -#define WIN_VIND_VERSION "5.11.3.0" +#define WIN_VIND_VERSION "5.13.2.1" #endif