Go to file
Pietro Gagliardi 24342eb05d Restored the locks everywhere except on resizing calculations. I'll run under the assumption that uitask cannot process any requests while a resize occurs, which means preferredSize() and Stack/Grid.setRect() are inherently safe... let's hope I'm right... 2014-03-18 11:50:56 -04:00
test Er oh the crash was because I was still using the lock-friendly code. Will still apply the change to memory allocation because memory reuse. 2014-03-17 21:02:11 -04:00
unmigrated Separated file creation dates from the package comment. 2014-03-12 21:55:45 -04:00
.travis.yml Remove the 32-bit GTK+ from linux/386 Travis.ci builds; I have no idea how to fix this. 2014-03-05 12:38:49 -05:00
LICENSE Added license and README. 2014-02-17 18:38:50 -05:00
README.md Update on my locking problem in the README. 2014-03-18 11:30:35 -04:00
area.go Changed the new resizing code so that it uses the same allocated slice per window instead of making a new one to store all the resize requests each time. 2014-03-17 21:09:03 -04:00
area_unix.go Changed Area to use a delegate handler object that implements the new AreaHandler interface for handling events. Also updated the GTK+ backend with this change, and made a few more tweaks to the documentation in area.go. 2014-03-16 21:40:33 -04:00
areaplan.md More mouse event planning. I now have enough figured out to implement on GTK+. 2014-03-15 21:07:57 -04:00
bleh_darwin.m Have ui.Go() return on main() return on Mac OS X. 2014-03-05 20:09:15 -05:00
button.go Restored the locks everywhere except on resizing calculations. I'll run under the assumption that uitask cannot process any requests while a resize occurs, which means preferredSize() and Stack/Grid.setRect() are inherently safe... let's hope I'm right... 2014-03-18 11:50:56 -04:00
callbacks_unix.go Changed the new resizing code so that it uses the same allocated slice per window instead of making a new one to store all the resize requests each time. 2014-03-17 21:09:03 -04:00
checkbox.go Restored the locks everywhere except on resizing calculations. I'll run under the assumption that uitask cannot process any requests while a resize occurs, which means preferredSize() and Stack/Grid.setRect() are inherently safe... let's hope I'm right... 2014-03-18 11:50:56 -04:00
cocoalists Added the beginning of the Mac OS X implementation of Combobox; also added a file to plan out how lists will be implemented/are being implemented. 2014-03-02 17:19:25 -05:00
combobox.go Restored the locks everywhere except on resizing calculations. I'll run under the assumption that uitask cannot process any requests while a resize occurs, which means preferredSize() and Stack/Grid.setRect() are inherently safe... let's hope I'm right... 2014-03-18 11:50:56 -04:00
comctl_windows.go Separated file creation dates from the package comment. 2014-03-12 21:55:45 -04:00
common_windows.go Separated file creation dates from the package comment. 2014-03-12 21:55:45 -04:00
control.go Changed the new resizing code so that it uses the same allocated slice per window instead of making a new one to store all the resize requests each time. 2014-03-17 21:09:03 -04:00
controlcandidates.md More control candidate information. 2014-03-07 09:12:15 -05:00
controls_windows.go Separated file creation dates from the package comment. 2014-03-12 21:55:45 -04:00
d32 cgo inserts -m32 automatically, so we don't need to in ./d32. 2014-03-08 17:32:56 -05:00
delegate_darwin.go Changed the new resizing code so that it uses the same allocated slice per window instead of making a new one to store all the resize requests each time. 2014-03-17 21:09:03 -04:00
dialog.go Separated file creation dates from the package comment. 2014-03-12 21:55:45 -04:00
dialog_darwin.go Separated file creation dates from the package comment. 2014-03-12 21:55:45 -04:00
dialog_unix.go Split out includes of <gtk/gtk.h> into a new header file so the GTK+ versioning macros can be included in all Go files, not just area_unix.go. 2014-03-16 10:34:12 -04:00
dialog_windows.go Separated file creation dates from the package comment. 2014-03-12 21:55:45 -04:00
doc.go Removed ui.Event(); all event channels are initialized with their objects now. 2014-03-12 21:47:39 -04:00
grid.go Changed the new resizing code so that it uses the same allocated slice per window instead of making a new one to store all the resize requests each time. 2014-03-17 21:09:03 -04:00
gtk_unix.h Split out includes of <gtk/gtk.h> into a new header file so the GTK+ versioning macros can be included in all Go files, not just area_unix.go. 2014-03-16 10:34:12 -04:00
gtkcalls_unix.go Split out includes of <gtk/gtk.h> into a new header file so the GTK+ versioning macros can be included in all Go files, not just area_unix.go. 2014-03-16 10:34:12 -04:00
gtkcasts_unix.go Split out includes of <gtk/gtk.h> into a new header file so the GTK+ versioning macros can be included in all Go files, not just area_unix.go. 2014-03-16 10:34:12 -04:00
implementation.md Allowed GTK+ windows to be resized smaller than the size request of the controls within. 2014-03-15 14:27:18 -04:00
init.go Separated file creation dates from the package comment. 2014-03-12 21:55:45 -04:00
init_windows.go Separated file creation dates from the package comment. 2014-03-12 21:55:45 -04:00
label.go Restored the locks everywhere except on resizing calculations. I'll run under the assumption that uitask cannot process any requests while a resize occurs, which means preferredSize() and Stack/Grid.setRect() are inherently safe... let's hope I'm right... 2014-03-18 11:50:56 -04:00
layoutplan.md Added a new layout plan for Stack. 2014-02-24 10:22:23 -05:00
lineedit.go Restored the locks everywhere except on resizing calculations. I'll run under the assumption that uitask cannot process any requests while a resize occurs, which means preferredSize() and Stack/Grid.setRect() are inherently safe... let's hope I'm right... 2014-03-18 11:50:56 -04:00
listbox.go Restored the locks everywhere except on resizing calculations. I'll run under the assumption that uitask cannot process any requests while a resize occurs, which means preferredSize() and Stack/Grid.setRect() are inherently safe... let's hope I'm right... 2014-03-18 11:50:56 -04:00
listbox_darwin.go Separated file creation dates from the package comment. 2014-03-12 21:55:45 -04:00
listbox_unix.go Split out includes of <gtk/gtk.h> into a new header file so the GTK+ versioning macros can be included in all Go files, not just area_unix.go. 2014-03-16 10:34:12 -04:00
menus_windows.go Separated file creation dates from the package comment. 2014-03-12 21:55:45 -04:00
objc_darwin.go Separated file creation dates from the package comment. 2014-03-12 21:55:45 -04:00
objc_darwin.h Have ui.Go() return on main() return on Mac OS X. 2014-03-05 20:09:15 -05:00
plan.md Added version compatibility notes to plan.md. 2014-02-16 16:55:48 -05:00
prefsize_darwin.go Separated file creation dates from the package comment. 2014-03-12 21:55:45 -04:00
prefsize_unix.go Separated file creation dates from the package comment. 2014-03-12 21:55:45 -04:00
prefsize_windows.go Separated file creation dates from the package comment. 2014-03-12 21:55:45 -04:00
progressbar.go Restored the locks everywhere except on resizing calculations. I'll run under the assumption that uitask cannot process any requests while a resize occurs, which means preferredSize() and Stack/Grid.setRect() are inherently safe... let's hope I'm right... 2014-03-18 11:50:56 -04:00
restrictions.md Windows sysData has been adjusted to deal with child controls. Rather than storing the parent window, it is passed as an argument to sysData.make(), which does the child ID allocation. Child IDs are now window-local, getting rid of that restriction. 2014-02-12 21:08:10 -05:00
stack.go Changed the new resizing code so that it uses the same allocated slice per window instead of making a new one to store all the resize requests each time. 2014-03-17 21:09:03 -04:00
stdfont_windows.go Separated file creation dates from the package comment. 2014-03-12 21:55:45 -04:00
stdwndclass_windows.go Changed the new resizing code so that it uses the same allocated slice per window instead of making a new one to store all the resize requests each time. 2014-03-17 21:09:03 -04:00
sysdata.go Changed the new resizing code so that it uses the same allocated slice per window instead of making a new one to store all the resize requests each time. 2014-03-17 21:09:03 -04:00
sysdata_darwin.go Separated file creation dates from the package comment. 2014-03-12 21:55:45 -04:00
sysdata_unix.go Added (untested) GTK+ implementation of Area's mouse events. 2014-03-15 22:29:47 -04:00
sysdata_windows.go Separated file creation dates from the package comment. 2014-03-12 21:55:45 -04:00
test.sh Changed the ".." import in the test binary to a proper "github.com/andlabs/ui" import. (This means I finally moved my working environment out of a folder src/wingo and into the proper src/github.com/andlabs/ui.) 2014-03-04 23:10:48 -05:00
todo.md More TODOs. 2014-03-16 09:54:37 -04:00
uitask_darwin.go Separated file creation dates from the package comment. 2014-03-12 21:55:45 -04:00
uitask_unix.go Separated file creation dates from the package comment. 2014-03-12 21:55:45 -04:00
uitask_windows.go Separated file creation dates from the package comment. 2014-03-12 21:55:45 -04:00
window.go Separated file creation dates from the package comment. 2014-03-12 21:55:45 -04:00
windows_windows.go Separated file creation dates from the package comment. 2014-03-12 21:55:45 -04:00
winerrors.md More TODO reduction. 2014-02-15 15:41:50 -05:00

