Я пишу программу, которая должна установить окно чуть выше/ниже панели трея для gtk. Я попытался использовать 2 подхода, которые не увенчались успехом. Один использовал функцию gtk_status_icon_position_menu и помещал окно в точку, где пользователь щелкает (в панели задач). Проблема в том, что эти решения работают в gnome (Linux), но не в Windows. В Linux они работают, потому что оконный менеджер, похоже, не позволяет размещать окна в панели задач, соблюдая максимально возможное. В Windows этого не происходит, и окно может «выйти» за пределы экрана, что по понятным причинам нежелательно.
С этими словами я вышел на работу вокруг. Моя идея заключалась в том, чтобы установить окно в месте щелчка мыши и получить координаты x и y нормального размещения окна, а также проверить его размер, будет ли оно находиться в пределах границ экрана. Если это не так, сделайте поправку. Я придумал необходимые функции, но по какой-то причине gdk_drawable_get_size(window->window ,&WindowWidth, &WindowHeight) и другие подобные функции дают правильное значение размера только после второго запуска функции сигнала. Результат первого прогона равен 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;
}
Как я могу делать то, что хочу, портативным способом?