Como mover a janela de bloqueio na tela de bloqueio?

7

É possível mover a janela onde você insere sua senha na tela de bloqueio do centro, por exemplo, na borda inferior?

    
por Psirus 01.06.2012 / 18:58

1 resposta

21

Para Unity / Gnome, a posição é codificada e requer a correção da gnome-screensaver source e sua reconstrução

  

Eu não espero que isso seja muito difícil

Desculpe, mas é , porque é codificado, pelo menos para o Unity e o Gnome:

  • A caixa de diálogo de bloqueio e a tela de bloqueio fazem parte do pacote gnome-screensaver .
  • A posição da caixa de diálogo é controlada por esse código na linha 1212 em gnome-screensaver/src/gs-window-x11.c :

        window->priv->lock_box = gtk_alignment_new (0.5, 0.5, 0, 0);
    
  • As 0.5, 0.5 são as coordenadas de centro de dimensão X e Y relativas da caixa de diálogo de bloqueio (variando de 0=left/top a 1=right/bottom ).

  • Definir como, por exemplo 0.1, 0.9 fornece o alinhamento de baixo para a esquerda desejado. Claro, isso requer recompilar a partir da fonte: (
  • Resultado:

    imagem de tela mais antiga do widescreen

O patch

--- 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);

ou veja o pastebin cru

  • Personalize o 0.1, 0.9 a gosto.

Para criar e instalar

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

Nenhum logout ou reinicialização é necessário. Para desinstalar , basta fazer um apt-get --reinstall install gnome-screensaver . Você precisará repetir todo o processo de patch-build-install sempre que gnome-screensaver for atualizado, então mantenha-o para facilitar a vida e atualizar quando estiver pronto.

Como você descobriu isso? (a pedido)

Não, eu não sou um dos desenvolvedores, mas tenho um conhecimento decente de C / C ++. Caso contrário, é tudo Google e heurística. :)

  1. O Google informa que não há uma maneira óbvia de responder a essa pergunta.
  2. Também informa que a caixa de diálogo de bloqueio é fornecida por gnome-screensaver
  3. Faça o download da origem e examine. Hmm, gs-lock-plug.c parece interessante:
    • create_page_one (GSLockPlug *plug)
      {
      GtkWidget            *align;
      ...
      align = gtk_alignment_new (0.5, 0.5, 1, 1);
      
  4. Pode ser isso! Procure a sintaxe gtk_alignment_new , mude para 0.1, 0.9 e reconstrua. Não funciona :(
  5. Observe debug-screensaver.sh na pasta de origem, execute-a e, em seguida, bloqueie e efetue login. Saída contém:
    • [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. Veja gs-manager.h , que inclui:
    • gboolean gs_manager_request_unlock (GSManager *manager);
  7. Examine 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 não é de gs-manager . grep -i -r -n gs_window_request . revela:
    • ./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. Salte heuristicamente para a linha 1518 em gs-window-x11.c ; gs_window_request_unlock não ajuda diretamente, mas contém várias window->priv menções.
  10. Veja struct GSWindowPrivate perto do início de gs-window-x11.c . Contém GtkWidget *lock_box e GtkWidget *lock_socket
  11. Procure por ocorrências de lock_box no arquivo; terceiro resultado é:
    • window->priv->lock_box = gtk_alignment_new (0.5, 0.5, 0, 0);
  12. Faça um pouco de dança da vitória mental, mude, construa, teste, tenha sucesso, poste resposta, edite resposta ... e ganhe recompensa? :)
por ish 04.06.2012 / 09:27