This is very exciting. Here is the APK I downloaded. And the associated discussion.
It even already seems to support stylus input which is very exciting seeing as there has been talk of porting RNote to Android.
This is very exciting. Here is the APK I downloaded. And the associated discussion.
It even already seems to support stylus input which is very exciting seeing as there has been talk of porting RNote to Android.
Of course linting and formatting is not part of the language. Of course you can install extensions in some IDE that will handle it. Conan looks great but I never saw a project using it and when I was asking C devs about dependency management no one mentioned it. I checked dozens of GTK projects looking for some decent template to copy and didn’t find anything remotely “modern”. All projects I see simply use meson/ninja, install deps on system level, don’t provide any code formatting or linting guidelines. Most don’t bother with any modules and just dump all source code into 100 files in
src
. And I’m talking about actively developed tools for Gnome, not some long forgotten ones. For me the big difference between languages like C and Rust is that every Rust project uses the same formatting, linting tools, uses modules and proper dependency management while most C projects don’t. Because it’s old. Because a lot of C devs learned programming when it wasn’t a thing. Because a lot of C project started when those tools didn’t exist. You can probably start a new C project in ‘modern’ way but when I was trying to do it there were no examples, no documentation and when I asked C devs I was told that “you just do it like always”. In modern languages the default way is the “modern” way.This is how you declare a new component in gtk-rs:
glib::wrapper! { pub struct MainMenu(ObjectSubclass<imp::MainMenu>) @extends gtk::PopoverMenu, gtk::Popover, gtk::Window, gtk::Widget, @implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Native, gtk::ShortcutManager; } impl MainMenu { pub fn new() -> Self { Object::new(&[]).expect("Failed to create `MainMenu`.") } }
#[glib::object_subclass] impl ObjectSubclass for MainMenu { const NAME: &'static str = "MainMenu"; type Type = super::MainMenu; type ParentType = gtk::PopoverMenu; fn class_init(klass: &mut Self::Class) { klass.bind_template(); } fn instance_init(obj: &glib::subclass::InitializingObject<Self>) { obj.init_template(); } }
This is how you declare a new component in Leptos:
#[component] fn App() -> impl IntoView { view! { <div>test</div> } }
That’s what I mean by “it’s not ergonomic”.
Well, for a modern approach to development in C, you may have to be creative and not rely on ready examples, but it’s still doable. A lot of the C issues are at the “conventional” level and can be solved if you just do things a little bit differently (e.g. nothing stops you from modularising source/headers files even though C doesn’t enforce this at the language level).
I can understand the “ergonomics” you speak of in Rust but it’s not very surprising in that aspect especially given that C faces same challenge (and is even more verbose). The GObject system seems to map well with languages that favour the OOP style (built-in classes, inheritance etc) like Python. So yeah, on that, I understand ;)