gtk のトレイバーのすぐ上/下にウィンドウを設定する必要があるプログラムを作成しています。失敗した2つのアプローチを使用してみました。1 つは、gtk_status_icon_position_menu 関数を使用して、ユーザーがクリックした場所 (トレイ バー) にウィンドウを配置することでした。問題は、これらのソリューションが gnome (Linux) では機能するが、Windows では機能しないことです。Linux では、ウィンドウ マネージャがトレイ パネルにウィンドウを配置することを許可していないように見えるため、これらは機能します。Windows ではこれは発生せず、ウィンドウが画面から「はみ出す」ことがありますが、これは当然のことながら望ましくありません。
これで、私は回避策に出かけました。私の考えは、ウィンドウをマウスクリックの位置に設定し、通常のウィンドウ配置の x 座標と y 座標を取得し、それが画面の境界内にあるかどうかをサイズチェックすることでした。そうでない場合は、修正を行います。必要な関数を思いつきましたが、何らかの理由で gdk_drawable_get_size(window->window ,&WindowWidth, &WindowHeight) および他の同様の関数は、シグナル関数の 2 回目の実行後にのみ正しいサイズ値を提供します。最初の実行の結果は、サイズと幅の両方に対してちょうど 1 です。(私は X11 が正しい結果を与えない問題を読みましたが、これはそうではないと思います)
event_button = (GdkEventButton *) event;
if (event_button->button == 1)
{
if (active == 0)
{
gboolean dummy;
gint WindowHeight, WindowWidth, WindowPosition[2];
GdkScreen *screen;
gint ScreenHeight, ScreenWidth;
dummy = FALSE;
gtk_widget_show_all(window);
gtk_window_present(GTK_WINDOW(window));
gtk_status_icon_position_menu(menu, &pos[X], &pos[Y], &dummy, statusicon);
gtk_window_move(GTK_WINDOW(window), pos[X],pos[Y]);
gdk_drawable_get_size(window->window ,&WindowWidth, &WindowHeight);
screen = gtk_status_icon_get_screen(statusicon);
ScreenWidth = gdk_screen_get_width(screen);
ScreenHeight = gdk_screen_get_height(screen);
g_print("Screen: %d, %d\nGeometry: %d, %d\n",ScreenWidth, ScreenHeight, WindowWidth, window->allocation.height);
gtk_entry_set_text(GTK_ENTRY(entry),"");
active = 1;
return TRUE;
}
ポータブルな方法でやりたいことを行うにはどうすればよいですか?