LINUX.ORG.RU

Wayland и GTK3 получение размера окна

 , , ,


0

4

Привет всем!

Используя XORG , я получаю правильные размеры окна в колбаке «size-allocate». И это работает и на GTK2 и на GTK3. Размер получается вместе с шапкой и бордюрами.

Однако , используя Wayland , этот размер сильно увеличен. Так например , выставив размер окна 200х200 , я получаю 252х289. Хотя если банально померить окно программой-линейкой (KRuler) , то там приблизительно 200х239.

  1. Почему так происходит?
  2. Как правильно получить настоящие размеры окна вместе с шапкой и бордюрами?
Ответ на: комментарий от anonymous

Причины есть , но я назову самую главную: Есть функционал в GTK , который должен возвращать правильные размеры , но возвращает «погоду на марсе». Правильно ли закрывать глаза на этот баг , только лишь потому что вы или кто-то еще никогда не пользуется данным функционалом?

IAmInLinux
() автор топика
Ответ на: комментарий от PPP328

В смысле? Пример что-ли показать? Так он простой:

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

void resize(GtkWidget *pWidget, GdkRectangle *rect, gpointer pUser_data)
{
    printf("%d,%d\n" , rect->width , rect->height);
}

int main(int argc, char *argv[]) {
    gtk_init(&argc, &argv);
    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "Example");
    gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
    g_signal_connect(G_OBJECT(window), "size-allocate", G_CALLBACK (&resize), 0);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    gtk_widget_show_all(window);
    gtk_main();
    return 0;
}
IAmInLinux
() автор топика
Ответ на: комментарий от IAmInLinux

Причины есть , но я назову самую главную: Есть функционал в GTK , который должен возвращать правильные размеры , но возвращает «погоду на марсе».

Это не причина. Я спросил какова причина, зачем это нужно?

Правильно ли закрывать глаза на этот баг , только лишь потому что вы или кто-то еще никогда не пользуется данным функционалом?

Я интересуюсь со стороны разработчика GTK, потому что эта часть API будет задепрекейчена. Она не имела смысла никогда, а сейчас она не может адекватно работать в принципе, потому что не учитывает масштабирования, и вообще что вы собрались мерить когда окно на одном мониторе имеет пиксельный размер в полтора раза больше чем на другом? Вот мне интересно, вдруг у вас валидный кейс.

anonymous
()
Ответ на: комментарий от anonymous

Как обычно, клоуны-фанаты GTK (как и wayland) истерят на тему «ЭТО ВАМ НЕНУЖНО!!».

Банальный пример - приложение с тремя областями, главная по центру. Нужно, чтобы когда по ширине окно становится достаточно узким сворачивать боковые панели, и делать центральное на всю ширину. Как в InvokeAI. Почему-то жабаскрипт-обезьяны смогли освоить такую черную магию, а GTK-фанатики продолжают орать о ненужности.

PPP328 ★★★★★
()
Ответ на: комментарий от anonymous

эта часть API будет задепрекейчена

Что ты несёшь? В Gtk2/Gtk3 уже никогда ничего не будет задепрекейчено

Она не имела смысла никогда

Чувствуется мнение экперда.

anonymous
()

Почему так происходит?

В иксах то что показывает в условном xprop - это размер клиентского окна без рамки. Если включить CSD в GTK, то этот размер будет больше даже в иксах. Полагаю что в Wayland-е и есть этот CSD. В целом правильно, в Wayland-е в большинстве серверов SSD не подразумевается.

Skullnet ★★★★☆
()
Последнее исправление: Skullnet (всего исправлений: 1)

Почему так происходит?

wayland

Как правильно получить настоящие размеры окна вместе с шапкой и бордюрами?

В общем случае никак

arax ★★
()
Ответ на: комментарий от PPP328

Это установка размера. Как вы его получаете?

Посмотрите пример еще раз (он ведь небольшой). В процедуре resize происходит получение размеров. Для простоты понимания, я вывожу их в консоль.