README.md

Build Status

Native UI library for Go

CRITICAL UPDATE 17 March 2014: Due to deadlocks between resizing and setting label text once a second (see below), all Controls no longer lock their internal mutex locks after their Window has been created. This seems to not have issues, and the Go race detector isn't saying anything, so IDK... Please help spot issues or suggest actual solutions if you can.

The issue:

  • a time.Ticker ticks, which causes label.SetText() or whatever to be called; it locks its mutex
  • at the same time, a resize event comes in; the resize event runs before the SetText action ever does
  • the resize eventually comes to the label, whose resizing functions also try to lock the already-locked mutex
  • because the drawing function is now stuck waiting for the mutex to be unlocked, the label.SetText() system-dependent operation never runs, so the mutex is never unlocked
  • this fools Go's deadlock detector; it never reports anything
  • changing from standard mutexes to R/W mutexes does not work
  • making resizes concurrent causes resizes to become too slow to be acceptable: the control resizing doesn't take effect until at least a second after the user lets go, and keeping a grip too long overloads the scheduler with goroutines
  • making Label use a goroutine and channels for internal communication did not get rid of the locks

If you know a better way I can do things, please help... I'm at my wits end here
The main test (test/test) now has its label show the current time; GTK+ users can run test/test -area for the Area test that sparked this whole calamity.

