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

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

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

答案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/top1=right/bottom)。

  • 将其设置为 eg0.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 和启发式方法。:)

  1. 谷歌告诉你没有明显的方法来回答这个问题。
  2. 它还告诉您锁定对话框由gnome-screensaver
  3. 下载源代码并检查。嗯,gs-lock-plug.c听起来很有趣:
    • 创建页面一 (GSLockPlug *plug)
      {
      GtkWidget *对齐;
      ...
      对齐 = gtk_alignment_new (0.5, 0.5, 1, 1);
      
  4. 可能就是这样!查找gtk_alignment_new语法,更改为0.1, 0.9并重建。不起作用 :(
  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): 处理窗口对话框向上更改:向上
      [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 *管理器)
      {
      GSWindow *窗口;
      ...
      /* 查找包含指针的 GSWindow */
      窗口 = find_window_at_pointer(管理器);
      gs_window_request_unlock(窗口);
      }
      
  8. gs_window_request_unlock不是来自gs-managergrep -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 *窗口)
      
  9. 启发式地跳转到第 1518 行gs-window-x11.cgs_window_request_unlock没有直接的帮助,但包含许多window->priv提及。
  10. 看看 的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. 跳一小段精神胜利舞,改变、构建、测试、成功、发表答案、编辑答案……并赢得赏金?:)

相关内容