如何在锁屏上移动锁窗?

Psi*_*rus 7 gnome window-manager unity gtk lock-screen

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

ish*_*ish 22

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

我不认为这会很困难

抱歉,它,因为它是硬编码的,至少对于 Unity 和 Gnome:

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

        window->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-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();
- 窗口->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 源 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
光盘..
须藤 dpkg -i gnome-screensaver_3.4.1-0ubuntu1_{i386|amd64}.deb
光盘..
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 *plug)
      {
      GtkWidget *对齐;
      ...
      align = 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 *manager)
      {
      GSWindow * 窗口;
      ...
      /* 找到包含指针的 GSWindow */
      window = find_window_at_pointer (manager);
      gs_window_request_unlock(窗口);
      }
      
  8. gs_window_request_unlock不是来自gs-manager. grep -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. 启发式跳转到第 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. 做一点精神胜利的舞蹈,改变,构建,测试,成功,发布答案,编辑答案......并赢得赏金?:)