Simple Windows GUI Application Written in Go
gist.github.com
gist.github.com
https://github.com/LeZuse/minimal-win32-app/blob/master/main...
The C code does basically the same thing but ends up being smaller because the Go code doesn't have an equivalent of windows.h with function and data type definitions. The Go code might be a little nicer if it used a Win32 API wrapper, but there doesn't seem to be a well supported and documented one out there. This was all I could find https://github.com/AllenDang/w32.
i := C.foo(C.int(j))
Assuming j is a Go int type.
Either way if you're going to build UI for Windows C#/QT with an C FFI is the more sane way to go. Back when I worked on game engines most of the time we had the fast code down in native and used C# for the tools since it's such a productive framework compared to win32.
// #cgo CFLAGS: -DYOUR_DEFINE
// #cgo LDFLAGS: -lyourlib
// #include <header.h>
import "C"I remember just how painful working with the Win32 API could be (a lifetime ago), but I felt like I really understood how it worked. These days, it's layer upon layer of abstractions. Or bindings from my language of choice to an abstraction layer/framework running on the native OS.
I couldn't begin to explain how many of the popular UI frameworks work, all the way down to the native OS layer.
There was something substantial, concrete in programming at this layer rather than some higher level, fragile abstraction.
It is funny to see people bashing it nowadays, given how I came to enjoy it.
When I started GUI coding on UNIX, Xlib, Xt and Motif on the other hand were anything but productive.
Think the UI the way I code it (declarative)
Don't have to think about screen resolution, colour depth,...
Don't have to bother with non unicode stuff
Have access to well behaved widgets
Can have portability if I need that
Even if I can't control 100% of the rendering process, my productivity has increased...
Windows Ressource files exist at least since Windows 3.x
> Don't have to bother with non unicode stuff
Just use the WinAPI functions that are prefixed with W (Unicode) instead of A (ANSI), e.g. CreateWindowExW instead of CreateWindowExA.
> Have access to well behaved widgets
Call CreateWindowEx (https://msdn.microsoft.com/en-us/library/windows/desktop/ms6...) (yes, the name is confusing, accepted) with lpClassName value, say, of BUTTON, COMBOBOX, EDIT, LISTBOX, MDICLIENT, SCROLLBAR (for a more complete list look at the MSDN site that I linked). This creates such a widget.
In any case, OWL, VCL and later on MFC were my tools during those days, when given an option.
Thank you!
after a while things will settle down and this "hello world" program will boil down to something much simpler, like:
import "win"
func PopWin(text string) {
win.NewWindow(text, ...)
}
also keep in mind that this is the version that purposely avoids using C and, as a consequence, can be cross compiled for windows on every machine with Go installed. there are benefits to that.I don't think it would be that ugly if you compared it C code that didn't include windows.h
Whatever, native GUI bindings has been a key factor for the adoption (or lack thereof) of some languages where they would have otherwise been perfectly fine.
Why?
Less bugs, better examples, community support.
Based on that, and the point you made, I'd definitely go the .NET/C# route if I ever ended up in the unfortunate position of having to develop software for Windows. Barring of course some reason that it had to be written in Go or something else.
One reason would be if you're trying to build a node based app which you would like to use across other platforms.
In some future version of Windows, when UWP with its COM foundation becomes prevalent, they can ripoff all the Win32 APIs that aren't required to support WinRT.
Just like Apple has done with Carbon, Quicktime and many others.
The only constants are COM and Win32.
If you look at what Delphi, Modula-3, Ada, Component Pascal, Oberon variants, Eiffel were already offering before Java took off.
> As soon as something starts working it gets replaced by something else.
Just like everyone else. I can hardly think of any platform owner that has kept their APIs stable.
Not that you are not right to complain, I just get the impression many tend to forget about the other vendors similar practices.
Windows and Mac OS X are the only sane alternatives for developers that care about desktop applications and developer friendly toolchains. Same applies to iOS, Android and WP.
The other alternatives feel like only the CLI and daemons matter, stuck in a PDP-11 view of the world.
Then again, NeXT was the only UNIX based OS with an alternative culture regarding developers tools and UX.
KDE is the only environment that can match in terms of tooling and UX, yet it is lacking some serious love nowadays.
I want my developer and user experience to be a Xerox Star and not a PDP-11.
KDE? Seriously? It's one of the worst DEs on linux. Any DE which isn't based on gnome is just cheap nowadays.
GNOME has a very nice HIG from UX point of view, but it is stuck in C + POSIX as technology stack in what concerns developer experience. Vala is still not there and I don't believe in JavaScript for native UIs.
Same or similar? It doesn't matter what they provide because I'd go with ScalaFX(http://www.scalafx.org/) + IntelliJ or Vala|Genie + Vala IDE. Mono is also an option if you're into it.
> but it is stuck in C + POSIX as technology stack in what concerns developer experience.
Yes, GTK isn't the newest but it isn't hard at all to develop apps with Vala/Genie(https://wiki.gnome.org/Projects/Vala/GTKSample , https://wiki.gnome.org/Projects/Genie/GtkGuiTutorial ?)
> Vala is still not there and I don't believe in JavaScript for native UIs.
What do you mean? Vala is almost the defacto standard language for ubuntu/gnome apps.
I can use the same toolchain in many other operating systems.
The last time I bothered to check GNOME, there was some ongoing discussion of JavaScript becoming the official language to pair with C.
Just checked Genie and Vala IDE web sites, they still need to do catch up with what Borland was doing in the 90's, let alone modern IDEs.
Why would you need specific features? You wanted to develop desktop apps, not gnome plugins, right?
> Just checked Genie and Vala IDE web sites, they still need to do catch up with what Borland was doing in the 90's, let alone modern IDEs.
If you want RAD there's Glade(https://glade.gnome.org/) + GtkBuilder.
> So which other DE on GNU/Linux does provide the same tooling and platform abstractions as KDevelop/Qt Creator do?
You answered:
> Why would you need specific features? You wanted to develop desktop apps, not gnome plugins, right?
Clearly KDevelop and At Creator expose GNU/Linux specific feature.
Software development stack for desktop apps are all about exposing the features that make a platform desired to be used.
Desktop apps that expose the features that make the platform unique.
> If you want RAD there's Glade(https://glade.gnome.org/) + GtkBuilder.
Not even close to Delphi and C++ Builder and we are talking about 90's here.
If I upgame to Blend + VS, XCode + Playgrounds, Android Studio then there is a lot of catch up to do.
I'll take your hot opinion and replace it with mine: Gnome (3) is hands down the worst DE in the entire Linux ecosystem and is actively harming all others by merely existing due to the mentality driving its development: "fuck everyone that's not us, we set the standards and you will like them".
Currently KDE is the most polished and feature complete of the "batteries included" DEs. And even then as a developer I prefer a bare-bones tiling set-up, picking and choosing what I want and having an experience customized to my preferred workflow.
and .NET isn't?
I'm not sure I agree with this, it may have been true before VB on windows. People like Dropbox would also disagree, they use(d) python for their UI code on the desktop, I believe.
Note: I'm a total newbie at Go and Windows API so every bit of abstraction was a bless to me.
[0] https://github.com/golang/go/issues/14959 [1] https://github.com/golang/sys/tree/master/windows
Is it just me ?
Ideally this sort of platform import should be automated so that Win32 specific apps could import the more advanced GUI stuff (comdlg et all).