Как переместить окно блокировки на экран блокировки?

Можно ли переместить окно, где вы вводите пароль на экране блокировки, от центра, например на нижнем краю?

7
задан 5 June 2012 в 06:55

1 ответ

Для Единицы/Gnome положение трудно кодируется и требует исправления gnome-screensaver источник и восстановление его

Я не ожидаю, что это будет очень трудно

Извините, но это, потому что это трудно кодируется, по крайней мере, для Единицы и 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/top кому: 1=right/bottom).

  • Установка его к, например. 0.1, 0.9 дает Ваше желаемое нижнее левое выравнивание. Конечно, это требует перекомпиляции от источника :(
  • Результат:

    enter image description here более старый широкоэкранный снимок экрана


Патч

--- 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++. Иначе это - весь Google и эвристика.:)

  1. Google говорит Вам, что нет никакого очевидного способа ответить на этот вопрос.
  2. Это также говорит Вам, что диалоговым окном блокировки обеспечивают gnome-screensaver
  3. Загрузите источник и исследуйте. Хм, gs-lock-plug.c интересные звуки:
    • create_page_one (GSLockPlug *plug)
      {
      GtkWidget            *align;
      ...
      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):    Requesting unlock for screen 0
      [gs_window_request_unlock] gs-window-x11.c:1522 (19:26:42):  Requesting unlock
      [window_dialog_up_changed_cb] gs-manager.c:909 (19:26:42):   Handling window dialog up changed: up
      [handle_window_dialog_up] gs-manager.c:851 (19:26:42):   Handling dialog up
      
  6. Посмотрите на gs-manager.h, который включает:
    • gboolean gs_manager_request_unlock (GSManager *manager);
  7. Исследовать gs-manager.c:
    • gs_manager_request_unlock (GSManager *manager)
      {
      GSWindow * window;
      ...
      /* Find the GSWindow that contains the pointer */
      window = find_window_at_pointer (manager);
      gs_window_request_unlock (window);
      }
      
  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.c; gs_window_request_unlock не помогает непосредственно, но содержит много window->priv упоминания.
  10. Посмотрите на struct GSWindowPrivate около начала gs-window-x11.c. Это содержит GtkWidget *lock_box и GtkWidget *lock_socket
  11. Поиск случаев lock_box в файле; третий результат:
    • window->priv->lock_box = gtk_alignment_new (0.5, 0.5, 0, 0);
  12. Сделайте немного умственного танца победы, изменение, сборку, протестируйте, следуйте, отправьте ответ, отредактируйте ответ.. и щедрость победы?:)
22
ответ дан 5 June 2012 в 06:55

Другие вопросы по тегам:

Похожие вопросы: