@@ -41,6 +41,9 @@ class QuickPhraseState : public InputContextProperty {
4141 InputBuffer buffer_;
4242 QuickPhrase *q_;
4343
44+ std::string originalBuffer_;
45+ QuickPhraseRestoreCallback restoreCallback_;
46+
4447 bool typed_ = false ;
4548 std::string text_;
4649 std::string prefix_;
@@ -57,6 +60,8 @@ class QuickPhraseState : public InputContextProperty {
5760 prefix_.clear ();
5861 str_.clear ();
5962 alt_.clear ();
63+ originalBuffer_.clear ();
64+ restoreCallback_ = nullptr ;
6065 key_ = Key (FcitxKey_None);
6166 ic->inputPanel ().reset ();
6267 ic->updatePreedit ();
@@ -222,18 +227,29 @@ QuickPhrase::QuickPhrase(Instance *instance)
222227 return ;
223228 }
224229 if (keyEvent.key ().check (FcitxKey_BackSpace)) {
230+ keyEvent.accept ();
225231 if (state->buffer_ .empty ()) {
226232 state->reset (inputContext);
227233 } else {
228234 if (state->buffer_ .backspace ()) {
235+ if (state->restoreCallback_ &&
236+ state->buffer_ .cursor () == state->buffer_ .size () &&
237+ state->buffer_ .userInput () ==
238+ state->originalBuffer_ ) {
239+ auto callback = std::move (state->restoreCallback_ );
240+ auto original = std::move (state->originalBuffer_ );
241+ state->reset (inputContext);
242+ callback (inputContext, original);
243+ return ;
244+ }
245+
229246 if (state->buffer_ .empty ()) {
230247 state->reset (inputContext);
231248 } else {
232249 updateUI (inputContext);
233250 }
234251 }
235252 }
236- keyEvent.accept ();
237253 return ;
238254 }
239255 if (keyEvent.key ().check (FcitxKey_Delete)) {
@@ -256,28 +272,32 @@ QuickPhrase::QuickPhrase(Instance *instance)
256272 if (key.check (FcitxKey_Home) || key.check (FcitxKey_KP_Home)) {
257273 state->buffer_ .setCursor (0 );
258274 keyEvent.accept ();
259- return updateUI (inputContext);
275+ updateUI (inputContext);
276+ return ;
260277 }
261278 if (key.check (FcitxKey_End) || key.check (FcitxKey_KP_End)) {
262279 state->buffer_ .setCursor (state->buffer_ .size ());
263280 keyEvent.accept ();
264- return updateUI (inputContext);
281+ updateUI (inputContext);
282+ return ;
265283 }
266284 if (key.check (FcitxKey_Left) || key.check (FcitxKey_KP_Left)) {
267285 auto cursor = state->buffer_ .cursor ();
268286 if (cursor > 0 ) {
269287 state->buffer_ .setCursor (cursor - 1 );
270288 }
271289 keyEvent.accept ();
272- return updateUI (inputContext);
290+ updateUI (inputContext);
291+ return ;
273292 }
274293 if (key.check (FcitxKey_Right) || key.check (FcitxKey_KP_Right)) {
275294 auto cursor = state->buffer_ .cursor ();
276295 if (cursor < state->buffer_ .size ()) {
277296 state->buffer_ .setCursor (cursor + 1 );
278297 }
279298 keyEvent.accept ();
280- return updateUI (inputContext);
299+ updateUI (inputContext);
300+ return ;
281301 }
282302 }
283303 if (!state->typed_ && !state->str_ .empty () &&
@@ -294,7 +314,8 @@ QuickPhrase::QuickPhrase(Instance *instance)
294314
295315 // compose is invalid, ignore it.
296316 if (!compose) {
297- return event.accept ();
317+ event.accept ();
318+ return ;
298319 }
299320
300321 if (!compose->empty ()) {
@@ -539,6 +560,20 @@ void QuickPhrase::setBuffer(InputContext *ic, const std::string &text) {
539560 updateUI (ic);
540561}
541562
563+ void QuickPhrase::setBufferWithRestoreCallback (
564+ InputContext *ic, const std::string &text, const std::string &original,
565+ QuickPhraseRestoreCallback callback) {
566+ auto *state = ic->propertyFor (&factory_);
567+ if (!state->enabled_ ) {
568+ return ;
569+ }
570+ state->buffer_ .clear ();
571+ state->buffer_ .type (text);
572+ state->originalBuffer_ = original;
573+ state->restoreCallback_ = std::move (callback);
574+ updateUI (ic);
575+ }
576+
542577class QuickPhraseModuleFactory : public AddonFactory {
543578 AddonInstance *create (AddonManager *manager) override {
544579 return new QuickPhrase (manager->instance ());
0 commit comments