Skip to content

add notify method to NotifierReg#418

Open
fxliang wants to merge 4 commits into
hchunhui:masterfrom
fxliang:notify
Open

add notify method to NotifierReg#418
fxliang wants to merge 4 commits into
hchunhui:masterfrom
fxliang:notify

Conversation

@fxliang

@fxliang fxliang commented Aug 7, 2025

Copy link
Copy Markdown
Contributor

No description provided.

@shewer

shewer commented Aug 7, 2025

Copy link
Copy Markdown
Contributor

有點好玩 但是不知道要在什麼情境下使用
我發現 context.select_notify:notify(context)
https://github.com/rime/librime/blob/358ea0e7e40dd86daf2534e65215f95a18910d23/src/rime/engine.cc#L259-L261
void ConcreteEngine::OnSelect(Context* ctx) {
Segment& seg(ctx->composition().back());
seg.Close();
if (seg.end == ctx->input().length()) {
// composition has finished
在 composition_.empty() 時會發生 錯誤
.commit_notify:notify(context) 不會
delete_notifier --> Memory::OnDelete() 不會
update_notifier--> 不會


/usr/include/c++/15.1.1/bits/stl_vector.h:1370: std::vector<_Tp, _Alloc>::reference std::vector<_Tp, _Alloc>::back() [with _Tp = rime::Segment; _Alloc = std
::allocatorrime::Segment; reference = rime::Segment&]: Assertion '!this->empty()' failed.
[1] 995874 IOT instruction (core dumped) LD_LIBRARY_PATH="../lib" ./rime_api_console -v

@fxliang

fxliang commented Aug 8, 2025

Copy link
Copy Markdown
Contributor Author

用来通知插件外的组件有事件更新,最常用其实是update_notifier

predict组件在更新的context之后update_notifier通知其他组件更新才能不按键都可以弹出

看来这样还是太简单了😂

-- 补充

这个是我在librime-predict的框架上做了个librime-predict-leveldb,但是那样是cpp实现,就想看看librime-lua加点api是不是可能lua实现来点灵活性(要调整可能简单点

@shewer

shewer commented Aug 8, 2025

Copy link
Copy Markdown
Contributor

用来通知插件外的组件有事件更新,最常用其实是update_notifier

predict组件在更新的context之后update_notifier通知其他组件更新才能不按键都可以弹出

看来这样还是太简单了😂

如果要觸發 update_notifier 可以用 context::refresh_nonconfirmed_composition()
Context::RefreshNonConfirmedComposition()

prediict 以前看過 ,,太繞了 ,幾個 status 在notify 中轉來轉去
它只有"escape" 可以中止 ,我曾經想把 中止機制 增加非 數字選字鍵時直接中止且進入正常輸入模式.

@fxliang

fxliang commented Aug 8, 2025

Copy link
Copy Markdown
Contributor Author

似乎是可以

@fxliang fxliang closed this Aug 8, 2025
@shewer

shewer commented Aug 8, 2025

Copy link
Copy Markdown
Contributor

这个是我在librime-predict的框架上做了个librime-predict-leveldb,但是那样是cpp实现,就想看看librime-lua加点api是不是可能lua实现来点灵活性(要调整可能简单点

predict-leveldb commit 了?
有 predict-db 可以分享嗎?

@fxliang fxliang reopened this Aug 8, 2025
@fxliang

fxliang commented Aug 8, 2025

Copy link
Copy Markdown
Contributor Author

predict-leveldb commit 了?
有 predict-db 可以分享嗎?

fxliang/librime-predict-leveldb
predict的内容依赖过往的输入历史,不依赖固定的db

Image

似乎是可以

似乎还是有差别,那个接口是依赖了composition非空和composition_.back().status < Segment::kSelected还是有一点点不一样

@shewer

shewer commented Aug 8, 2025

Copy link
Copy Markdown
Contributor

predict-leveldb commit 了?
有 predict-db 可以分享嗎?

fxliang/librime-predict-leveldb predict的内容依赖过往的输入历史,不依赖固定的db

Image Image

似乎是可以

似乎还是有差别,那个接口是依赖了composition非空和composition_.back().status < Segment::kSelected还是有一点点不一样
leveldb 無法重覆開啓,建議和 predict 一樣 有db_pool_

@fxliang

fxliang commented Aug 8, 2025

Copy link
Copy Markdown
Contributor Author

predict-leveldb commit 了?
有 predict-db 可以分享嗎?

fxliang/librime-predict-leveldb predict的内容依赖过往的输入历史,不依赖固定的db
Image

    [
      
        ![Image](https://private-user-images.githubusercontent.com/4023160/435346394-cf4c7585-57e5-4b04-aaa9-8d17145f792f.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NTQ2MzkyMzIsIm5iZiI6MTc1NDYzODkzMiwicGF0aCI6Ii80MDIzMTYwLzQzNTM0NjM5NC1jZjRjNzU4NS01N2U1LTRiMDQtYWFhOS04ZDE3MTQ1Zjc5MmYuZ2lmP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDgwOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTA4MDhUMDc0MjEyWiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9YjBiM2ZjMjc5ZWFmYmI4OWFhZDE3MTc3MWM3ZDI3NDYyYzJmODg5ZDA2MWNhMjNkYWZmMzdiMzA1NGQwMzhjZCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.usnXRtb7icTEGrApQkeDk_urpNUDodyWUcKcLqMyt-o)
      
    ](https://private-user-images.githubusercontent.com/4023160/435346394-cf4c7585-57e5-4b04-aaa9-8d17145f792f.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NTQ2MzkyMzIsIm5iZiI6MTc1NDYzODkzMiwicGF0aCI6Ii80MDIzMTYwLzQzNTM0NjM5NC1jZjRjNzU4NS01N2U1LTRiMDQtYWFhOS04ZDE3MTQ1Zjc5MmYuZ2lmP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDgwOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTA4MDhUMDc0MjEyWiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9YjBiM2ZjMjc5ZWFmYmI4OWFhZDE3MTc3MWM3ZDI3NDYyYzJmODg5ZDA2MWNhMjNkYWZmMzdiMzA1NGQwMzhjZCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.usnXRtb7icTEGrApQkeDk_urpNUDodyWUcKcLqMyt-o)
    
    
      
        
          
        
        
          
          
        
      
      [
        
          
        
      ](https://private-user-images.githubusercontent.com/4023160/435346394-cf4c7585-57e5-4b04-aaa9-8d17145f792f.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NTQ2MzkyMzIsIm5iZiI6MTc1NDYzODkzMiwicGF0aCI6Ii80MDIzMTYwLzQzNTM0NjM5NC1jZjRjNzU4NS01N2U1LTRiMDQtYWFhOS04ZDE3MTQ1Zjc5MmYuZ2lmP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDgwOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTA4MDhUMDc0MjEyWiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9YjBiM2ZjMjc5ZWFmYmI4OWFhZDE3MTc3MWM3ZDI3NDYyYzJmODg5ZDA2MWNhMjNkYWZmMzdiMzA1NGQwMzhjZCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.usnXRtb7icTEGrApQkeDk_urpNUDodyWUcKcLqMyt-o)
    
   [ ![Image](https://private-user-images.githubusercontent.com/4023160/435346394-cf4c7585-57e5-4b04-aaa9-8d17145f792f.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NTQ2MzkyMzIsIm5iZiI6MTc1NDYzODkzMiwicGF0aCI6Ii80MDIzMTYwLzQzNTM0NjM5NC1jZjRjNzU4NS01N2U1LTRiMDQtYWFhOS04ZDE3MTQ1Zjc5MmYuZ2lmP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDgwOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTA4MDhUMDc0MjEyWiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9YjBiM2ZjMjc5ZWFmYmI4OWFhZDE3MTc3MWM3ZDI3NDYyYzJmODg5ZDA2MWNhMjNkYWZmMzdiMzA1NGQwMzhjZCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.usnXRtb7icTEGrApQkeDk_urpNUDodyWUcKcLqMyt-o) ](https://private-user-images.githubusercontent.com/4023160/435346394-cf4c7585-57e5-4b04-aaa9-8d17145f792f.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NTQ2MzkyMzIsIm5iZiI6MTc1NDYzODkzMiwicGF0aCI6Ii80MDIzMTYwLzQzNTM0NjM5NC1jZjRjNzU4NS01N2U1LTRiMDQtYWFhOS04ZDE3MTQ1Zjc5MmYuZ2lmP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDgwOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTA4MDhUMDc0MjEyWiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9YjBiM2ZjMjc5ZWFmYmI4OWFhZDE3MTc3MWM3ZDI3NDYyYzJmODg5ZDA2MWNhMjNkYWZmMzdiMzA1NGQwMzhjZCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.usnXRtb7icTEGrApQkeDk_urpNUDodyWUcKcLqMyt-o)
  
    [
      
        ![Image](https://private-user-images.githubusercontent.com/4023160/435346394-cf4c7585-57e5-4b04-aaa9-8d17145f792f.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NTQ2MzkyMzIsIm5iZiI6MTc1NDYzODkzMiwicGF0aCI6Ii80MDIzMTYwLzQzNTM0NjM5NC1jZjRjNzU4NS01N2U1LTRiMDQtYWFhOS04ZDE3MTQ1Zjc5MmYuZ2lmP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDgwOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTA4MDhUMDc0MjEyWiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9YjBiM2ZjMjc5ZWFmYmI4OWFhZDE3MTc3MWM3ZDI3NDYyYzJmODg5ZDA2MWNhMjNkYWZmMzdiMzA1NGQwMzhjZCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.usnXRtb7icTEGrApQkeDk_urpNUDodyWUcKcLqMyt-o)
      
    ](https://private-user-images.githubusercontent.com/4023160/435346394-cf4c7585-57e5-4b04-aaa9-8d17145f792f.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NTQ2MzkyMzIsIm5iZiI6MTc1NDYzODkzMiwicGF0aCI6Ii80MDIzMTYwLzQzNTM0NjM5NC1jZjRjNzU4NS01N2U1LTRiMDQtYWFhOS04ZDE3MTQ1Zjc5MmYuZ2lmP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDgwOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTA4MDhUMDc0MjEyWiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9YjBiM2ZjMjc5ZWFmYmI4OWFhZDE3MTc3MWM3ZDI3NDYyYzJmODg5ZDA2MWNhMjNkYWZmMzdiMzA1NGQwMzhjZCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.usnXRtb7icTEGrApQkeDk_urpNUDodyWUcKcLqMyt-o)
    
    
      
        
          
        
        
          
          
        
      
      [
        
          
        
      ](https://private-user-images.githubusercontent.com/4023160/435346394-cf4c7585-57e5-4b04-aaa9-8d17145f792f.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NTQ2MzkyMzIsIm5iZiI6MTc1NDYzODkzMiwicGF0aCI6Ii80MDIzMTYwLzQzNTM0NjM5NC1jZjRjNzU4NS01N2U1LTRiMDQtYWFhOS04ZDE3MTQ1Zjc5MmYuZ2lmP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDgwOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTA4MDhUMDc0MjEyWiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9YjBiM2ZjMjc5ZWFmYmI4OWFhZDE3MTc3MWM3ZDI3NDYyYzJmODg5ZDA2MWNhMjNkYWZmMzdiMzA1NGQwMzhjZCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.usnXRtb7icTEGrApQkeDk_urpNUDodyWUcKcLqMyt-o)
    
   [ ](https://private-user-images.githubusercontent.com/4023160/435346394-cf4c7585-57e5-4b04-aaa9-8d17145f792f.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NTQ2MzkyMzIsIm5iZiI6MTc1NDYzODkzMiwicGF0aCI6Ii80MDIzMTYwLzQzNTM0NjM5NC1jZjRjNzU4NS01N2U1LTRiMDQtYWFhOS04ZDE3MTQ1Zjc5MmYuZ2lmP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDgwOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTA4MDhUMDc0MjEyWiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9YjBiM2ZjMjc5ZWFmYmI4OWFhZDE3MTc3MWM3ZDI3NDYyYzJmODg5ZDA2MWNhMjNkYWZmMzdiMzA1NGQwMzhjZCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.usnXRtb7icTEGrApQkeDk_urpNUDodyWUcKcLqMyt-o)

似乎是可以

似乎还是有差别,那个接口是依赖了composition非空和composition_.back().status < Segment::kSelected还是有一点点不一样
leveldb 無法重覆開啓,建議和 predict 一樣 有db_pool_

更新了下,这个问题应该解决了

@shewer

shewer commented Aug 8, 2025

Copy link
Copy Markdown
Contributor
diff --git a/src/types.cc b/src/types.cc
index 8a2db84..c62c9bf 100644
--- a/src/types.cc
+++ b/src/types.cc
@@ -1464,6 +1464,9 @@ static int raw_connect(lua_State *L) {
   return 1;
 }
 
+template<typename T, typename ... I>
+static void notify(T& t, I... i) { t(i...); }
+
 namespace ConnectionReg {
   using T = boost::signals2::connection;
 
@@ -1494,6 +1497,7 @@ namespace NotifierReg {
 
   static const luaL_Reg methods[] = {
     { "connect", raw_connect<T, Context *>},
+    { "notify", WRAP((notify<T, Context*>))},
     { NULL, NULL },
   };
 
@@ -1515,6 +1519,7 @@ namespace OptionUpdateNotifierReg {
 
   static const luaL_Reg methods[] = {
     { "connect", raw_connect<T, Context *, const string&>},
+    { "notify", WRAP((notify<T, Context*, const string&>))},
     { NULL, NULL },
   };
 
@@ -1536,6 +1541,7 @@ namespace PropertyUpdateNotifierReg {
 
   static const luaL_Reg methods[] = {
     { "connect", raw_connect<T, Context *, const string&>},
+    { "notify", WRAP((notify<T, Context*, const string&>))},
     { NULL, NULL },
   };
 
@@ -1557,6 +1563,7 @@ namespace KeyEventNotifierReg {
 
   static const luaL_Reg methods[] = {
     { "connect", raw_connect<T, Context *, const KeyEvent&>},
+    { "notify", WRAP((notify<T, Context*, const KeyEvent&>))},
     { NULL, NULL },
   };
 

@hchunhui

Copy link
Copy Markdown
Owner

是否需要引入,讨论有结果吗?目前状态是可能会引起崩溃?

@fxliang

fxliang commented Aug 22, 2025

Copy link
Copy Markdown
Contributor Author

如果是在回调里去调对应的notifier又没条件跳过,是会崩,死循环

@shewer

shewer commented Aug 28, 2025

Copy link
Copy Markdown
Contributor

如果是在回调里去调对应的notifier又没条件跳过,是会崩,死循环

還有 使用 select_notifier:notify() 一定要檢查 not composition:empty()

@fxliang

fxliang commented Aug 29, 2025

Copy link
Copy Markdown
Contributor Author

如果是在回调里去调对应的notifier又没条件跳过,是会崩,死循环

還有 使用 select_notifier:notify() 一定要檢查 not composition:empty()

递归触发的事加了几行,应该解了。select_notifier的额外处理还要再想想

@shewer

shewer commented Aug 29, 2025

Copy link
Copy Markdown
Contributor

如果是在回调里去调对应的notifier又没条件跳过,是会崩,死循环

還有 使用 select_notifier:notify() 一定要檢查 not composition:empty()

递归触发的事加了几行,应该解了。select_notifier的额外处理还要再想想

在 notify() 檢查 select_notifier 和 空 segments 是可行的

 template<typename T, typename C, typename ... I>
 static void notify(T& t, C c, I... i) {
     if (reinterpret_cast<void*>(&t) == reinterpret_cast<void*>(&c->select_notifier()) && c->composition().empty()) {
       LOG(ERROR) << "notify of select error error : segments is empty";
       return;
     }
     t(c, i...);
   }
 }

沒有 segmnt
[0][./lua/selector.lua:48] → ctx.select_notifier:notify(ctx)
E20250830 00:40:56.381100 125181873077888 types.cc:1487] select_notify() error : composition empty

有segment
[0][./lua/selector.lua:48] → ctx.select_notifier:notify(ctx)
------commit-- 日 --------------
I20250830 00:41:38.769528 125181873077888 engine.cc:238] applying formatters.
I20250830 00:41:38.769569 125181873077888 engine.cc:255] committing composition: 日
I20250830 00:41:38.769675 125181873077888 memory.cc:42] memorize commit entry: 日
I20250830 00:41:38.769794 125181873077888 level_db.cc:182] update db entry: /tick => 298
I20250830 00:41:38.769826 125181873077888 level_db.cc:182] update db entry: a 日 => c=35 d=17.192 t=298
I20250830 00:41:38.769839 125181873077888 table_translator.cc:330] history: [user_table]日[user_table]日[user_table]日
I20250830 00:41:38.769862 125181873077888 table_translator.cc:349] phrase: 日日
I20250830 00:41:38.769984 125181873077888 encoder.cc:208] code = a, index = 0, start = 1
I20250830 00:41:38.769992 125181873077888 encoder.cc:208] code = a, index = -1, start = 1
I20250830 00:41:38.769998 125181873077888 encoder.cc:208] code = a, index = 0, start = 0
I20250830 00:41:38.770004 125181873077888 encoder.cc:208] code = a, index = 1, start = 1
I20250830 00:41:38.770024 125181873077888 encoder.cc:208] code = a, index = -1, start = 1
I20250830 00:41:38.770029 125181873077888 encoder.cc:258] encode '日日': [a a] -> [aa]
I20250830 00:41:38.770060 125181873077888 level_db.cc:182] update db entry: encaa 日日 => c=0 d=0.1 t=298
I20250830 00:41:38.770072 125181873077888 table_translator.cc:349] phrase: 日日日
I20250830 00:41:38.770115 125181873077888 encoder.cc:208] code = a, index = 0, start = 1
I20250830 00:41:38.770121 125181873077888 encoder.cc:208] code = a, index = -1, start = 1
I20250830 00:41:38.770125 125181873077888 encoder.cc:208] code = a, index = 0, start = 0
I20250830 00:41:38.770130 125181873077888 encoder.cc:208] code = a, index = -1, start = 1
I20250830 00:41:38.770133 125181873077888 encoder.cc:208] code = a, index = -1, start = 0
I20250830 00:41:38.770137 125181873077888 encoder.cc:258] encode '日日日': [a a a] -> [aaa]
I20250830 00:41:38.770150 125181873077888 level_db.cc:182] update db entry: encaaa 日日日 => c=0 d=0.1 t=298
I20250830 00:41:38.770253 125181873077888 engine.cc:159] active input:
I20250830 00:41:38.770259 125181873077888 segmentation.cc:58] reset to 0 segments.
I20250830 00:41:38.770263 125181873077888 segmentation.cc:64] diff pos: 0
I20250830 00:41:38.770268 125181873077888 engine.cc:172] CalculateSegmentation, segments: 0, finished? 1
I20250830 00:41:38.770274 125181873077888 engine.cc:204] TranslateSegments: []
I20250830 00:41:38.770281 125181873077888 engine.cc:168] composition: []

