如何在锁定屏幕上移动锁定窗口?

是否可以将锁定屏幕上输入密码的窗口移离中心,例如在下边缘?

对于Unity / Gnome,该位置是硬编码的,需要修补gnome-screensaver源并重建它

我不认为这很困难

对不起,但它 ,因为它是硬编码的,至少对于Unity和Gnome来说:

  • 锁定对话框和锁定屏幕是gnome-screensaver包的一部分。
  • 对话框的位置通过gnome-screensaver/src/gs-window-x11.c第1212行/周围的代码来控制:

         window-> priv-> lock_box = gtk_alignment_new(0.5,0.5,0,0);
    
  • 0.5,0.5是锁定对话框的相对X和Y维中心坐标(范围从0=left/top1=right/bottom )。

  • 将其设置为例如0.1, 0.9得到所需的左下对齐。 当然,这需要从源代码重新编译:(
  • 结果:

    在此处输入图像描述 旧的宽屏截图


补丁

 --- gnome-screensaver-3.4.1.orig / src / gs-window-x11.c 2012-06-04 18:14:11.000000000 -0700
 +++ gnome-screensaver-3.4.1 / src / gs-window-x11.c 2012-06-04 18:14:36.972433823 -0700
 @@ -1209,7 +1209,7 @@
                      guint32 id)
  {
          window-> priv-> lock_socket = gtk_socket_new();
 -  window-> priv-> lock_box = gtk_alignment_new(0.5,0.5,0,0);
 + window-> priv-> lock_box = gtk_alignment_new(0.1,0.9,0,0);
          gtk_widget_show(window-> 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 install build-essential dpkg-dev
 sudo apt-get build-dep gnome-screensaver
 mkdir gssrc && cd gssrc
 apt-get source gnome-screensaver
 wget -Olockbox-left.patch http://pastebin.com/raw.php?i=pqDYRrW1
 patch -i lockbox-left.patch
 cd gnome-screensaver-3.4.1
 dpkg-source --commit
 dpkg-buildpackage -us -uc
 cd ..
 sudo dpkg -i gnome-screensaver_3.4.1-0ubuntu1_ {i386 | amd64} .deb
 cd ..
 rm -rf gssrc
 killall / usr / bin / gnome-screensaver

无需注销或重新启动。 要卸载 ,只需执行apt-get --reinstall install gnome-screensaver 。 每当gnome-screensaver更新时,您都需要重复整个补丁构建安装过程,因此请保持它以使生活更轻松,并在您准备好后进行更新。


你是怎么想到的? (按要求)

不,我不是开发人员之一,但我对C / C ++有很好的了解。 否则,它就是谷歌和启发式。 🙂

  1. 谷歌告诉你没有明显的方法来回答这个问题。
  2. 它还告诉你锁定对话框是由gnome-screensaver提供的
  3. 下载源代码并进行检查 嗯, gs-lock-plug.c听起来很有趣:
    •  create_page_one(GSLockPlug *插件)
       {
       GtkWidget *对齐;
       ...
       align = gtk_alignment_new(0.5,0.5,1,1);
      
  4. 那可能是它! 查找gtk_alignment_new语法,更改为gtk_alignment_new并重建。 不起作用:(
  5. 请注意源文件夹中的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):处理窗口对话框改变了:up
       [handle_window_dialog_up] gs-manager.c:851(19:26:42):处理对话框
      
  6. 看看gs-manager.h ,其中包括:
    • gboolean gs_manager_request_unlock (GSManager *manager);
  7. 检查gs-manager.c
    •  gs_manager_request_unlock(GSManager * manager)
       {
       GSWindow *窗口;
       ...
       / *找到包含指针的GSWindow * /
       window = find_window_at_pointer(manager);
       gs_window_request_unlock(window);
       }
      
  8. gs_window_request_unlock不是来自gs-managergrep -i -r -n gs_window_request . 揭示了:
    •  ./gs-manager.c:1353:gs_window_request_unlock(window);
       ./gs-window.h:92:void gs_window_request_unlock(GSWindow * window);
       ./test-window.c:66:gs_window_request_unlock(window);
       ./gs-window-x11.c:1518:gs_window_request_unlock(GSWindow * window)
      
  9. 尝试跳到gs-window-x11.c第1518行; gs_window_request_unlock没有直接帮助,但包含许多gs_window_request_unlock window->priv mentions。
  10. 查看gs-window-x11.c开头附近的struct GSWindowPrivate gs-window-x11.c 。 它包含GtkWidget *lock_boxGtkWidget *lock_socket
  11. 在文件中搜索lock_box出现次数; 第三个结果是:
    • window->priv->lock_box = gtk_alignment_new (0.5, 0.5, 0, 0);
  12. 做一点精神上的胜利舞蹈,改变,建立,测试,成功,发布答案,编辑答案……并赢得赏金? 🙂