在 Ubuntu 22.04 下,对 gnome shell 的 dbus 调用不起作用

在 Ubuntu 22.04 下,对 gnome shell 的 dbus 调用不起作用

简单示例:在 Ubuntu 20.04 下,以下命令:

gdbus call -e -d org.gnome.Shell -o /org/gnome/Shell -m org.gnome.Shell.Eval true

产生以下输出:

(true, 'true')

但在 22.04 下,相同的命令会产生以下输出:

(false,'')

我在 22.04 下尝试过的任何其他“Eval”语句都会产生相同的输出。

出了什么问题?20.04 和 22.04 系统都是新安装的,原始安装。

更新:这似乎是 gcdev 存在的问题之一(https://askubuntu.com/users/1216972/gcdev) 早些时候试图报道:

如何获取 Ubuntu 22.04 中当前活动窗口?

答案1

与其他地方一样,Gnome Shell 也实施了更严格的安全性。

org.gnome.Shell 接口为其他核心组件提供私有 API,以实现桌面功能(如设置或全局键绑定)。它不打算用作公共 API,因此请将其限制为一组预期调用者。

https://gitlab.gnome.org/GNOME/gnome-shell/-/commit/a628bbc4

这就是许多此类命令不再起作用的原因。可以global.context.unsafe_mode = true在 Looking Glass 中输入 ( Alt+ F2, lg Enter) 以使它们在当前会话中起作用。有一个扩展,不安全模式菜单,允许在安全和不安全模式之间切换(感谢 Bryan Wright)。还应该能够启动 Gnome Shell带有--unsafe选项。

答案2

补充一下 vanadium 的回答,

这是一个将 gdb 附加到 gnome-shell 进程的脚本,并调用 javascript 引擎来切换不安全变量。

这意味着只要在此过程中没有任何中断,您就不需要重新启动会话来添加标志,或处理附加组件或类似的事情。

这是最重要的一行:

gdb -p "$gnome_pid" -batch -ex "调用 (void*)gjs_context_eval((void*)gjs_context_get_current(), "$1", -1, "", 0, 0)"

将 $1 替换为需要运行的代码,例如:

global.context.unsafe_mode = true

请注意,这有点危险且不受支持。如果 gdb 没有完成,会话将挂起。我建议在 screen 或 tmux 中运行它,并在 UI 挂起时以某种方式访问​​它。

相关内容