From ac241f98be494b6d8ddee7ff553a8f37ab15c82b Mon Sep 17 00:00:00 2001
From: gholk <gholk@disroot.org>
Date: Sat, 1 Nov 2025 23:57:35 +0800
Subject: feat: option to specify enable or disable

---
 eve.cpp            | 10 ++++++++++
 gcin-conf.h        |  3 +++
 gcin-im-toggle.cpp | 16 ++++++++++++++--
 gcin.cpp           |  7 +++++--
 4 files changed, 32 insertions(+), 4 deletions(-)

diff --git a/eve.cpp b/eve.cpp
index fe4c5a7..d29a905 100644
--- a/eve.cpp
+++ b/eve.cpp
@@ -803,6 +803,10 @@ void tsin_set_eng_ch(int nmod);
 int current_kbd_state;
 
 void toggle_im_enabled()
+{
+  toggle_im_switch_to(GCIN_IM_TOGGLE_TOGGLE);
+}
+void toggle_im_switch_to(int act)
 {
 //    dbg("toggle_im_enabled\n");
 #if WIN32
@@ -810,6 +814,8 @@ void toggle_im_enabled()
 		return;
 #endif
 
+    int toggle = GCIN_IM_TOGGLE_TOGGLE,
+        enable = GCIN_IM_TOGGLE_ENABLE, disable = GCIN_IM_TOGGLE_DISABLE;
     check_CS();
 
     if (current_CS->in_method < 0)
@@ -824,12 +830,15 @@ void toggle_im_enabled()
 
     if (current_CS->im_state != GCIN_STATE_DISABLED) {
       if (current_CS->im_state == GCIN_STATE_ENG_FULL) {
+        if (act == disable) return;
         current_CS->im_state = GCIN_STATE_CHINESE;
         disp_im_half_full();
         save_CS_current_to_temp();
         return;
       }
 
+      if (act == enable) return;
+
       flush_edit_buffer();
 
       hide_in_win(current_CS);
@@ -842,6 +851,7 @@ void toggle_im_enabled()
 
       disp_tray_icon();
     } else {
+      if (act == disable) return;
       if (!current_method_type())
         init_gtab(current_CS->in_method);
 
diff --git a/gcin-conf.h b/gcin-conf.h
index c4e4b36..d7bafca 100755
--- a/gcin-conf.h
+++ b/gcin-conf.h
@@ -4,6 +4,9 @@
 #define RELOAD_TSIN_DB "reload tsin db"
 #define GCIN_EXIT_MESSAGE "gcin exit"
 #define GCIN_IM_TOGGLE "gcin im toggle"
+#define GCIN_IM_TOGGLE_TOGGLE 0
+#define GCIN_IM_TOGGLE_ENABLE 1
+#define GCIN_IM_TOGGLE_DISABLE 2
 
 
 #define GCIN_FONT_SIZE "gcin-font-size"
diff --git a/gcin-im-toggle.cpp b/gcin-im-toggle.cpp
index d7b31b2..5770faa 100644
--- a/gcin-im-toggle.cpp
+++ b/gcin-im-toggle.cpp
@@ -1,9 +1,21 @@
 #include "gcin.h"
 
-int main()
+int main(int argc, char **argv)
 {
   gdk_init(NULL, NULL);
-  send_gcin_message(GDK_DISPLAY(), GCIN_IM_TOGGLE);
+  char msg[20];
+  msg[0] = NULL;
+  int act;
+  if (argc == 1) act = GCIN_IM_TOGGLE_TOGGLE;
+  else if (!strcmp(argv[1], "-enable")) act = GCIN_IM_TOGGLE_ENABLE;
+  else if (!strcmp(argv[1], "-disable")) act = GCIN_IM_TOGGLE_DISABLE;
+  else if (!strcmp(argv[1], "-toggle")) act = GCIN_IM_TOGGLE_TOGGLE;
+  else {
+    dbg("unknown opt %s", argv[1]);
+    return 1;
+  }
+  sprintf(msg, "%s %d", GCIN_IM_TOGGLE, act);
+  send_gcin_message(GDK_DISPLAY(), msg);
 
   return 0;
 }
diff --git a/gcin.cpp b/gcin.cpp
index 2179e88..41c06ac 100755
--- a/gcin.cpp
+++ b/gcin.cpp
@@ -358,6 +358,7 @@ void kbm_toggle()
 void reload_tsin_db();
 void reload_en_db();
 void do_exit();
+extern void toggle_im_switch_to(int act);
 
 void message_cb(char *message)
 {
@@ -382,8 +383,10 @@ void message_cb(char *message)
      reload_tsin_db();
      reload_en_db();
    } else
-   if (!strcmp(message, GCIN_IM_TOGGLE)) {
-     toggle_im_enabled();
+   if (strstr(message, GCIN_IM_TOGGLE) == message) {
+     int act;
+     sscanf(&message[strlen(GCIN_IM_TOGGLE)], " %d", &act);
+     toggle_im_switch_to(act);
    } else
    if (!strcmp(message, GCIN_EXIT_MESSAGE)) {
      do_exit();
-- 
2.39.5