THIS PACKAGE IS UNDER ACTIVE DEVELOPMENT. It can be used; the API is stable enough at this point, but keep in mind there may still be crashes and API changes, as suggestions are always open. If you can help, please do! Run ./test to build a test binary test/test which runs a (mostly) feature-complete UI test. Run ./d32 ./test to build a 32-bit version (you will need a cgo-enabled 32-bit go environment, and I have only tested this on Mac OS X).

UPDATE 12 March 2014: Windows 2000 is no longer supported as it is no longer supported by Go.

This is a simple library for building cross-platform GUI programs in Go. It targets Windows, Mac OS X, Linux, and other Unixes, and provides a thread-safe, channel-based API. The API itself is minimal; it aims to provide only what is necessary for GUI program design. That being said, suggestions are welcome. Layout is done using various layout managers, and some effort is taken to conform to the target platform's UI guidelines. Otherwise, the library uses native toolkits.

ui aims to run on all supported versions of supported platforms. To be more precise, the system requirements are:

  • Windows: Windows XP or newer. The Windows backend uses package syscall and calls Windows DLLs directly, so does not rely on cgo.
  • Mac OS X: Mac OS X 10.6 (Snow Leopard) or newer. Objective-C dispatch is done by interfacing with libobjc directly, and thus this uses cgo.
    • Note: you will need Go 1.3 or newer (so until it is released, go tip) for this verison, as it uses a single .m file due to technical restrictions (read the comments in bleh_darwin.m for details), and earlier versions of Go do not auto-build .m files.
  • Other Unixes: The Unix backend uses GTK+, and thus cgo. It requires GTK+ 3.4 or newer; for Ubuntu this means 12.04 LTS (Precise Pangolin) at minimum. Check your distribution.

