Linux

升級後,標題欄中的 X 按鈕不再關閉 xterm

  • March 19, 2014

理論上,按下關閉按鈕kwin關閉按鈕應該關閉一個 xterm。在我做aptitude upgrade. (我正在執行 Debian 測試)。但現在它沒有了——點擊 X 什麼也沒做——而只是對某些xterms 而言。

特別是,如果我從 KDE 快速啟動或 K 菜單啟動 xterm,則這些 xterm 是可關閉的。但是,如果我從鍵盤快捷鍵 (khotkeys) 啟動它,則該 xterm 是不可關閉的。

此外,這是遞歸的:如果我從一個 xterm 啟動一個 xterm,如果它的父項是,它是可關閉的。

這一般不會發生。它僅適用於 xterm。我已經測試過從不可關閉的 xterm 啟動這些應用程序,它們都是可關閉的:

  • gvim
  • 時鐘
  • xditview
  • 海豚
  • 控制台

在那裡穿插另一個程序會破壞鏈條(例如,從 konsole 啟動一個 xterm):

  • xterm(不可關閉)→ xterm(不可關閉)→ xterm(不可關閉)→ …
  • xterm(不可關閉)→ konsole(可關閉)→ xterm(可關閉)→ …

我檢查了我的 kwin 視窗規則,我沒有任何 xterm。

更新:這是 nVidia

Stephen Dowdy 回應了 Debian 錯誤報告並暗示它可能是一個 nVidia 錯誤。它正在破壞信號遮罩。一些搜尋發現Debian Bug #728743,確實切換到 Nouveau/MESA(開源驅動程序)已經解決了這個問題。

請注意,降級到較舊的 nVidia 驅動程序並沒有,這可能意味著它的 nVidia 驅動程序 + 其他一些較新版本的東西,我沒有費心去追查,因為該錯誤的評論者聲稱它已在 331.38 中修復。(我現在正在執行 331.49,它確實已修復)。

來自 strace 的結果

我在兩個版本上都執行了 strace。經過一些過濾(以使 diff 更好地工作),我看到一堆行,例如:

WORKING  rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
*vs*
BROKEN   rt_sigprocmask(SIG_BLOCK, NULL, [HUP], 8) = 0

看來損壞的版本已阻止 SIGHUP。點擊 X 似乎發送了一個 SIGHUP,該信號被忽略,因此 shell 不會退出。您可以通過將 SIGHUP 擷取在 shell 中而不退出(但不是相反,因為 shell 似乎永遠不會獲得 HUP)來使工作中斷。

我已經為此送出了Debian bug #733816

作為一種解決方法,您可以使用這個簡單的 C 程序包裝熱鍵命令:

#include <signal.h>
#include <stddef.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
   sigset_t set;

   if (argc < 2) {
       fprintf(stderr, "ERROR: Expected at least a command to run\n"
               "\n"
               "USAGE: %s command [arguments]\n",
               argv[0]);
       exit(EXIT_FAILURE);
   }

   sigemptyset(&set);
   sigaddset(&set, SIGHUP);
   sigprocmask(SIG_UNBLOCK, &set, NULL);

   execvp(argv[1], argv+1);
}

通過編譯(比如說,to ~/bin/unblock-hup)然後呼叫~/bin/unblock-hup xterm而不是呼叫它來使用它xterm。請注意,在自定義快捷方式控制模組中,您必須將完整路徑放入主目錄;~不起作用。

引用自:https://unix.stackexchange.com/questions/107331