【问题标题】:Open wish without stealing focus打开愿望而不窃取焦点
【发布时间】:2023-04-02 21:50:01
【问题描述】:

我想在 linux (kde,vnc) 上打开一个 Tcl/Tk 对话框并将一些信息放入:

package require Tk
toplevel .my
pack [label .my.l -text "hallo"]

执行此操作,对话框打开,新对话框获得焦点。

我怎样才能防止这种情况发生?

package require Tk
toplevel .my
<something with> .my
pack [label .my.l -text "hallo"]

我看到了几个关于类似主题的问题,但没有关于 Tcl/Tk 的问题。

【问题讨论】:

  • 焦点应该在哪里?您可以使用focus . 将焦点更改为另一个窗口(例如,我在这里使用.)。否则,我不确定您为什么要阻止焦点。我发现我实际上想要在为应用程序编写代码时让我的子窗口成为焦点,否则它会困扰我。
  • 它与窗口管理器的关系比与 Tk 的关系更大。不幸的是,没有多少窗口管理器可以防止焦点窃取(我最近读到 Cinnamon 支持这一点)。我真的很想拥有这个功能。
  • @Jerry: 假设我有一个 XTERM 并运行一个 TK Gui,焦点在 TK GUI,我必须重新关注。
  • 如果是窗口管理器的问题,能否在TK GUI中获取当前的WindowsID infocus,保存,打开GUI并重新关注原始ID?
  • @tbasien 嗯,如果你在 Windows 上,我会说你必须获取 twapi 包,然后获取 XTERM 的窗口句柄(例如,如果窗口标题是 XTERM,那么你使用set handle [::twapi::find_windows -text "XTERM"] 获取窗口句柄,然后 ::twapi::show_window [lindex $handle 0] 将焦点设置到该窗口)。如果获得了多个句柄,则需要优化查找。我不确定mac是否有类似的包:(

标签: linux tcl x11 tk tclsh


【解决方案1】:

这高度依赖于窗口管理器。 对于 metacity 和 marco,有一个名为“focus-new-windows”的设置可以更改为“strict”。

配合marco窗口管理器:

gsettings set org.mate.Marco.general focus-new-windows strict

我不使用 KDE,但您可以尝试: 系统设置 -> 窗口行为 -> 焦点 看看那里有没有有用的设置。

Compiz 在常规选项 -> 焦点中有一个焦点防止设置。

【讨论】:

  • 这是我的问题的解决方案:
【解决方案2】:

这是我的解决方案:

 1  package require Tk

 2  proc leave {w e} {
 3      puts "gui left $w $e ..."
 4      if {$e != $w}  return
 5      focusHandler::restore

 6  }

 7  proc press {w} {
 8      puts "press $w"
 9      focusHandler::save
10      bind $w <Leave> focusHandler::restore
11      wm overrideredirect  [winfo toplevel $w] 0
12      raise  $w
13      focus -force $w
14      wm overrideredirect  [winfo toplevel $w] 1

15  }

16  namespace eval focusHandler {
17      variable helper
18  }
19  proc focusHandler::save {} {
20      variable helper
21      if ![info exists helper] {
22          puts "create helper"
23          set helper .xxx[clock clicks]
24          # create a new toplevel window
25          # this is controlled by the window manager
26          toplevel $helper
27          wm geometry $helper 0x0-1-1
28      }
29      puts "set focus of helper $helper"
30      raise $helper
31      update 
32      after 100
33  }
34  proc focusHandler::restore {} {
35      variable helper
36      if ![info exists helper] return
37      # destroy this toplevel and windows manager focus on the last know window
38      # which is not this gui, because of overrideredirect
39      destroy $helper
40      unset helper
41  }

42  wm withdraw .
43  toplevel .my
44  wm overrideredirect  .my 1
45  text .my.text  -height 10 -width 40
46  button .my.exit -command exit -text exit
47  bind .my.text <ButtonPress-1> [list press %W]
48  pack .my.text
49  pack .my.exit

【讨论】:

    猜你喜欢
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    相关资源
    最近更新 更多