LINUX.ORG.RU

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

 , , ,


0

3

Привет всем!

Используя 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
()