LINUX.ORG.RU

Каким образом разрабатывается GTK?

 


0

1

Разъясните, каким образом сейчас разрабатывается GTK.
Вроде была новость о том, что там каждые полгода будет выходить стабильный релиз тулкита и так далее, но я что-то так до конца и не врубился в эту систему.
Как поддержка планируется старых версий? Т.е будут ли, например, приложения с gtk3 нормально собираться и работать с gtk4?

Deleted

Т.е будут ли, например, приложения с gtk3 нормально собираться и работать с gtk4?

Если не использовал всякое deprecated, то будет.

Вот почитай(там совсем чуток), какие требования к gtk3 проге, чтобы она заработала на gtk4:

https://developer.gnome.org/gtk4/3.94/gtk-migrating-3-to-4.html

fsb4000 ★★ ()

Как поддержка планируется старых версий?

На бумаге-то красиво, но по факту приблизительно «поддерживай сам как хочешь», потому что гномы любят всё ломать.

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

Вот почитай(там совсем чуток), какие требования к gtk3 проге, чтобы она заработала на gtk4:

https://developer.gnome.org/gtk4/3.94/gtk-migrating-3-to-4.html

Ты бы сам сначала прочитал, прежде чем глупость написать. Как и в любом софте, мажорный релиз == изменение ABI/API, об этом сказано в первом же предложении в приведенной тобой ссылке: «GTK+ 4 is a major new version of GTK+ that breaks both API and ABI compared to GTK+ 3.x.» gtk3-прога не будет работать/собираться с gtk4.

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

gtk3-прога не будет работать/собираться с gtk4

Рандомная gtk3 прога не будет собираться, а прога, которая выполняет те условия будет.

Я в своё время патчил Qt4 проги, так что они собирались и работали и на Qt4 и на Qt5.

Так же когда, я только начинал изучать gtk3, то пробовал собирать первые «hello world"ы с помощью gtk2, и о чудо, они собирались.

Так что, то что „GTK+ 4 is a major new version of GTK+ that breaks both API and ABI compared to GTK+ 3.x“, не означает, что нельзя писать прогу, так чтобы она собиралась одновременно и GTK+3 и GTK+4

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

Что-то аноним мы друг друга не понимаем.

Вот тебе пример, на vala.

using Gtk;

int main (string[] args) {
    Gtk.init (ref args);

    var window = new Window ();
    window.title = "First GTK+ Program";
    window.set_default_size (300, 50);
    window.destroy.connect (Gtk.main_quit);

    var button = new Button.with_label ("Click me!");
    button.clicked.connect (() => {
        button.label = "Thank you";
    });

    window.add (button);
    window.show_all ();

    Gtk.main ();
    return 0;
}

А вот варианты сборки:

vala hello.vala --pkg gtk+-3.0 -o hello-3
vala hello.vala --pkg gtk+-2.0 -o hello-2
gtk+-2.0.vapi:5873.40-5873.42: warning: Gtk is deprecated. Use gtk+-3.0
hello.vala:4.5-4.7: warning: Gtk is deprecated. Use gtk+-3.0
hello.vala:9.29-9.31: warning: Gtk is deprecated. Use gtk+-3.0
hello.vala:19.5-19.7: warning: Gtk is deprecated. Use gtk+-3.0
Compilation succeeded - 4 warning(s)
Как видно по сборке, собрались оба варианта, теперь у тебя есть два бинарника, один gtk2, один gtk3. Причём исходный код, один и тот же.

fsb4000 ★★ ()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от fsb4000

Ну это не серьёзно, давай какой-нибудь статусбар или чё-нибудь такое. И без валы конечно. Самый простой способ (единственный) это завести 2 кодовые базы для гтк2 и гтк3. Ну и гтк4 и гтк5 заодно. Причём изменения уже ради изменений делают, чтобы работало только в федоре.

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

а прога, которая выполняет те условия будет.

Еще раз, любая gtk3-прога не будет работать c gtk4, ибо поменялся api/abi. В разделе «Preparation in GTK+ 3.x» даны рекомендации по преведению gtk3-кода в состояние при котором миграция этого кода на gtk4 будет проще, но без миграции gtk3-код не будет работать. Например первое с чем столкнешься, это то что вместо gtk_style_context_add_provider_for_screen нужно вызывать gtk_style_context_add_provider_for_display. А вообще почитай какие архитектурные изменения вообще происходят, тогда будет понятно, что без существенной переработки кода, миграция на gtk4 имеет мало смысла: https://wiki.gnome.org/Projects/GTK/Roadmap/GTK4

