是否可以将在锁定屏幕上输入密码的窗口移出中心,例如移到下边缘?
答案1
对于 Unity/Gnome,该位置是硬编码的,需要修补gnome-screensaver
源代码并重建它
我认为这不会太难
抱歉,但是是,因为它是硬编码的,至少对于 Unity 和 Gnome 来说是这样:
- 锁定对话框和锁定屏幕是该
gnome-screensaver
包的一部分。 对话框的位置通过第 1212 行左右的这段代码控制
gnome-screensaver/src/gs-window-x11.c
:窗口->priv->lock_box = gtk_alignment_new (0.5, 0.5, 0, 0);
是
0.5, 0.5
锁定对话框的相对 X 和 Y 维中心坐标(范围从0=left/top
到1=right/bottom
)。- 将其设置为 eg
0.1, 0.9
可实现所需的左下对齐。当然,这需要从源代码重新编译 :( 结果:
补丁
--- gnome-screensaver-3.4.1.orig/src/gs-window-x11.c 2012-06-04 18:14:11.000000000 -0700 +++gnome-屏幕保护程序-3.4.1/src/gs-window-x11.c 2012-06-04 18:14:36.972433823 -0700 @@ -1209,7 +1209,7 @@ guint32 id) { 窗口->priv->lock_socket = gtk_socket_new (); - window->priv->lock_box = gtk_alignment_new (0.5, 0.5, 0, 0); +窗口->priv->lock_box = gtk_alignment_new (0.1, 0.9, 0, 0); gtk_widget_show(窗口->priv->lock_box); gtk_box_pack_start (GTK_BOX (window->priv->vbox), window->priv->lock_box, TRUE, TRUE, 0);
或查看原始 pastebin
0.1, 0.9
根据口味定制。
构建和安装
sudo apt-get 安装 build-essential dpkg-dev sudo apt-get build-dep gnome 屏幕保护程序 mkdir gssrc && cd gssrc apt-get 源 gnome 屏幕保护程序 wget -Olockbox-left.patch http://pastebin.com/raw.php?i=pqDYRrW1 补丁-i 锁箱-left.patch cd gnome-屏幕保护程序-3.4.1 dpkg-source --commit dpkg-buildpackage -us -uc 光盘 .. sudo dpkg -i gnome-screensaver_3.4.1-0ubuntu1_{i386|amd64}.deb 光盘 .. rm-rf gssrc killall /usr/bin/gnome 屏幕保护程序
无需注销或重新启动。卸载,只需执行apt-get --reinstall install gnome-screensaver
。每次更新时,您都需要重复整个补丁构建安装过程gnome-screensaver
,因此请保留它以使生活更轻松,并在准备好时进行更新。
你是怎么想出这个答案的?(应要求)
不,我不是开发人员,但我对 C/C++ 有相当的了解。除此之外,一切都靠 Google 和启发式方法。:)
- 谷歌告诉你没有明显的方法来回答这个问题。
- 它还告诉您锁定对话框由
gnome-screensaver
- 下载源代码并检查。嗯,
gs-lock-plug.c
听起来很有趣:创建页面一 (GSLockPlug *plug) { GtkWidget *对齐; ... 对齐 = gtk_alignment_new (0.5, 0.5, 1, 1);
- 可能就是这样!查找
gtk_alignment_new
语法,更改为0.1, 0.9
并重建。不起作用 :( - 注意
debug-screensaver.sh
在源文件夹中,运行它,然后锁定并登录。输出包含:[find_window_at_pointer] gs-manager.c:668 (19:26:42): 请求解锁屏幕 0 [gs_window_request_unlock] gs-window-x11.c:1522 (19:26:42): 请求解锁 [window_dialog_up_changed_cb] gs-manager.c:909 (19:26:42): 处理窗口对话框向上更改:向上 [handle_window_dialog_up] gs-manager.c:851 (19:26:42): 处理对话框
- 查看
gs-manager.h
,其中包括:gboolean gs_manager_request_unlock (GSManager *manager);
- 检查
gs-manager.c
:gs_manager_request_unlock (GSManager *管理器) { GSWindow *窗口; ... /* 查找包含指针的 GSWindow */ 窗口 = find_window_at_pointer(管理器); gs_window_request_unlock(窗口); }
gs_window_request_unlock
不是来自gs-manager
。grep -i -r -n gs_window_request .
揭示:./gs-manager.c:1353: gs_window_request_unlock (窗口); ./gs-window.h:92:void gs_window_request_unlock (GSWindow *window); ./test-window.c:66: gs_window_request_unlock (窗口); ./gs-window-x11.c:1518:gs_window_request_unlock (GSWindow *窗口)
- 启发式地跳转到第 1518 行
gs-window-x11.c
;gs_window_request_unlock
没有直接的帮助,但包含许多window->priv
提及。 - 看看 的
struct GSWindowPrivate
开头附近gs-window-x11.c
。它包含GtkWidget *lock_box
和GtkWidget *lock_socket
- 在文件中搜索出现的次数
lock_box
;第三个结果是:window->priv->lock_box = gtk_alignment_new (0.5, 0.5, 0, 0);
- 跳一小段精神胜利舞,改变、构建、测试、成功、发表答案、编辑答案……并赢得赏金?:)