diff --git a/redo/controls_unix.go b/redo/controls_unix.go index 1fc76c0..647e5ee 100644 --- a/redo/controls_unix.go +++ b/redo/controls_unix.go @@ -24,13 +24,19 @@ type button struct { button *C.GtkButton } -func newButton(text string) Button { - ctext := togstr(text) - defer freegstr(ctext) - widget := C.gtk_button_new_with_label(ctext) - return &button{ - widget: newWidget(widget), - button: (*C.GtkButton)(unsafe.Pointer(widget)), +func newButton(text string) *Request { + c := make(chan interface{}) + return &Request{ + op: func() { + ctext := togstr(text) + defer freegstr(ctext) + widget := C.gtk_button_new_with_label(ctext) + c <- &button{ + widget: newWidget(widget), + button: (*C.GtkButton)(unsafe.Pointer(widget)), + } + }, + resp: c, } } diff --git a/redo/window.go b/redo/window.go index 6debe1f..176239b 100644 --- a/redo/window.go +++ b/redo/window.go @@ -31,3 +31,16 @@ type Window interface { // TODO SetSize (TODO remove?) // TODO Center } + +// NewWindow returns a Request to create a new Window with the given title text and size. +func NewWindow(title string, width int, height int) *Request { + return newWindow(title, width, height) +} + +// GetNewWindow is like NewWindow but sends the Request along the given Doer and returns the resultant Window. +// Example: +// w := ui.GetNewWindow(ui.Do, "Main Window") +func GetNewWindow(c Doer, title string, width int, height int) Window { + c <- newWindow(title, width, height) + return (<-c.resp).(Window) +} diff --git a/redo/window_unix.go b/redo/window_unix.go new file mode 100644 index 0000000..f76c350 --- /dev/null +++ b/redo/window_unix.go @@ -0,0 +1,110 @@ +// 7 july 2014 + +package ui + +import ( + "unsafe" +) + +// #include "gtk_unix.h" +import "C" + +type window struct { + widget *C.GtkWidget + container *C.GtkContainer + bin *C.GtkBin + window *C.GtkWindow +} + +func newWindow(title string, width int, height int) *Request { + c := make(chan interface{}) + return &Request{ + op: func() { + widget := C.gtk_window_new(C.GTK_WINDOW_TOPLEVEL) + ctext := togstr(text) + defer freegstr(ctext) + w := &window{ + widget: widget, + container: (*C.GtkContainer)(unsafe.Pointer(widget)), + bin: (*C.GtkBin)(unsafe.Pointer(widget)), + window: (*C.GtkWindow)(unsafe.Pointer(widget)), + } + C.gtk_window_set_title(w.window, ctext) + // TODO size + // TODO content + c <- w + }, + resp: c, + } +} + +func (w *window) SetControl(c Control) *Request { + c := make(chan interface{}) + return &Request{ + op: func() { + // TODO unparent + // TODO reparent + c <- struct{}{} + }, + done: c, + } +} + +func (w *window) Title() *Request { + c := make(chan interface{}) + return &Request{ + op: func() { + c <- fromgstr(C.gtk_window_get_title(w.window)) + }, + resp: c, + } +} + +func (w *window) SetTitle(title string) *Request { + c := make(chan interface{}) + return &Request{ + op: func() { + ctext := togstr(text) + defer freegstr(ctext) + C.gtk_window_set_title(w.window, ctext) + c <- struct{}{} + }, + resp: c, + } +} + + +func (w *window) Show() *Request { + c := make(chan interface{}) + return &Request{ + op: func() { + C.gtk_widget_show_all(w.widget) + c <- struct{}{} + }, + resp: c, + } +} + +func (w *window) Hide() *Request { + c := make(chan interface{}) + return &Request{ + op: func() { + C.gtk_widget_hide(w.widget) + c <- struct{}{} + }, + resp: c, + } +} + +func (w *window) Close() *Request { + c := make(chan interface{}) + return &Request{ + op: func() { + C.gtk_widget_destroy(w.widget) + c <- struct{}{} + }, + resp: c, + } +} + +// TODO OnClosing