Go to file
Pietro Gagliardi 8084ef53e1 Removed bleh_darwin.m and the initBleh() function that it contained as its only remaining code. 2014-05-16 02:00:21 -04:00
experiments Wrote non-working code to get Windows to have Window sizes not count window decoration. Technically it does work, but it doesn't seem to fix Area scrollbars... which reminds me, the default configuration for the keyboard test exhibits the "last pixel" but mentioned in one of the TODOs in area_windows.go on both scrollbars, so let's fix that first anyway. I'll move the TODO for window decoration to the future plans after I get a definite answer about GTK+'s behavior. 2014-04-13 23:04:53 -04:00
test Fixed weird Area time label truncation on Windows; more TODOs and future plans related to that. 2014-04-13 16:46:22 -04:00
.travis.yml Changed -qq to -y in the apt-get install line in .travis.yaml because I want to see the full details of the install. 2014-03-24 11:54:30 -04:00
LICENSE Added license and README. 2014-02-17 18:38:50 -05:00
README.md Updated README to reflect the new Area image.RGBA changes. 2014-04-12 15:37:17 -04:00
area.go Documented dragging issues caused by how Mac OS X handles mouse events; also determined that multiple buttons held at once only generates one mouseDragged: signal. 2014-05-10 14:27:29 -04:00
area_darwin.go Removed the Area drawing code from bleh_darwin.m and rewrote it in Objective-C in area_darwin.m. 2014-05-15 22:15:54 -04:00
area_darwin.h Removed the Area drawing code from bleh_darwin.m and rewrote it in Objective-C in area_darwin.m. 2014-05-15 22:15:54 -04:00
area_darwin.m Removed the Area drawing code from bleh_darwin.m and rewrote it in Objective-C in area_darwin.m. 2014-05-15 22:15:54 -04:00
area_unix.go Completed extending of mouse buttons to the system's limit; defined (as undefined) the mouse drag behavior for buttons >= 3; implemented all that on the GTK+ side, and decided to have MouseEvents.Held[] be sorted (documentation only for now; need to check the code to make sure it follows). Good Lord... 2014-05-07 17:51:04 -04:00
area_windows.go Consistency change: all Windows API structure field names now match case-wise (some were forcibly exported in the past for historical reasons: I originally started package ui by trying to write a Windows API wrapper, but decided to ditch that and just use the Windows API directly from package ui). Also more TODOs. 2014-05-11 11:11:57 -04:00
areaplan.md Added the proper provision for numeric keypad entry. 2014-03-29 12:57:54 -04:00
button.go Documented that event channels can be assigned to each other to collapse events. 2014-04-10 11:59:40 -04:00
callbacks_unix.go Split out the common resizing code into its own function so that it's all in one place. This will also affect what happens if I switch to DeferWindowPos() on Windows. 2014-04-07 14:32:25 -04:00
checkbox.go Moved TODOs about new event signals to the future plans document. 2014-04-28 20:59:42 -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 Moved TODOs about new event signals to the future plans document. 2014-04-28 20:59:42 -04:00
comctl_windows.go Decided not to deactivate the Windows Common Control 6 manifest activation context since it's active for the life of the program already. 2014-04-29 10:30:03 -04:00
common_windows.go Consistency change: all Windows API structure field names now match case-wise (some were forcibly exported in the past for historical reasons: I originally started package ui by trying to write a Windows API wrapper, but decided to ditch that and just use the Windows API directly from package ui). Also more TODOs. 2014-05-11 11:11:57 -04:00
control.go Updated the documentation: Area now works on all platforms, Modifiers behavior on both left and right keys simultaneously is undefined for now, and the way to create custom Controls no longer involves embedding Area. 2014-03-30 19:57:24 -04:00
controls_windows.go Moved TODOs about stripping non-Windows XP constants to future plans; also reworded a comment in comctl_windows.go. 2014-04-28 12:13:06 -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 Removed all the objc_getClass() and sel_getUid() calls from the Go code on Mac OS X. Also got rid of a forgotten objc_msgSend(). Now comes the Objective-C half... 2014-05-15 20:14:44 -04:00
delegateuitask_darwin.h Moved uitask_darwin.go to be Objective-C-based. Both delegate_darwin.go and uitask_darwin.go will share the same .m file. 2014-05-13 08:14:28 -04:00
delegateuitask_darwin.m Removed the dummy NSEvent code from bleh_darwin.m and rewrote it in Objective-C in delegateuitask_darwin.m. And now to nuke bleh_darwin.m and change all the int64_ts to intptr_ts and merge the .h files... 2014-05-15 23:04:30 -04:00
dialog.go Removed unnecessary space if the secondaryText argument to MsgBox***() is an empty string. This doesn't change much on Mac OS X; it always shows the informational text field, showing an empty string by default. On GTK+ it seems to get rid of the bold over the primary text; I'm going to assume this is intentional (it looks that way on GTK+ 2; the HIG docs have outdated screenshots...). 2014-04-10 12:35:37 -04:00
dialog_darwin.go Removed all the objc_getClass() and sel_getUid() calls from the Go code on Mac OS X. Also got rid of a forgotten objc_msgSend(). Now comes the Objective-C half... 2014-05-15 20:14:44 -04:00
dialog_darwin.h Migrated dialog_darwin.go to use Objective-C directly. 2014-05-15 19:08:24 -04:00
dialog_darwin.m Migrated dialog_darwin.go to use Objective-C directly. 2014-05-15 19:08:24 -04:00
dialog_unix.go Decided not to show an icon in the regular MsgBox() on Windows and Unix. For Mac OS X I need to see what the difference between Warning and Informational is. 2014-04-25 18:39:43 -04:00
dialog_windows.go Decided not to show an icon in the regular MsgBox() on Windows and Unix. For Mac OS X I need to see what the difference between Warning and Informational is. 2014-04-25 18:39:43 -04:00
doc.go Documented that event channels can be assigned to each other to collapse events. 2014-04-10 11:59:40 -04:00
events_darwin.go Another name in events_darwin.go (see previous commit). 2014-03-30 22:20:23 -04:00
events_notdarwin.go Finished re-adding the numeric keypad keys and fixing up the GTK+ Area implementation to handle the new KeyEvent. Everything seems to work on this end... 2014-03-29 13:09:27 -04:00
events_windows.go Added part of keyboard input on Windows. Need to repaint the window on event return and handle area sizes now... 2014-03-29 17:52:40 -04:00
futureplans.md More future plans. 2014-05-14 23:21:17 -04:00
grid.go Resolved Grid TODOs: moved feature requests to future plans and made sure SetStretchy() doesn't leave previous stretchy controls filling by accident. 2014-04-29 10:10:28 -04:00
gtk_unix.h Moved <stdlib.h> includes in the GTK+ backend to gtk_unix.h; organized that file a bit. 2014-04-01 16:01:49 -04:00
gtkcalls_unix.go Cleaned up and got rid of some TODOs in gtkcalls_unix.go. 2014-04-27 20:47:37 -04:00
gtkcasts_unix.go Changed fromgchar()/togchar() to fromgstr()/togstr() in the GTK+ code; the new names are more precise (though they don't operate on GStrings; that's not an issue here though). 2014-04-26 22:55:43 -04:00
implementation.md Updated README with this decision. Also other documents as well. 2014-03-18 11:55:01 -04:00
init.go Removed a TODO from init.go that was already in the future plans document. 2014-04-28 02:15:19 -04:00
init_windows.go Cleaned up/removed some (not all) TODOs in init_windows.go. 2014-04-28 12:44:07 -04:00
label.go Fixed Area test time label weirdness by making Labels truncate their text instead of word-wrapping on all platforms. This doesn't explain GTK+/Wayland, alas. 2014-04-13 18:05:07 -04:00
layoutplan.md Added a new layout plan for Stack. 2014-02-24 10:22:23 -05:00
lineedit.go Moved TODOs about new event signals to the future plans document. 2014-04-28 20:59:42 -04:00
listbox.go Moved TODOs about new event signals to the future plans document. 2014-04-28 20:59:42 -04:00
listbox_darwin.go Removed all the objc_getClass() and sel_getUid() calls from the Go code on Mac OS X. Also got rid of a forgotten objc_msgSend(). Now comes the Objective-C half... 2014-05-15 20:14:44 -04:00
listbox_darwin.h Migrated listbox_darwin.go to using Objective-C directly instead of through the runtime. Due to linking issues on Mac OS X 10.6, I haven't made this live yet; I need to repair my 10.6 setup before I can actually test. This won't be done before midnight, so preemptive commit. The new listbox_darwin.go is lbnew. 2014-05-13 23:35:04 -04:00
listbox_darwin.m Removed the control font code from bleh_darwin.m and rewrote it in Objective-C in sysdata_darwin.m. 2014-05-15 21:16:28 -04:00
listbox_unix.go Resolved TODOs in listbox_unix.go; also rewrote some related if expressions there to be clearer. 2014-04-27 15:06:52 -04:00
menus_windows.go Separated file creation dates from the package comment. 2014-03-12 21:55:45 -04:00
objc_darwin.go Removed all the objc_getClass() and sel_getUid() calls from the Go code on Mac OS X. Also got rid of a forgotten objc_msgSend(). Now comes the Objective-C half... 2014-05-15 20:14:44 -04:00
objc_darwin.h Removed bleh_darwin.m and the initBleh() function that it contained as its only remaining code. 2014-05-16 02:00:21 -04:00
plan.md Added version compatibility notes to plan.md. 2014-02-16 16:55:48 -05:00
prefsize_darwin.go Removed all the objc_getClass() and sel_getUid() calls from the Go code on Mac OS X. Also got rid of a forgotten objc_msgSend(). Now comes the Objective-C half... 2014-05-15 20:14:44 -04:00
prefsize_darwin.h Migrated prefsize_darwin.go to plain Objective-C. Not much left...! 2014-05-15 19:21:54 -04:00
prefsize_darwin.m Migrated prefsize_darwin.go to plain Objective-C. Not much left...! 2014-05-15 19:21:54 -04:00
prefsize_unix.go Removed height-for-width TODO from prefsize_unix.go after discussion with Company in irc.gimp.net/#gtk+. 2014-04-27 16:26:06 -04:00
prefsize_windows.go Rolled back the Windows horizontally scrolling Listbox changes because I can't seem to get it to work on Mac OS X (and keeping that code there is inefficient); removed the guarantee of horizontal scrollbars in Listbox and made that a future plan. Both the Windows and the non-working Mac OS X code is in unmigrated/hscrolllistbox.go (and the unmigrated/ folder will be renamed shortly). 2014-04-13 13:00:07 -04:00
progressbar.go Removed the initText parameter from sysData.make() and changed all invocations to call sysData.setText() separately; this avoids the need to check if sysData.setText() is valid. Also implemented that on GTK+. 2014-04-01 16:43: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 Made Space() return the same Control repeatedly instead of making a new one each time to conserve memory. No future guarantees, however, so that is noted in the documentation as well. 2014-04-26 16:05:23 -04:00
stdfont_windows.go Got rid of another TODO about GetLastError() in the same way as earlier (this time in stdfont_windows.go); also fixed capitalization on the earlier one. 2014-04-28 21:32:49 -04:00
stdwndclass_windows.go Consistency change: all Windows API structure field names now match case-wise (some were forcibly exported in the past for historical reasons: I originally started package ui by trying to write a Windows API wrapper, but decided to ditch that and just use the Windows API directly from package ui). Also more TODOs. 2014-05-11 11:11:57 -04:00
sysdata.go Fixed Listboxes on Mac OS X having an initial selection. 2014-04-12 22:05:34 -04:00
sysdata_darwin.go Removed all the objc_getClass() and sel_getUid() calls from the Go code on Mac OS X. Also got rid of a forgotten objc_msgSend(). Now comes the Objective-C half... 2014-05-15 20:14:44 -04:00
sysdata_darwin.h Finished migrating sysdata_darwin.go away from calling objc_msgSend() directly. initWithDummyFrame() is still there as other files use it. 2014-05-13 07:09:22 -04:00
sysdata_darwin.m Removed the control font code from bleh_darwin.m and rewrote it in Objective-C in sysdata_darwin.m. 2014-05-15 21:16:28 -04:00
sysdata_unix.go Removed TODO about returning container before connecting signals in sysdata_unix.go; nothing will actually be sent until we show the widgets anyway. 2014-04-27 13:48:47 -04:00
sysdata_windows.go Consistency change: all Windows API structure field names now match case-wise (some were forcibly exported in the past for historical reasons: I originally started package ui by trying to write a Windows API wrapper, but decided to ditch that and just use the Windows API directly from package ui). Also more TODOs. 2014-05-11 11:11:57 -04:00
tableviewproposal.md Switched TableView proposal from <tt>...</tt> to <tt><ins>...</ins></tt> to make those parts distinct from code blocks. 2014-05-08 16:38:46 -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-05-13 12:02:35 -04:00
uitask_darwin.go Removed bleh_darwin.m and the initBleh() function that it contained as its only remaining code. 2014-05-16 02:00:21 -04:00
uitask_unix.go ui.Go() on GTK+ now reports the reason gtk_init() failed in its error return. 2014-04-27 12:43:15 -04:00
uitask_windows.go Consistency change: all Windows API structure field names now match case-wise (some were forcibly exported in the past for historical reasons: I originally started package ui by trying to write a Windows API wrapper, but decided to ditch that and just use the Windows API directly from package ui). Also more TODOs. 2014-05-11 11:11:57 -04:00
window.go Documented that event channels can be assigned to each other to collapse events. 2014-04-10 11:59:40 -04:00
windows_windows.go Consistency change: all Windows API structure field names now match case-wise (some were forcibly exported in the past for historical reasons: I originally started package ui by trying to write a Windows API wrapper, but decided to ditch that and just use the Windows API directly from package ui). Also more TODOs. 2014-05-11 11:11:57 -04:00

README.md

Build Status

Native UI library for Go

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.

UPDATE 18 March 2014: Resizes are now assumed to stop other UI event processing, and thus do not run with locks anymore. I changed real control resizing so that it doesn't need to lock (it just fills an array with data fed in), but real control preferredSize() and Stack/Grid.setRect() could potentially still be racy... if I am right it won't be an issue, but if anyone else knows, please let me know. (Everything else is thread-safe again.)

UPDATE 27 March 2014: Unix builds now require go tip due to a cgo fix that affected this package.

UPDATE 12 April 2014: Areas now require their images to be image.RGBA, not image.NRGBA. Update your code appropriately.

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.
    • Note: you will need Go 1.3 or newer (as above) due to various cgo errors fixed in this version (such as this one).

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
  • for FreeBSD with the pkgng system, gtk3 is sufficient, however you will need to manually install pkgconf to please cgo (and you may need to specify CC=gcc47) (this should be put on the Go wiki)

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 works 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.