From: 諏訪子 Date: Wed, 9 Oct 2024 06:23:11 +0000 (+0900) Subject: Wayland対応の追加 X-Git-Url: http://10.10.0.4:5575/?a=commitdiff_plain;h=636ff171f60b23c9c4c7495340fc7ec022f37d08;p=sp.git Wayland対応の追加 --- 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);