@shewer

shewer commented Aug 30, 2025

Copy link
Copy Markdown
Contributor

我準備在 context 中加入 xxxx_notify()
一是方便 ContextReg 直接註冊 method,
二是可利用 exception 中止傳播
三 在 Context::select_notify() 中檢查 空 segments
在 librime-lua connect (function 如果使用 error("::STOP_SLOT:::") 產生 exception 中止

+class StopSlotException : public std::runtime_error {
+ public:
+  using std::runtime_error::runtime_error;
+};
+
 class RIME_DLL Context {
  public:
   using Notifier = signal<void(Context* ctx)>;
@@ -81,6 +85,32 @@ class RIME_DLL Context {
   // options and properties starting with '_' are local to schema;
   // others are session scoped.
   void ClearTransientOptions();
+  template <typename T, typename... I>
+  void notify(T& t, I&&... i) {
+    try {
+      t(i...);
+    } catch (const StopSlotException& e) {
+      LOG(INFO) << "stop slot " << e.what();
+    }
+  };
+  void commit_notify() { notify(commit_notifier_, this); };
+  void select_notify() {
+    if (this->composition().empty())
+      return;
+    notify(select_notifier_, this);
+  }
+  void update_notify() { notify(update_notifier_, this); };
+  void delete_notify() { notify(delete_notifier_, this); };
+  void abort_notify() { notify(abort_notifier_, this); };
+  void option_update_notify(const string& option) {
+    notify(option_update_notifier_, this, option);
+  };
+  void property_update_notify(const string& property) {
+    notify(property_update_notifier_, this, property);
+  };
+  void unhandled_key_notify(const rime::KeyEvent& key_event) {
+    notify(unhandled_key_notifier_, this, key_event);
+  };

librime-lua raw_connect

template<typename T, typename ... I>
static int raw_connect(lua_State *L) {
  Lua *lua = Lua::from_state(L);
  T & t = LuaType<T &>::todata(L, 1);
  an<LuaObj> o = LuaObj::todata(L, 2);
  auto f = [lua, o](I... i) {
    auto r = lua->void_call<an<LuaObj>, Context *>(o, i...);
    if (!r.ok()) {
      auto e = r.get_err();
      if ( e.e.find("::STOP_SLOT::") !=  string::npos) {  // <---------
           throw rime::StopSlotException(e.e);
      }
      LOG(ERROR) << "Context::Notifier error(" << e.status << "): " << e.e;
    }
  };
--- lua script
function init(env)


     env.commit_notify = env.engine.context.commit_notifier:connect(
           function(ctx)
                    -- .......
                     error("::STOP_SLOT::  stop commit")
            end, 0)  -- 0 是group  把這傳播function  排在 Engine::OnCommit() 前,就會中止後面的 OnCommit() 呼叫
end





@fxliang

fxliang commented Aug 30, 2025

Copy link
Copy Markdown
Contributor Author

我準備在 context 中加入 xxxx_notify() 一是方便 ContextReg 直接註冊 method, 二是可利用 exception 中止傳播 三 在 Context::select_notify() 中檢查 空 segments 在 librime-lua connect (function 如果使用 error("::STOP_SLOT:::") 產生 exception 中止

+class StopSlotException : public std::runtime_error {
+ public:
+  using std::runtime_error::runtime_error;
+};
+
 class RIME_DLL Context {
  public:
   using Notifier = signal<void(Context* ctx)>;
@@ -81,6 +85,32 @@ class RIME_DLL Context {
   // options and properties starting with '_' are local to schema;
   // others are session scoped.
   void ClearTransientOptions();
+  template <typename T, typename... I>
+  void notify(T& t, I&&... i) {
+    try {
+      t(i...);
+    } catch (const StopSlotException& e) {
+      LOG(INFO) << "stop slot " << e.what();
+    }
+  };
+  void commit_notify() { notify(commit_notifier_, this); };
+  void select_notify() {
+    if (this->composition().empty())
+      return;
+    notify(select_notifier_, this);
+  }
+  void update_notify() { notify(update_notifier_, this); };
+  void delete_notify() { notify(delete_notifier_, this); };
+  void abort_notify() { notify(abort_notifier_, this); };
+  void option_update_notify(const string& option) {
+    notify(option_update_notifier_, this, option);
+  };
+  void property_update_notify(const string& property) {
+    notify(property_update_notifier_, this, property);
+  };
+  void unhandled_key_notify(const rime::KeyEvent& key_event) {
+    notify(unhandled_key_notifier_, this, key_event);
+  };

librime-lua raw_connect

template<typename T, typename ... I>
static int raw_connect(lua_State *L) {
  Lua *lua = Lua::from_state(L);
  T & t = LuaType<T &>::todata(L, 1);
  an<LuaObj> o = LuaObj::todata(L, 2);
  auto f = [lua, o](I... i) {
    auto r = lua->void_call<an<LuaObj>, Context *>(o, i...);
    if (!r.ok()) {
      auto e = r.get_err();
      if ( e.e.find("::STOP_SLOT::") !=  string::npos) {  // <---------
           throw rime::StopSlotException(e.e);
      }
      LOG(ERROR) << "Context::Notifier error(" << e.status << "): " << e.e;
    }
  };
--- lua script
function init(env)


     env.commit_notify = env.engine.context.commit_notifier:connect(
           function(ctx)
                    -- .......
                     error("::STOP_SLOT::  stop commit")
            end, 0)  -- 0 是group  把這傳播function  排在 Engine::OnCommit() 前,就會中止後面的 OnCommit() 呼叫
end

那你得说服佛振😀

@shewer

shewer commented Aug 30, 2025

Copy link
Copy Markdown
Contributor

很難 ,先送 PR吧

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants