web-dev-qa-db-fra.com

Comment déplacer la fenêtre de verrouillage sur l'écran de verrouillage?

Est-il possible de déplacer la fenêtre dans laquelle vous entrez votre mot de passe sur l'écran de verrouillage en l'éloignant du centre, par exemple au bord inférieur?

7
Psirus

Pour Unity/Gnome, la position est codée en dur et nécessite de patcher la source gnome-screensaver et de la reconstruire.

Je ne m'attends pas à ce que ce soit très difficile

Désolé, mais est , car c'est codé en dur, du moins pour Unity et Gnome:

  • La boîte de dialogue et l'écran de verrouillage font partie du paquetage gnome-screensaver.
  • La position du dialogue est contrôlée via ce bit de code à/autour de la ligne 1212 dans gnome-screensaver/src/gs-window-x11.c:

     window-> priv-> lock_box = gtk_alignment_new (0.5, 0.5, 0, 0); 
    
  • Les 0.5, 0.5 sont les coordonnées relatives des centres des dimensions X et Y de la boîte de dialogue de verrouillage (allant de 0=left/top à 1=right/bottom).

  • En le configurant à, par exemple 0.1, 0.9 donne l'alignement souhaité en bas à gauche. Bien sûr, cela nécessite une recompilation depuis le source :(
  • Résultat:

    enter image description here ancienne capture d'écran large


Le 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_pack_start (GTK_BOX (window -> priv-> vbox), fenêtre-> priv-> lock_box, TRUE, TRUE, 0); 
 

ou voir Pastebin brut

  • Personnalisez le 0.1, 0.9 à votre goût.

Pour construire et installer

 Sudo apt-get installer build-essential dpkg-dev 
 Sudo apt-get compiler-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 --commet 
 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

Aucune déconnexion ou redémarrage nécessaire. Pour désinstaller , faites simplement un apt-get --reinstall install gnome-screensaver. Vous devrez répéter tout le processus de création du correctif-installation à chaque mise à jour de gnome-screensaver. Conservez-le pour vous simplifier la vie et mettez-le à jour lorsque vous êtes prêt.


Comment avez-vous compris cela? (sur demande)

Non, je ne suis pas un des développeurs, mais j'ai une bonne connaissance du C/C++. Sinon, tout est dans Google et l'heuristique. :)

  1. Google vous dit qu'il n'y a pas de moyen évident de répondre à cette question.
  2. Il vous indique également que la boîte de dialogue de verrouillage est fournie par gnome-screensaver
  3. Télécharger la source et examiner. Hmm, gs-lock-plug.c semble intéressant:
    •  create_page_one (GSLockPlug * plug) 
       {
       GtkWidget * align; 
       ... 
       align = gtk_alignment_new (0.5, 0.5, 1, 1 ); 
      
  4. Cela pourrait être ça! Recherchez la syntaxe gtk_alignment_new, passez à 0.1, 0.9 et reconstruisez-la. Ne fonctionne pas :(
  5. Remarquez debug-screensaver.sh dans le dossier source, exécutez-le, puis verrouillez-le et connectez-vous. La sortie contient:
    •  [find_window_at_pointer] gs-manager.c: 668 (19:26:42): Demande de déverrouillage pour l'écran 0 
       [gs_window_request_unlock] gs-window-x11.c: 1522 (19:26: 42): Demande de déverrouillage 
       [Window_dialog_up_changed_cb] gs-manager.c: 909 (19:26:42): La boîte de dialogue de gestion de la fenêtre vers le haut a changé: up 
       [Handle_window_dialog_up] gs-manager.c: 851 (19:26:42): Gestion du dialogue 
      
  6. Regardez gs-manager.h, qui comprend:
    • gboolean gs_manager_request_unlock (GSManager *manager);
  7. Examiner gs-manager.c:
    •  gs_manager_request_unlock (gestionnaire GSManager *) 
       {
       Fenêtre GSWindow *; 
       ... 
      /* Recherchez la fenêtre GS qui contient le pointeur */
       window = find_window_at_pointer (gestionnaire); 
       gs_window_request_unlock (window); 
      } 
      
  8. gs_window_request_unlock n'est pas de gs-manager. grep -i -r -n gs_window_request . révèle:
    •  ./ 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 (fenêtre); 
       ./ gs-window-x11.c: 1518: gs_window_request_unlock (fenêtre GSWindow *) 
      
  9. Passer heuristement à la ligne 1518 dans gs-window-x11.c; gs_window_request_unlock n'aide pas directement mais contient un certain nombre de window->priv mentions.
  10. Regardez struct GSWindowPrivate près du début de gs-window-x11.c. Il contient GtkWidget *lock_box et GtkWidget *lock_socket
  11. Rechercher les occurrences de lock_box dans le fichier; Le troisième résultat est:
    • window->priv->lock_box = gtk_alignment_new (0.5, 0.5, 0, 0);
  12. Faites un peu de victoire mentale mentale, changez, construisez, testez, réussissez, postez réponse, éditez réponse .. et gagnez des primes? :)
22
ish