]> Nishi Git Mirror - sp.git/commitdiff
Wayland対応の追加
author諏訪子 <suwako@076.moe>
Wed, 9 Oct 2024 06:23:11 +0000 (15:23 +0900)
committer諏訪子 <suwako@076.moe>
Wed, 9 Oct 2024 06:23:11 +0000 (15:23 +0900)
CHANGELOG.md
src/otppass.c
src/yankpass.c

index ee0331f1690b332b6e5be4e358ebde4681d9f3f4..a4ef4e635c83161a5d34126d42a611fcc59de04b 100644 (file)
@@ -4,6 +4,7 @@
 * 複数サイトで同じパスワードを利用かどうか、パスワードの長さ、又はパスワードの強さの確認
 * パスワードコピーの期間を設定出来る様に
 * ワンタイムパスワード(OTP)を表示せずにコピー機能性の追加
+* Wayland対応の追加
 
 # 1.4.0
 * Haiku対応
index 34e7126062ed1e0f592f33aee37a77016de9600d..39aaec88f0cfa23dfdad10f62496e14d636461d2 100644 (file)
@@ -113,11 +113,13 @@ void otppass(char *file, int isCopy, int copyTimeout) {
   if (isCopy == 1 && copyTimeout > 300) copyTimeout = 300;
   char *lang = getlang();
 
-  // Xセッションではない場合(例えば、SSH、TTY、Gayland等)、showpass()を実行して
-  if (isCopy == 1 && getenv("DISPLAY") == NULL) {
+  int isGay = (getenv("WAYLAND_DISPLAY") != NULL);
+
+  // Xセッションではない場合(例えば、SSH、TTY等)、otppass()を実行して
+  if (isCopy == 1 && getenv("DISPLAY") == NULL && getenv("WAYLAND_DISPLAY") == NULL) {
     if (strncmp(lang, "en", 2) == 0)
-      puts("There is no X session, so running 'sp -o'.");
-    else puts("Xセッションではありませんので、「sp -o」を実行します。");
+      puts("There is no X or Wayland session, so running 'sp -o'.");
+    else puts("X又はWaylandセッションではありませんので、「sp -o」を実行します。");
     otppass(file, 0, 0);
     return;
   }
@@ -202,11 +204,13 @@ void otppass(char *file, int isCopy, int copyTimeout) {
 
   if (isCopy) {
     char cmd[64];
-    snprintf(cmd, sizeof(cmd), "echo -n %06d | xclip -selection clipboard", otp);
+    if (isGay) snprintf(cmd, sizeof(cmd), "echo -n %06d | wl-copy", otp);
+    else snprintf(cmd, sizeof(cmd), "echo -n %06d | xclip -selection clipboard", otp);
+
     int ret = system(cmd);
     if (ret != 0) {
       char *ero = (strncmp(lang, "en", 2) == 0 ?
-          "Failed to copy OTP." : "OTPをコピーに失敗。");
+          "Failed to copy OTP." : "ワンタイムパスワードをコピーに失敗。");
       fprintf(stderr, "%s\n", ero);
     }
 
@@ -226,8 +230,11 @@ void otppass(char *file, int isCopy, int copyTimeout) {
         copyTimeout,
         "秒後はクリップボードから取り消されます。"
       );
+
     sleep(copyTimeout);
-    system("echo -n \"\" | xclip -selection clipboard");
+
+    if (isGay) system("echo -n \"\" | wl-copy");
+    else system("echo -n \"\" | xclip -selection clipboard");
   } else {
     printf("%06d\n", otp);
   }
index 6d64ad754947007c38735abdb528318fa9953a88..d79463c0cb935f13b118ec0076558acfad591bb8 100644 (file)
@@ -9,11 +9,13 @@ void yankpass(char *file, int copyTimeout) {
   if (copyTimeout > 300) copyTimeout = 300;
   char *lang = getlang();
 
-  // Xセッションではない場合(例えば、SSH、TTY、Gayland等)、showpass()を実行して
-  if (getenv("DISPLAY") == NULL) {
+  int isGay = (getenv("WAYLAND_DISPLAY") != NULL);
+
+  // Xセッションではない場合(例えば、SSH、TTY等)、showpass()を実行して
+  if (getenv("DISPLAY") == NULL && getenv("WAYLAND_DISPLAY") == NULL) {
     if (strncmp(lang, "en", 2) == 0)
-      puts("There is no X session, so running 'sp -s'.");
-    else puts("Xセッションではありませんので、「sp -s」を実行します。");
+      puts("There is no X or Wayland session, so running 'sp -s'.");
+    else puts("X又はWaylandセッションではありませんので、「sp -s」を実行します。");
     showpass(file);
     return;
   }
@@ -86,8 +88,12 @@ void yankpass(char *file, int copyTimeout) {
     return;
   }
 
-  // xclipを準備して
-  FILE *pipe = popen("xclip -selection clipboard", "w");
+  // xclip又はwl-copyを準備して
+  char *cmd;
+  if (isGay) cmd = "wl-copy";
+  else cmd = "xclip -selection clipboard";
+
+  FILE *pipe = popen(cmd, "w");
   if (pipe == NULL) {
     // 掃除
     fclose(gpgfile);
@@ -133,7 +139,8 @@ void yankpass(char *file, int copyTimeout) {
       "秒後はクリップボードから取り消されます。"
     );
   sleep(copyTimeout);
-  system("echo -n | xclip -selection clipboard");
+  if (isGay) system("echo -n \"\" | wl-copy");
+  else system("echo -n \"\" | xclip -selection clipboard");
 
   // 掃除
   fclose(gpgfile);