Так что, то что „GTK+ 4 is a major new version of GTK+ that breaks both API and ABI compared to GTK+ 3.x“, не означает, что нельзя писать прогу, так чтобы она собиралась одновременно и GTK+3 и GTK+4

Ощибаешься, именно это оно и означает. Разве что использовать разные куски кода при сборке в зависимости от --enable-gtk3

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

Вот ещё что нашёл: https://developer.gnome.org/gtk4/stable/ch27s02.html

Установил gtk4

yaourt -S gtk4
aur/gtk4 3.94.0-1 [installed] (7) (0.32)
    GObject-based multi-platform GUI toolkit

И попробовал скомпилировать какой-нибудь пример.

Вот что вышло:

using Gtk;

public class TextFileViewer : Window {

    private TextView text_view;

    public TextFileViewer () {
        this.title = "Text File Viewer";
        this.window_position = WindowPosition.CENTER;
        set_default_size (400, 300);

        var toolbar = new Toolbar ();
        toolbar.get_style_context ().add_class (STYLE_CLASS_PRIMARY_TOOLBAR);
#if GTK4
        var open_button = new Gtk.ToolButton (null, "Open");
        open_button.set_icon_name("document-open");
#else
        var open_icon = new Gtk.Image.from_icon_name ("document-open", 
            IconSize.SMALL_TOOLBAR);
        var open_button = new Gtk.ToolButton (open_icon, "Open");
#endif
        open_button.is_important = true;
        toolbar.add (open_button);
        open_button.clicked.connect (on_open_clicked);

        this.text_view = new TextView ();
        this.text_view.editable = false;
        this.text_view.cursor_visible = false;

        var scroll = new ScrolledWindow (null, null);
        scroll.set_policy (PolicyType.AUTOMATIC, PolicyType.AUTOMATIC);
        scroll.add (this.text_view);

        var vbox = new Box (Orientation.VERTICAL, 0);
#if GTK4
        toolbar.set_halign(Align.FILL);
        toolbar.set_valign(Align.FILL);
        vbox.pack_start (toolbar);
        scroll.set_hexpand(true);
        scroll.set_vexpand(true);
        scroll.set_halign(Align.FILL);
        scroll.set_valign(Align.FILL);
        vbox.pack_start (scroll);
#else
        vbox.pack_start (toolbar, false, true, 0);
        vbox.pack_start (scroll, true, true, 0);
#endif
        add (vbox);
    }

    private void on_open_clicked () {
        var file_chooser = new FileChooserDialog ("Open File", this,
                                      FileChooserAction.OPEN,
                                      "_Cancel", ResponseType.CANCEL,
                                      "_Open", ResponseType.ACCEPT);
        if (file_chooser.run () == ResponseType.ACCEPT) {
            open_file (file_chooser.get_filename ());
        }
        file_chooser.destroy ();
    }

    private void open_file (string filename) {
        try {
            string text;
            FileUtils.get_contents (filename, out text);
            this.text_view.buffer.text = text;
        } catch (Error e) {
            stderr.printf ("Error: %s\n", e.message);
        }
    }

    public static int main (string[] args) {
#if GTK4
        Gtk.init ();
#else
        Gtk.init (ref args);
#endif

        var window = new TextFileViewer ();
        window.destroy.connect (Gtk.main_quit);
#if GTK4
        window.show();
#else
        window.show_all ();
#endif

        Gtk.main ();
        return 0;
    }
}
В принципе причина для каждого ifdef описана либо тут:

https://developer.gnome.org/gtk4/stable/ch27s02.html

либо тут:

https://developer.gnome.org/gtk4/3.94/gtk-migrating-3-to-4.html

Но аноним оказался прав, править придётся для любого gtk3 приложения...

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

я что-то пропустил и теперь на свободное ПО предоставляются какие-то гарантии?

Видимо ты очень многое пропустил. Можно подумать на проприетарщину дают какие-то гарантии.

urxvt ★★★★★ ()