2

Linux デスクトップの効果的な動作を見つけるにはどうすればよいですか (つまり、画面の高さ - タスクバーの高さ)。

これは、c++/gtkmm で書いているプログラムに必要です。ウィンドウを画面の右下隅、タスクバーの上に配置したいと考えています。

最初に、ウィンドウを最大化し、その高さを確認して、画面の高さから差し引いてみました。何らかの理由で、最大化前の高さが得られるため、機能しません。

4

2 に答える 2

1

特にユーザーが同じデスクトップを使用していない場合 (KDE、GNOME、Unity など)、これを確実に判断できる可能性は低いです。タスクバーの横に通知を表示するには、libnotifyを使用する方がよいでしょう。プログラムでコールバックをトリガーするボタンを通知に追加できます。

于 2012-09-08T19:55:31.263 に答える
1

map-eventウィンドウのサイズを確認する前に、イベントを待つ必要があります。

apmasell と senshikaze が述べたこととは異なり、GTK+ を使用してこれを確実に行うことができます。ただし、関連する信号 ( map-eventconfigure-eventscreen-changedvisibility-notify-eventおよびおそらくwindow-state-event) に接続する必要があります。これにより、画面の解像度やツールバーが変更されたときに、小さなウィンドウが正しく移動/サイズ変更されます。

たとえば、私は個人的に XFCE4 で 2 つの自動非表示バーを使用しています。右下隅に「ドッキング」された小さなツール ウィンドウがある場合、下のバーが表示されているときに邪魔にならないように移動します。

libnotifyウィンドウが純粋な通知ウィンドウである場合、通常の通知ウィンドウを生成するために使用する(たとえば、notify-send ...子プロセスとして実行する) のが最適であるという apmasell に同意します。

概念実証として、ここに小さな C プログラム を示します。このプログラムはsize.c、完全に透明な装飾されていないウィンドウを使用して情報を取得します。

#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <stdio.h>

int screen_width = -1;
int screen_height = -1;

int window_left = -1;
int window_top = -1;
int window_width = -1;
int window_height = -1;

void done(GtkWidget *widget, void *payload)
{
    GdkScreen *screen = gtk_widget_get_screen(widget);

    screen_width = gdk_screen_get_width(screen);
    screen_height = gdk_screen_get_height(screen);

    gtk_window_get_position((GtkWindow *)widget, &window_left, &window_top);
    gtk_window_get_size((GtkWindow *)widget, &window_width, &window_height);

    gtk_widget_destroy(widget);
    gtk_main_quit();
}

int main(int argc, char *argv[])
{
    GtkWidget *window;

    gtk_init(&argc, &argv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_opacity((GtkWindow *)window, 0.0);
    gtk_window_set_decorated((GtkWindow *)window, (gboolean)FALSE);
    gtk_window_maximize((GtkWindow *)window);
    gtk_widget_show(window);

    g_signal_connect(window, "map-event", G_CALLBACK(done), NULL);
    gtk_main();

    if (screen_width > 0 && screen_height > 0)
        printf("Screen is %d x %d pixels\n", screen_width, screen_height);

    if (window_width > 0 && window_height > 0)
        printf("Window is %d x %d pixels\n", window_width, window_height);

    if (window_left > 0)
        printf("There is a %d pixel wide left bar\n", window_left);

    if (window_left >= 0 && window_width > 0 && screen_width > 0 && window_width + window_left < screen_width)
        printf("There is a %d pixel wide right bar\n", screen_width - (window_width + window_left));

    if (window_top > 0)
        printf("There is a %d pixel tall top bar\n", window_top);

    if (window_top >= 0 && window_height > 0 && screen_height > 0 && window_height + window_top < screen_height)
        printf("There is a %d pixel tall bottom bar\n", screen_height - (window_height + window_top));

    return 0;
}

を使用してコンパイル

gcc -W -Wall size.c `pkg-config --cflags --libs gtk+-3.0` -o size

または、まだ GTK+ 2 を使用している場合は、

gcc -W -Wall size.c `pkg-config --cflags --libs gtk+-2.0` -o size

を使用して実行し./sizeます。テスト プログラムはスナップショットのみを提供することに注意してください。実際のプログラムは、前述の信号に接続して画面またはツールバーの変更を検出し、それに応じてウィンドウのサイズ/位置を更新する必要があります。

これが役に立つことを願っています。

于 2012-09-08T20:33:14.613 に答える