Skip to content

Commit

Permalink
fix crash problem when computer is locked.
Browse files Browse the repository at this point in the history
  • Loading branch information
pit-ray committed Jun 13, 2024
1 parent 143bda5 commit 72c3381
Show file tree
Hide file tree
Showing 13 changed files with 85 additions and 38 deletions.
39 changes: 20 additions & 19 deletions libs/fluent_tray/fluent_tray.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<int>(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<int>(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) {
Expand Down Expand Up @@ -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 ;
}
Expand Down
12 changes: 9 additions & 3 deletions src/bind/emu/motion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 ;
Expand Down Expand Up @@ -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 ;
Expand Down Expand Up @@ -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 ;
Expand Down
4 changes: 3 additions & 1 deletion src/bind/emu/replacetext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,9 @@ namespace
}

while(true) {
bg_.update() ;
if(!bg_.update()) {
continue ;
}

if(igate.is_pressed(KEYCODE_ESC)) {
return ;
Expand Down
4 changes: 3 additions & 1 deletion src/bind/mode/command_mode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
4 changes: 3 additions & 1 deletion src/bind/mode/instant_mode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,9 @@ namespace vind

auto res = SystemCall::SUCCEEDED ;
while(true) {
pimpl->bg_.update() ;
if(!pimpl->bg_.update()) {
continue ;
}

std::vector<core::CmdUnit::SPtr> inputs ;
std::vector<std::uint16_t> in_counts ;
Expand Down
4 changes: 3 additions & 1 deletion src/bind/mouse/hinter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 <easyclick><click_left>,
// get the keys from the input queue rather than the mapped queue.
Expand Down
4 changes: 3 additions & 1 deletion src/bind/mouse/jump_keybrd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 ;
Expand Down
4 changes: 3 additions & 1 deletion src/bind/window/switch_win.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
4 changes: 3 additions & 1 deletion src/bind/window/winresizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,9 @@ namespace vind

core::InstantKeyAbsorber ika ;
while(true) {
pimpl->bg_.update() ;
if(!pimpl->bg_.update()) {
continue ;
}

bool break_flag = false ;
do {
Expand Down
33 changes: 28 additions & 5 deletions src/core/background.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,19 @@ namespace vind
{
struct Background::Impl {
std::vector<opt::Option::SPtr> opts_ ;
bool screen_is_locked_ ;

template <typename T>
Impl(T&& opts)
: opts_(std::forward<T>(opts))
: opts_(std::forward<T>(opts)),
screen_is_locked_(false)
{}

bool is_screen_locked() {
// GetCursorPos fails when the screen is locked.
POINT pos ;
return GetCursorPos(&pos) == 0 ;
}
} ;

Background::Background()
Expand All @@ -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 ;
}
}
}
3 changes: 2 additions & 1 deletion src/core/background.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 ;
Expand Down
6 changes: 4 additions & 2 deletions src/core/entry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,10 @@ namespace vind
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<DWORD>(0) ;
Expand All @@ -343,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
Expand Down
2 changes: 1 addition & 1 deletion src/core/version.hpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#ifndef _VERSION_HPP
#define _VERSION_HPP

#define WIN_VIND_VERSION "5.13.0.0"
#define WIN_VIND_VERSION "5.13.1.0"

#endif

0 comments on commit 72c3381

Please sign in to comment.