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