From 636ff171f60b23c9c4c7495340fc7ec022f37d08 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E8=AB=8F=E8=A8=AA=E5=AD=90?= Date: Wed, 9 Oct 2024 15:23:11 +0900 Subject: [PATCH] =?utf8?q?Wayland=E5=AF=BE=E5=BF=9C=E3=81=AE=E8=BF=BD?= =?utf8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + src/otppass.c | 21 ++++++++++++++------- src/yankpass.c | 21 ++++++++++++++------- 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee0331f..a4ef4e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ * 複数サイトで同じパスワードを利用かどうか、パスワードの長さ、又はパスワードの強さの確認 * パスワードコピーの期間を設定出来る様に * ワンタイムパスワード(OTP)を表示せずにコピー機能性の追加 +* Wayland対応の追加 # 1.4.0 * Haiku対応 diff --git a/src/otppass.c b/src/otppass.c index 34e7126..39aaec8 100644 --- a/src/otppass.c +++ b/src/otppass.c @@ -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); } diff --git a/src/yankpass.c b/src/yankpass.c index 6d64ad7..d79463c 100644 --- a/src/yankpass.c +++ b/src/yankpass.c @@ -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); -- 2.43.0