gnome-terminalマウスの中ボタンでタブを閉じる

親愛なるハブロフチアン!



彼らが言うように、事件は就業日の終わりのであり、何もすることはなかった。



ブラウザのタブをマウスの中ボタンで閉じて、仕事がないかスポーツに興味があるので便利なように思えたので、これをgnome-terminalに実装することにしました。

ホットキーが足りなかったわけではなく、この機会をそこに残したかっただけです。

これがどのように起こったのか、私が遭遇した問題に興味があるなら、猫へようこそ。



開始する



コーヒーで武装して、私はgnome-terminalのソースを探しに行きました。 Googleは元気に最初のリンクソースを発行しました。



ターミナルの最新バージョンをダウンロードしたので(私は、些細なことだと思います..)ひどく壊れていたので、コンパイルできませんでした:(



この問題について口論して、システムにインストールされた端末のバージョン(2.33.0)をダウンロードしました。これは正常にコンパイルされました。 「研究」を始めました。



ソースコードの報告





GTKについての私の知識は非常に表面的なものであるため、コードの可読性と幸運がソースコードの研究を開始することを望んでいました。



ファイルを閲覧していると、terminal-tab-label.cがおもしろそうに見え、タブを閉じるボタンの作成を見つけたとき、私は正しい場所にいると判断しました。



ドキュメントで少しざわめきました(ドキュメントのリンクが壊れているという事実が少し動揺ています)が、碑文でマウスクリックをキャッチするには、次のコードを挿入する必要があることに気付きました。

g_signal_connect (label, "button-press-event", G_CALLBACK (click_label_cb), tab_label);
      
      





しかし、失望は私を待っていた、イベントは処理されませんでした。



ドキュメントには、「この信号を受信するには、ウィジェットに関連付けられたGdkWindowでGDK_BUTTON_PRESS_MASKマスクを有効にする必要があります。」



必要な場合は、必要です。 コードの検索と部分分析により、どこにでもフォームの行を追加しました。

 gdk_window_set_events(root_window, GDK_BUTTON_PRESS_MASK|GDK_BUTTON_RELEASE_MASK);
      
      





しかし、再びそれは破壊され、効果はありませんでした。 まだプラスがありますが。 メインウィンドウを検索しているときに、興味深い関数terminal_window_init(terminal-window.c)、つまり次の行に出会いました。

  g_signal_connect (priv->notebook, "button-press-event", G_CALLBACK (notebook_button_press_cb), window);
      
      





その結果、私はそこに侵入しようとしました。

少し整理して、私はこの決定に来ました:

 .... static gboolean notebook_button_press_cb (GtkWidget *widget, GdkEventButton *event, TerminalWindow *window) { TerminalWindowPrivate *priv = window->priv; GtkNotebook *notebook = GTK_NOTEBOOK (widget); GtkWidget *menu; GtkAction *action; int tab_clicked; //   . if (event->type == GDK_BUTTON_PRESS && event->button == 2 ){ tab_clicked = find_tab_num_at_pos (notebook, event->x_root, event->y_root); if (tab_clicked < 0) return FALSE; /* switch to the page the mouse is over */ gtk_notebook_set_current_page (notebook, tab_clicked); action = gtk_action_group_get_action (priv->action_group, "PopupCloseTab"); gtk_action_activate (action); return TRUE; } //   . if (event->type != GDK_BUTTON_PRESS || .....
      
      





さて、それだけです! うまくいく!



ささいなこと





成功に触発されて、コードを完成させて、「同時に」(何かが実行されている場合はタブを閉じることを確認する)1つの迷惑な些細なことを「削除」することにしました。

 do_confirm = gconf_client_get_bool (client, CONF_GLOBAL_PREFIX "/confirm_window_close", NULL);
      
      





gconf_client_get_boolを少しググリングして、設定ファイルを〜/ .gconf / apps / gnome-terminalで見つけました。

目的のプロパティを設定することで(または、正しく設定できない可能性があります)、残念ながら、

効果。 だから私は先に進むことにしました。



ソースでは、gnome-terminal.schemasとgnome-terminal.schemas.inの2つの場所でconfirm_window_close設定を見つけました。

次のようになります。

  <schema> <key>/schemas/apps/gnome-terminal/global/confirm_window_close</key> <applyto>/apps/gnome-terminal/global/confirm_window_close</applyto> <owner>gnome-terminal</owner> <type>bool</type> <default>true</default> <gettext_domain>gnome-terminal</gettext_domain> <locale name="C"> <short>Whether to ask for confirmation when closing terminal windows</short> <long>Whether to ask for confirmation when closing a terminal window which has more than one open tab.</long> </locale> </schema>
      
      







デフォルト値をfalseに変更すると、すべて機能しました。 やった!



それでは、変更をインストールする必要があります。これは、パッケージをビルド(推奨)してインストールするか、インストール(推奨されません)することで実行できます。



プレゼンテーションの混乱したスタイルについて事前に謝罪します。

ご清聴ありがとうございました!



All Articles