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