From 33155f7496a818a1ed83fe49cccb63be7842bc81 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Mon, 30 Jun 2014 09:57:44 -0400 Subject: Reverted everything back to the old API. --- sysdata_unix.go | 236 ++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 176 insertions(+), 60 deletions(-) (limited to 'sysdata_unix.go') diff --git a/sysdata_unix.go b/sysdata_unix.go index b39df50..7814fb3 100644 --- a/sysdata_unix.go +++ b/sysdata_unix.go @@ -118,30 +118,42 @@ var classTypes = [nctypes]*classData{ func (s *sysData) make(window *sysData) error { ct := classTypes[s.ctype] - if s.alternate { - s.widget = ct.makeAlt() - } else { - s.widget = ct.make() + ret := make(chan *C.GtkWidget) + defer close(ret) + uitask <- func() { + if s.alternate { + ret <- ct.makeAlt() + return + } + ret <- ct.make() } + s.widget = <-ret if window == nil { - fixed := gtkNewWindowLayout() - gtk_container_add(s.widget, fixed) - for signame, sigfunc := range ct.signals { - g_signal_connect(s.widget, signame, sigfunc, s) + uitask <- func() { + fixed := gtkNewWindowLayout() + gtk_container_add(s.widget, fixed) + for signame, sigfunc := range ct.signals { + g_signal_connect(s.widget, signame, sigfunc, s) + } + ret <- fixed } - s.container = fixed + s.container = <-ret } else { s.container = window.container - gtkAddWidgetToLayout(s.container, s.widget) - for signame, sigfunc := range ct.signals { - g_signal_connect(s.widget, signame, sigfunc, s) - } - if ct.child != nil { - child := ct.child(s.widget) - for signame, sigfunc := range ct.childsigs { - g_signal_connect(child, signame, sigfunc, s) + uitask <- func() { + gtkAddWidgetToLayout(s.container, s.widget) + for signame, sigfunc := range ct.signals { + g_signal_connect(s.widget, signame, sigfunc, s) } + if ct.child != nil { + child := ct.child(s.widget) + for signame, sigfunc := range ct.childsigs { + g_signal_connect(child, signame, sigfunc, s) + } + } + ret <- nil } + <-ret } return nil } @@ -158,17 +170,35 @@ func (s *sysData) firstShow() error { } func (s *sysData) show() { - gtk_widget_show(s.widget) - s.resetposition() + ret := make(chan struct{}) + defer close(ret) + uitask <- func() { + gtk_widget_show(s.widget) + s.resetposition() + ret <- struct{}{} + } + <-ret } func (s *sysData) hide() { - gtk_widget_hide(s.widget) - s.resetposition() + ret := make(chan struct{}) + defer close(ret) + uitask <- func() { + gtk_widget_hide(s.widget) + s.resetposition() + ret <- struct{}{} + } + <-ret } func (s *sysData) setText(text string) { - classTypes[s.ctype].setText(s.widget, text) + ret := make(chan struct{}) + defer close(ret) + uitask <- func() { + classTypes[s.ctype].setText(s.widget, text) + ret <- struct{}{} + } + <-ret } func (s *sysData) setRect(x int, y int, width int, height int, winheight int) error { @@ -178,51 +208,103 @@ func (s *sysData) setRect(x int, y int, width int, height int, winheight int) er } func (s *sysData) isChecked() bool { - return gtk_toggle_button_get_active(s.widget) + ret := make(chan bool) + defer close(ret) + uitask <- func() { + ret <- gtk_toggle_button_get_active(s.widget) + } + return <-ret } func (s *sysData) text() string { - return classTypes[s.ctype].text(s.widget) + ret := make(chan string) + defer close(ret) + uitask <- func() { + ret <- classTypes[s.ctype].text(s.widget) + } + return <-ret } func (s *sysData) append(what string) { - classTypes[s.ctype].append(s.widget, what) + ret := make(chan struct{}) + defer close(ret) + uitask <- func() { + classTypes[s.ctype].append(s.widget, what) + ret <- struct{}{} + } + <-ret } func (s *sysData) insertBefore(what string, before int) { - classTypes[s.ctype].insert(s.widget, before, what) + ret := make(chan struct{}) + defer close(ret) + uitask <- func() { + classTypes[s.ctype].insert(s.widget, before, what) + ret <- struct{}{} + } + <-ret } func (s *sysData) selectedIndex() int { - return classTypes[s.ctype].selected(s.widget) + ret := make(chan int) + defer close(ret) + uitask <- func() { + ret <- classTypes[s.ctype].selected(s.widget) + } + return <-ret } func (s *sysData) selectedIndices() []int { - return classTypes[s.ctype].selMulti(s.widget) + ret := make(chan []int) + defer close(ret) + uitask <- func() { + ret <- classTypes[s.ctype].selMulti(s.widget) + } + return <-ret } func (s *sysData) selectedTexts() []string { - return classTypes[s.ctype].smtexts(s.widget) + ret := make(chan []string) + defer close(ret) + uitask <- func() { + ret <- classTypes[s.ctype].smtexts(s.widget) + } + return <-ret } func (s *sysData) setWindowSize(width int, height int) error { - // does not take window geometry into account (and cannot, since the window manager won't give that info away) - // thanks to TingPing in irc.gimp.net/#gtk+ - gtk_window_resize(s.widget, width, height) + ret := make(chan struct{}) + defer close(ret) + uitask <- func() { + // does not take window geometry into account (and cannot, since the window manager won't give that info away) + // thanks to TingPing in irc.gimp.net/#gtk+ + gtk_window_resize(s.widget, width, height) + ret <- struct{}{} + } + <-ret return nil } func (s *sysData) delete(index int) { - classTypes[s.ctype].delete(s.widget, index) + ret := make(chan struct{}) + defer close(ret) + uitask <- func() { + classTypes[s.ctype].delete(s.widget, index) + ret <- struct{}{} + } + <-ret } // With GTK+, we must manually pulse the indeterminate progressbar ourselves. This goroutine does that. func (s *sysData) progressPulse() { - // TODO this could probably be done differently... pulse := func() { - touitask(func() { + ret := make(chan struct{}) + defer close(ret) + uitask <- func() { gtk_progress_bar_pulse(s.widget) - }) + ret <- struct{}{} + } + <-ret } var ticker *time.Ticker @@ -263,44 +345,78 @@ func (s *sysData) setProgress(percent int) { } s.pulse <- false <-s.pulse // wait for sysData.progressPulse() to register that - gtk_progress_bar_set_fraction(s.widget, percent) + ret := make(chan struct{}) + defer close(ret) + uitask <- func() { + gtk_progress_bar_set_fraction(s.widget, percent) + ret <- struct{}{} + } + <-ret } func (s *sysData) len() int { - return classTypes[s.ctype].len(s.widget) + ret := make(chan int) + defer close(ret) + uitask <- func() { + ret <- classTypes[s.ctype].len(s.widget) + } + return <-ret } func (s *sysData) setAreaSize(width int, height int) { - c := gtkAreaGetControl(s.widget) - gtk_widget_set_size_request(c, width, height) - s.areawidth = width // for sysData.preferredSize() - s.areaheight = height - C.gtk_widget_queue_draw(c) + ret := make(chan struct{}) + defer close(ret) + uitask <- func() { + c := gtkAreaGetControl(s.widget) + gtk_widget_set_size_request(c, width, height) + s.areawidth = width // for sysData.preferredSize() + s.areaheight = height + C.gtk_widget_queue_draw(c) + ret <- struct{}{} + } + <-ret } -// TODO should this be made safe? (TODO move to area.go) func (s *sysData) repaintAll() { - c := gtkAreaGetControl(s.widget) - C.gtk_widget_queue_draw(c) + ret := make(chan struct{}) + defer close(ret) + uitask <- func() { + c := gtkAreaGetControl(s.widget) + C.gtk_widget_queue_draw(c) + ret <- struct{}{} + } + <-ret } func (s *sysData) center() { - if C.gtk_widget_get_visible(s.widget) == C.FALSE { - // hint to the WM to make it centered when it is shown again - // thanks to Jasper in irc.gimp.net/#gtk+ - C.gtk_window_set_position(togtkwindow(s.widget), C.GTK_WIN_POS_CENTER) - } else { - var width, height C.gint - - s.resetposition() - //we should be able to use gravity to simplify this, but it doesn't take effect immediately, and adding show calls does nothing (thanks Jasper in irc.gimp.net/#gtk+) - C.gtk_window_get_size(togtkwindow(s.widget), &width, &height) - C.gtk_window_move(togtkwindow(s.widget), - (C.gdk_screen_width() / 2) - (width / 2), - (C.gdk_screen_height() / 2) - (width / 2)) + ret := make(chan struct{}) + defer close(ret) + uitask <- func() { + if C.gtk_widget_get_visible(s.widget) == C.FALSE { + // hint to the WM to make it centered when it is shown again + // thanks to Jasper in irc.gimp.net/#gtk+ + C.gtk_window_set_position(togtkwindow(s.widget), C.GTK_WIN_POS_CENTER) + } else { + var width, height C.gint + + s.resetposition() + //we should be able to use gravity to simplify this, but it doesn't take effect immediately, and adding show calls does nothing (thanks Jasper in irc.gimp.net/#gtk+) + C.gtk_window_get_size(togtkwindow(s.widget), &width, &height) + C.gtk_window_move(togtkwindow(s.widget), + (C.gdk_screen_width() / 2) - (width / 2), + (C.gdk_screen_height() / 2) - (width / 2)) + } + ret <- struct{}{} } + <-ret } func (s *sysData) setChecked(checked bool) { - gtk_toggle_button_set_active(s.widget, checked) + ret := make(chan struct{}) + defer close(ret) + uitask <- func() { + gtk_toggle_button_set_active(s.widget, checked) + ret <- struct{}{} + } + <-ret } -- cgit v1.2.3