ui itself has no outside Go package dependencies; it is entirely self-contained.

To install, simply go get this package. On Mac OS X, make sure you have the Apple development headers. On other Unixes, make sure you have the GTK+ development files (for Ubuntu, libgtk-3-dev is sufficient).

Package documentation is available at http://godoc.org/github.com/andlabs/ui.

For an example of how ui is used, see https://github.com/andlabs/wakeup, which is a small program that implements a basic alarm clock.

Known To Have Ever Been Built Matrices

For convenience's sake, here are matrices of builds that I have personally done at least once. Each cell represents the run status. These matrices represent builds that I have done at any point in development; it is not a guarantee that the current version works. (I built this list to answer questions of whether or not ui works with a specific configuration.) Only configurations marked with a * are tested during active development. "(invalid)" means the given OS/arch combination is not supported by Go.

386 amd64 arm
windows works on windows; works on wine* works on windows; fails on wine (invalid)
linux see table below see table below Raspian: works
darwin (Mac OS X) works* (cross-compiled from 64-bit) works* (invalid)
dragonfly untested untested (invalid)
freebsd untested (VM failure) untested (VM failure) untested
netbsd untested untested untested
openbsd untested untested (invalid)
solaris (invalid) Oracle Solaris 11: GTK+ 3 not available from official repos (invalid)
plan9 (not written yet; problems building Go) (not written) (invalid)
nacl (not sure how to handle) (not sure how to handle) (invalid)
linux 386 amd64
Kubuntu (14.04) works; cross-compiling on 64-bit Linux fails due to nonexistent .so symlinks works*
Fedora untested untested
openSUSE untested untested
Arch Linux untested untested
Mandriva (TODO choose between PCLinuxOS and Mageia - it appears the original Mandriva is either dead or nonfree and I would rather choose the fork that structures packages identically for parity; do they both?) untested untested
Slackware untested untested
Gentoo untested untested

(The above list should cover all the bases of major Linux distributions and variants thereof; I might add a dedicated Debian test later but other than that... suggestions welcome. Kubuntu 64-bit is my main system and the main development platform; the Windows builds are cross-compiled from here. And yes, this also implies I seriously consider a Plan 9 port of the library using libcontrol, though I'm guessing this will blow up in my face due to any possible conflicts between libthread and Go's runtime (I need to see how the Go runtime implements OS threads on Plan 9).)

Contributing

Contributions are welcome. File issues, pull requests, approach me on IRC (pietro10 in #go-nuts; andlabs elsewhere), etc. Even suggestions are welcome: while I'm mainly drawing from my own GUI programming experience, everyone is different. I have received emails, however I am not likely to see those right away, so I don't suggest contacting me by email if your communication is urgent.

If you want to dive in, read implementation.md: this is a description of how the library works. (Feel free to suggest improvements to this as well.) The other .md files in this repository contain various development notes.

Please suggest documentation improvements as well.