Она не имела смысла никогда, а сейчас она не может адекватно работать в принципе

На xOrg же работает адекватно , почему на wayland-е косяк? А практическая причина: например программное позиционирование окошек. Как вы узнаете , влезут ли ваши созданные окна на экран , без знания реальных размеров этих окошек?

IAmInLinux
() автор топика
Ответ на: комментарий от IAmInLinux

Ради интереса поробовал на Wayland твой тест (зачем использовать замшелый Gtk3? Пришлось поставить Gtk3 в систему).

Как видно, скриншот окна Example имеет поля для тени и размеры полностью совпали. Т.ч. EXL прав.

anonymous
()
Ответ на: комментарий от anonymous

Если даже это так , то я даже не знаю , что сказать ХОРОШЕГО по поводу того , что внесли тени в общий размер окна. Если мы переместим окно в начало экрана , скажем по координатам 1,1 , то отсчет будет слева от начала тени? Нет! Окошко вплотную прижмется своим левым бордюром к левой стороне экрана , забыв про тень.

IAmInLinux
() автор топика
Ответ на: комментарий от IAmInLinux

Попробовал на Gtk4 повесится на свойства default-width и default-height. Все работает как ты хочешь на Wayland. Может не нужно трогать труп в виде Gtk3?

public class Resize.Window : Gtk.ApplicationWindow {
    [GtkChild] private unowned Gtk.Label label_w;
    [GtkChild] private unowned Gtk.Label label_h;

    public Window (Gtk.Application app) {
        Object (application: app);
        this.notify["default-width"].connect (default_width_changed_cb);
        this.notify["default-height"].connect (default_height_changed_cb);
    }
    private void default_width_changed_cb () {
        label_w.label = "Width: " + this.default_width.to_string ();
    }
    private void default_height_changed_cb () {
        label_h.label = "Height: " + this.default_height.to_string ();
    }
}
anonymous
()
Ответ на: комментарий от anonymous

Попробовал на Gtk4 повесится на свойства default-width и default-height. Все работает как ты хочешь на Wayland. Может не нужно трогать труп в виде Gtk3?

При изменении размеров окна , возвращаются правильные значения?

IAmInLinux
() автор топика
Ответ на: комментарий от anonymous

Да

Ну что же , похоже действительно надо уже ближе знакомиться с GTK4. Оброс я тиной с этими старыми тулкитами. Спасибо всем , кто участвовал в теме!

IAmInLinux
() автор топика
Ответ на: комментарий от arax

Топик то о том, что не получается под Wayland на Gtk3: Wayland и GTK3 получение размера окна (комментарий)

Чесно говоря не знаю о ssd и не хочу знать, но предполагаю, что Gtk не может знать о размерах заголовка с server side. Соотвественно не имеет смысла это делать средствами Gtk

anonymous
()
Ответ на: комментарий от IAmInLinux

На Gtk3 gtk_window_get_size тоже не работает как надо на Wayland, выводит размеры без учета высоты TitleBar.

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

void on_resize(GtkWindow *window, gpointer pUser_data) {
    int width, height;
    gtk_window_get_size (window, &width, &height);
    printf("gtk_window_get_size: %d,%d\n" , width , height);
}

int main(int argc, char *argv[]) {
    gtk_init(&argc, &argv);
    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "Example");
    gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
    g_signal_connect(G_OBJECT(window), "size-allocate", G_CALLBACK (&on_resize), 0);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    gtk_widget_show_all(window);
    gtk_main();
    return 0;
}
anonymous
()
Ответ на: комментарий от anonymous

тоже не работает как надо на Wayland

Оно работает так как это описано в документации:
This function will return the logical size of the GtkWindow, excluding the widgets used in client side decorations; there is, however, no guarantee that the result will be completely accurate because client side decoration may include widgets that depend on the user preferences and that may not be visibile at the time you call this function.

arax ★★
()