У меня есть класс (называемый BorderWindow
), который фактически обернут вокруг GtkWidget
. Этот класс представляет границу вокруг окна конкретного приложения (например, скажем, окна терминала). Внутри BorderWindow
конструктора я создаю таймер, поэтому каждую секунду вызывается функция BorderWindow::ClockTick
.
Внутри этой функции размер границы (на самом деле GtkWidget
) сравнивается с окном привязанного приложения (в нашем случае это Terminal), и, если оно отличается, вызывается gtk_window_resize
. Однако, если я позвоню, то gtk_window_get_size
вернет старые значения.
gboolean BorderWindow::ClockTick(gpointer data)
{
auto that = reinterpret_cast<BorderWindow*>(data);
int x = 0, y = 0;
GtkWindow* pWindow = GTK_WINDOW(that->m_borderWindowHandle);
gtk_window_get_size(pWindow, &x, &y);
DUMPER_INFO("curr size: %dx%d; new size: %dx%d", x, y, that->m_windowRect.width, that->m_windowRect.height); // added for debug
if(x != that->m_windowRect.width || y != that->m_windowRect.height)
{
gtk_window_resize(pWindow, that->m_windowRect.width, that->m_windowRect.height);
that->CreateBorder();
GtkWindow* pWindow = GTK_WINDOW(that->m_borderWindowHandle); // added for debug
gtk_window_get_size(pWindow, &x, &y); // added for debug
DUMPER_INFO("after resize: %dx%d", x, y); // added for debug
}
gtk_window_get_position(pWindow, &x, &y);
if(x != that->m_windowRect.x || y != that->m_windowRect.y)
{
gtk_window_move(pWindow, that->m_windowRect.x, that->m_windowRect.y);
}
gdk_window_invalidate_rect(gtk_widget_get_window(that->m_borderWindowHandle), nullptr, FALSE);
that->m_highlightFrame = !that->m_highlightFrame;
return TRUE;
}
Вот отладочный вывод
20-05-19 11: 24: 40.294 [139856177248000] ИНФОРМАЦИЯ 1537 %% - статический gboolean LinuxBorderWindow :: ClockTick (gpointer): размер курсора: 734x540; новый размер: 1024x706
20-05-19 11: 24: 40.295 [139856177248000] ИНФОРМАЦИЯ 1537 %% - статический gboolean LinuxBorderWindow :: ClockTick (gpointer): после изменения размера: 734x540
Итак, как вы можете видеть, окно не было изменено.
Этот фрагмент кода отлично работает для xfce и Unity DE, но не работает для GNOME (и GNOME classic).
Может кто-нибудь объяснить, что я делаю неправильно и как изменить размер окна для GNOME DE?
Благодаря.