web-dev-qa-db-ja.com

ロック画面でロックウィンドウを移動する方法

ロック画面のパスワードを入力したウィンドウを中心から移動することは可能ですか?下端で?

7
Psirus

Unity/Gnomeの場合、位置はハードコーディングされており、gnome-screensaverソースにパッチを適用して再構築する必要があります

これが非常に難しいとは思わない

申し訳ありませんが、少なくともUnityとGnomeについてはハードコードされているため、isです。

  • ロックダイアログとロック画面はgnome-screensaverパッケージの一部です。
  • ダイアログの位置は、gnome-screensaver/src/gs-window-x11.cの行1212付近のコードのこのビットを介して制御されます。

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

または raw 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が更新されるたびにpatch-build-installプロセス全体を繰り返す必要があるので、準備ができたら作業を楽にし、更新するためにそれを保持します。


どのようにこれを理解しましたか? (リクエストにより)

いいえ、私は開発者の1人ではありませんが、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):画面0のロック解除のリクエスト
       [gs_window_request_unlock] gs-window-x11.c:1522(19:26: 42):ロック解除を要求します(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 * window; 
       ... 
      /*ポインターを含むGSWindowを見つけます*/
       window = find_window_at_pointer(manager); 
       gs_window_request_unlock(window); 
      } 
      
  8. gs_window_request_unlockgs-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. gs-window-x11.cの行1518にヒューリスティックにジャンプします。 gs_window_request_unlockは直接助けにはなりませんが、いくつかのwindow->privの言及が含まれています。
  10. struct GSWindowPrivateの先頭近くにあるgs-window-x11.cを見てください。 GtkWidget *lock_boxGtkWidget *lock_socketが含まれています
  11. ファイル内でlock_boxの出現を検索します。 3番目の結果は次のとおりです。
    • window->priv->lock_box = gtk_alignment_new (0.5, 0.5, 0, 0);
  12. 少しの精神的な勝利のダンス、変更、構築、テスト、成功、回答の投稿、回答の編集を行い、賞金を獲得しますか? :)
22
ish