func main() { // Initialize GTK without parsing any command line arguments. gtk.Init(nil) // Create a new toplevel window, set its title, and connect it to the // "destroy" signal to exit the GTK main loop when it is destroyed. win, err := gtk.WindowNew(gtk.WINDOW_TOPLEVEL) if err != nil { log.Fatal("Unable to create window:", err) } win.SetTitle("Simple Example") win.Connect("destroy", func() { gtk.MainQuit() }) // Create a new socket: s, err := gtkx.SocketNew() if err != nil { log.Fatal("Unable to create socket:", err) } //Adding the socket to the window: win.Add(s) // Getting the socketId: sId := s.GetId() fmt.Printf("Our socket: %v\n", sId) //Building a Plug for our Socket: p, err := gtkx.PlugNew(sId) if err != nil { log.Fatal("Unable to create plug:", err) } //Building a Button for our Plug: b, err := gtk.ButtonNewWithLabel("Click me .)") if err != nil { log.Fatal("Unable to create button:", err) } //Click events for the Button: b.Connect("clicked", func() { fmt.Printf("Yeah, such clicks!\n") }) //Adding the Button to the Plug: p.Add(b) //Displaying the Plug: p.ShowAll() // Set the default window size. win.SetDefaultSize(800, 600) // Recursively show all widgets contained in this window. win.ShowAll() // Begin executing the GTK main loop. This blocks until // gtk.MainQuit() is run. gtk.Main() }
func setup_btn(label string, onClick func()) *gtk.Button { btn, err := gtk.ButtonNewWithLabel(label) if err != nil { log.Fatal("Unable to create button:", err) } btn.Connect("clicked", onClick) return btn }
func (self *MainWindow) attachFriend(entity api.LineEntity) { btn, err := gtk.ButtonNewWithLabel(entity.GetName()) if err != nil { goline.LoggerPanicln(err) } self.Connect(btn, "clicked", func() { id := entity.GetId() if self.chatWindows[id] == nil { self.chatWindows[id] = NewChatWindow(self, entity) self.chatWindows[id].window.ShowAll() } else { self.chatWindows[id].window.Present() } }) self.friendsBox.Add(btn) }
func createRecvCoins() *gtk.Widget { store, err := gtk.ListStoreNew(glib.TYPE_STRING, glib.TYPE_STRING) if err != nil { log.Fatal(err) } RecvCoins.Store = store tv, err := gtk.TreeViewNewWithModel(store) if err != nil { log.Fatal(err) } RecvCoins.Treeview = tv renderer, err := gtk.CellRendererTextNew() if err != nil { log.Fatal(err) } renderer.Set("editable", true) renderer.Set("editable-set", true) renderer.Connect("edited", func(_ *glib.Object, path, text string) { iter, err := store.GetIterFromString(path) if err == nil { store.Set(iter, []int{0}, []interface{}{text}) } }) col, err := gtk.TreeViewColumnNewWithAttribute("Label", renderer, "text", 0) if err != nil { log.Fatal(err) } col.SetExpand(true) tv.AppendColumn(col) cr, err := gtk.CellRendererTextNew() if err != nil { log.Fatal(err) } col, err = gtk.TreeViewColumnNewWithAttribute("Address", cr, "text", 1) if err != nil { log.Fatal(err) } col.SetMinWidth(350) tv.AppendColumn(col) newAddr, err := gtk.ButtonNewWithLabel("New Address") if err != nil { log.Fatal(err) } newAddr.SetSizeRequest(150, -1) newAddr.Connect("clicked", func() { go func() { triggers.newAddr <- 1 reply := <-triggerReplies.newAddr if err, ok := reply.(error); ok { glib.IdleAdd(func() { mDialog := errorDialog("New address generation failed", err.Error()) mDialog.Run() mDialog.Destroy() }) } else if addr, ok := reply.(string); ok { glib.IdleAdd(func() { iter := RecvCoins.Store.Append() RecvCoins.Store.Set(iter, []int{0, 1}, []interface{}{"", addr}) }) } }() }) newAddr.SetSensitive(false) RecvCoins.NewAddrBtn = newAddr buttons, err := gtk.GridNew() if err != nil { log.Fatal(err) } buttons.Add(newAddr) cpyAddr, err := gtk.ButtonNewWithLabel("Copy Address") if err != nil { log.Fatal(err) } cpyAddr.SetSizeRequest(150, -1) cpyAddr.Connect("clicked", func() { sel, err := tv.GetSelection() if err != nil { log.Fatal(err) } var iter gtk.TreeIter if sel.GetSelected(nil, &iter) { val, err := store.GetValue(&iter, 1) if err != nil { log.Fatal(err) } display, err := gdk.DisplayGetDefault() if err != nil { log.Fatal(err) } clipboard, err := gtk.ClipboardGetForDisplay( display, gdk.SELECTION_CLIPBOARD) if err != nil { log.Fatal(err) } primary, err := gtk.ClipboardGetForDisplay( display, gdk.SELECTION_PRIMARY) if err != nil { log.Fatal(err) } s, _ := val.GetString() clipboard.SetText(s) primary.SetText(s) } }) buttons.Add(cpyAddr) sw, err := gtk.ScrolledWindowNew(nil, nil) if err != nil { log.Fatal(err) } sw.Add(tv) sw.SetPolicy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) sw.SetHExpand(true) sw.SetVExpand(true) grid, err := gtk.GridNew() if err != nil { log.Fatal(err) } grid.SetOrientation(gtk.ORIENTATION_VERTICAL) grid.Add(sw) grid.Add(buttons) return &grid.Container.Widget }
func windowWidget() *gtk.Widget { grid, err := gtk.GridNew() if err != nil { log.Fatal("Unable to create grid:", err) } grid.SetOrientation(gtk.ORIENTATION_VERTICAL) // Just as a demonstration, we create and destroy a Label without ever // adding it to a container. In native GTK, this would result in a // memory leak, since gtk_widget_destroy() will not deallocate any // memory when passed a GtkWidget with a floating reference. // // gotk3 handles this situation by always sinking floating references // of any struct type embedding a glib.InitiallyUnowned, and by setting // a finalizer to unreference the object when Go has lost scope of the // variable. Due to this design, widgets may be allocated freely // without worrying about handling memory incorrectly. // // The following code is not entirely useful (except to demonstrate // this point), but it is also not "incorrect" as the C equivalent // would be. unused, err := gtk.LabelNew("This label is never used") if err != nil { // Calling Destroy() is also unnecessary in this case. The // memory will still be freed with or without calling it. unused.Destroy() } sw, err := gtk.ScrolledWindowNew(nil, nil) if err != nil { log.Fatal("Unable to create scrolled window:", err) } grid.Attach(sw, 0, 0, 2, 1) sw.SetHExpand(true) sw.SetVExpand(true) labelsGrid, err := gtk.GridNew() if err != nil { log.Fatal("Unable to create grid:", err) } labelsGrid.SetOrientation(gtk.ORIENTATION_VERTICAL) sw.Add(labelsGrid) labelsGrid.SetHExpand(true) insertBtn, err := gtk.ButtonNewWithLabel("Add a label") if err != nil { log.Fatal("Unable to create button:", err) } removeBtn, err := gtk.ButtonNewWithLabel("Remove a label") if err != nil { log.Fatal("Unable to create button:", err) } nLabels := 1 insertBtn.Connect("clicked", func() { var s string if nLabels == 1 { s = fmt.Sprintf("Inserted %d label.", nLabels) } else { s = fmt.Sprintf("Inserted %d labels.", nLabels) } label, err := gtk.LabelNew(s) if err != nil { log.Print("Unable to create label:", err) return } labelList.PushBack(label) labelsGrid.Add(label) label.SetHExpand(true) labelsGrid.ShowAll() nLabels++ }) removeBtn.Connect("clicked", func() { e := labelList.Front() if e == nil { log.Print("Nothing to remove") return } lab, ok := labelList.Remove(e).(*gtk.Label) if !ok { log.Print("Element to remove is not a *gtk.Label") return } // (*Widget).Destroy() breaks this label's reference with all // other objects (in this case, the Grid container it was added // to). lab.Destroy() // At this point, only Go retains a reference to the GtkLabel. // When the lab variable goes out of scope when this function // returns, at the next garbage collector run, a finalizer will // be run to perform the final unreference and free the widget. }) grid.Attach(insertBtn, 0, 1, 1, 1) grid.Attach(removeBtn, 1, 1, 1, 1) return &grid.Container.Widget }
func createAddrBook() *gtk.Widget { grid, err := gtk.GridNew() if err != nil { log.Fatal(err) } grid.SetOrientation(gtk.ORIENTATION_VERTICAL) store, err := gtk.ListStoreNew(glib.TYPE_STRING, glib.TYPE_STRING) if err != nil { log.Fatal(err) } tv, err := gtk.TreeViewNew() if err != nil { log.Fatal(err) } tv.SetModel(store) addrBookWidgets.store = store addrBookWidgets.treeview = tv sw, err := gtk.ScrolledWindowNew(nil, nil) if err != nil { log.Fatal(err) } sw.Add(tv) sw.SetPolicy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) sw.SetHExpand(true) sw.SetVExpand(true) grid.Add(sw) renderer, err := gtk.CellRendererTextNew() if err != nil { log.Fatal(err) } renderer.Set("editable", true) renderer.Set("editable-set", true) renderer.Connect("edited", func(_ *glib.Object, path, text string) { iter, err := store.GetIterFromString(path) if err == nil { store.Set(iter, []int{0}, []interface{}{text}) } }) col, err := gtk.TreeViewColumnNewWithAttribute("Label", renderer, "text", 0) if err != nil { log.Fatal(err) } col.SetExpand(true) tv.AppendColumn(col) renderer, err = gtk.CellRendererTextNew() if err != nil { log.Fatal(err) } renderer.Set("editable", true) renderer.Set("editable-set", true) renderer.Connect("edited", func(_ *glib.Object, path, text string) { iter, err := store.GetIterFromString(path) if err == nil { // TODO(jrick): verify this is a valid address store.Set(iter, []int{1}, []interface{}{text}) } }) col, err = gtk.TreeViewColumnNewWithAttribute("Address", renderer, "text", 1) if err != nil { log.Fatal(err) } col.SetMinWidth(350) tv.AppendColumn(col) // put in an example address iter := store.Append() store.Set(iter, []int{0, 1}, []interface{}{"editable label", "01234567890"}) buttons, err := gtk.GridNew() if err != nil { log.Fatal(err) } newAddr, err := gtk.ButtonNewWithLabel("New Address") if err != nil { log.Fatal(err) } newAddr.SetSizeRequest(150, -1) newAddr.Connect("clicked", func() { iter := store.Append() store.Set(iter, []int{0, 1}, []interface{}{"", "new address"}) }) buttons.Add(newAddr) cpyAddr, err := gtk.ButtonNewWithLabel("Copy Address") if err != nil { log.Fatal(err) } cpyAddr.SetSizeRequest(150, -1) cpyAddr.Connect("clicked", func() { sel, err := tv.GetSelection() if err != nil { log.Fatal(err) } var iter gtk.TreeIter if sel.GetSelected(nil, &iter) { val, err := store.GetValue(&iter, 1) if err != nil { log.Fatal(err) } display, err := gdk.DisplayGetDefault() if err != nil { log.Fatal(err) } clipboard, err := gtk.ClipboardGetForDisplay( display, gdk.SELECTION_CLIPBOARD) if err != nil { log.Fatal(err) } primary, err := gtk.ClipboardGetForDisplay( display, gdk.SELECTION_PRIMARY) if err != nil { log.Fatal(err) } s, _ := val.GetString() clipboard.SetText(s) primary.SetText(s) } }) buttons.Add(cpyAddr) grid.Add(buttons) return &grid.Container.Widget }
func main() { gtk.Init(nil) win, err := gtk.WindowNew(gtk.WINDOW_TOPLEVEL) if err != nil { log.Fatal("Unable to create window:", err) } win.SetTitle("UDP client v0.0.1") win.Connect("destroy", func() { gtk.MainQuit() }) var c client.Client answers := make(chan string) grid, err := gtk.GridNew() if err != nil { log.Fatal("Unable to create grid:", err) } messageHistory, err := gtk.TextViewNew() if err != nil { log.Fatal("Unable to create TextView:", err) } grid.Attach(messageHistory, 0, 0, 4, 1) messageEntry, err := gtk.EntryNew() if err != nil { log.Fatal("Unable to create entry:", err) } grid.Attach(messageEntry, 0, 1, 1, 1) privateEntry, err := gtk.EntryNew() if err != nil { log.Fatal("Unable to create entry:", err) } grid.Attach(privateEntry, 1, 1, 1, 1) sendButton, err := gtk.ButtonNewWithLabel("Send") if err != nil { log.Fatal("Unable to create button:", err) } sendButton.Connect("clicked", func(btn *gtk.Button) { lbl, _ := btn.GetLabel() if lbl != "Send" { return } log.Print(lbl) msg, _ := messageEntry.GetText() log.Print(msg) c.Message(msg) }) grid.Attach(sendButton, 0, 2, 1, 1) privateButton, err := gtk.ButtonNewWithLabel("Private") if err != nil { log.Fatal("Unable to create button:", err) } privateButton.Connect("clicked", func(btn *gtk.Button) { lbl, _ := btn.GetLabel() if lbl != "Private" { return } log.Print(lbl) private, _ := privateEntry.GetText() log.Print(private) if private != "" { msg, _ := messageEntry.GetText() log.Print(msg) c.Private(private, msg) } }) grid.Attach(privateButton, 1, 2, 1, 1) listButton, err := gtk.ButtonNewWithLabel("List") if err != nil { log.Fatal("Unable to create button:", err) } listButton.Connect("clicked", func(btn *gtk.Button) { lbl, _ := btn.GetLabel() if lbl != "List" { return } log.Print(lbl) c.List() log.Print(lbl) }) grid.Attach(listButton, 2, 1, 1, 1) leaveButton, err := gtk.ButtonNewWithLabel("Leave") if err != nil { log.Fatal("Unable to create button:", err) } leaveButton.Connect("clicked", func(btn *gtk.Button) { lbl, _ := btn.GetLabel() if lbl != "Leave" { return } log.Print(lbl) c.Leave() os.Exit(0) }) grid.Attach(leaveButton, 3, 1, 1, 1) win.Add(grid) // Set the default window size. win.SetDefaultSize(400, 600) // Recursively show all widgets contained in this window. win.ShowAll() port, _ := strconv.Atoi(os.Args[3]) c.Init(os.Args[1], os.Args[2], port, answers) go printMessages(messageHistory, answers) go c.Answer() c.Register() gtk.Main() }
func main() { gtk.Init(nil) win, err := gtk.WindowNew(gtk.WINDOW_TOPLEVEL) if err != nil { log.Fatal("Unable to create window:", err) } win.SetTitle("Grid Example") win.Connect("destroy", func() { gtk.MainQuit() }) // Create a new grid widget to arrange child widgets grid, err := gtk.GridNew() if err != nil { log.Fatal("Unable to create grid:", err) } // gtk.Grid embeds an Orientable struct to simulate the GtkOrientable // GInterface. Set the orientation from the default horizontal to // vertical. grid.SetOrientation(gtk.ORIENTATION_VERTICAL) // Create some widgets to put in the grid. lab, err := gtk.LabelNew("Just a label") if err != nil { log.Fatal("Unable to create label:", err) } btn, err := gtk.ButtonNewWithLabel("Button with label") if err != nil { log.Fatal("Unable to create button:", err) } entry, err := gtk.EntryNew() if err != nil { log.Fatal("Unable to create entry:", err) } spnBtn, err := gtk.SpinButtonNewWithRange(0.0, 1.0, 0.001) if err != nil { log.Fatal("Unable to create spin button:", err) } nb, err := gtk.NotebookNew() if err != nil { log.Fatal("Unable to create notebook:", err) } // Calling (*gtk.Container).Add() with a gtk.Grid will add widgets next // to each other, in the order they were added, to the right side of the // last added widget when the grid is in a horizontal orientation, and // at the bottom of the last added widget if the grid is in a vertial // orientation. Using a grid in this manner works similar to a gtk.Box, // but unlike gtk.Box, a gtk.Grid will respect its child widget's expand // and margin properties. grid.Add(btn) grid.Add(lab) grid.Add(entry) grid.Add(spnBtn) // Widgets may also be added by calling (*gtk.Grid).Attach() to specify // where to place the widget in the grid, and optionally how many rows // and columns to span over. // // Additional rows and columns are automatically added to the grid as // necessary when new widgets are added with (*gtk.Container).Add(), or, // as shown in this case, using (*gtk.Grid).Attach(). // // In this case, a notebook is added beside the widgets inserted above. // The notebook widget is inserted with a left position of 1, a top // position of 1 (starting at the same vertical position as the button), // a width of 1 column, and a height of 2 rows (spanning down to the // same vertical position as the entry). // // This example also demonstrates how not every area of the grid must // contain a widget. In particular, the area to the right of the label // and the right of spin button have contain no widgets. grid.Attach(nb, 1, 1, 1, 2) nb.SetHExpand(true) nb.SetVExpand(true) // Add a child widget and tab label to the notebook so it renders. nbChild, err := gtk.LabelNew("Notebook content") if err != nil { log.Fatal("Unable to create button:", err) } nbTab, err := gtk.LabelNew("Tab label") if err != nil { log.Fatal("Unable to create label:", err) } nb.AppendPage(nbChild, nbTab) // Add the grid to the window, and show all widgets. win.Add(grid) win.ShowAll() gtk.Main() }
func createSendCoins() *gtk.Widget { grid, err := gtk.GridNew() if err != nil { log.Fatal(err) } grid.SetOrientation(gtk.ORIENTATION_VERTICAL) sw, err := gtk.ScrolledWindowNew(nil, nil) if err != nil { log.Fatal(err) } sw.SetPolicy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) sw.SetHExpand(true) sw.SetVExpand(true) grid.Add(sw) entriesGrid, err := gtk.GridNew() if err != nil { log.Fatal(err) } SendCoins.EntryGrid = entriesGrid entriesGrid.SetOrientation(gtk.ORIENTATION_VERTICAL) sw.Add(entriesGrid) insertSendEntries(entriesGrid) bot, err := gtk.GridNew() if err != nil { log.Fatal(err) } btn, err := gtk.ButtonNewWithLabel("Add Recipient") if err != nil { log.Fatal(err) } btn.SetSizeRequest(150, -1) btn.Connect("clicked", func() { insertSendEntries(entriesGrid) }) bot.Add(btn) l, err := gtk.LabelNew("Balance: ") if err != nil { log.Fatal(err) } bot.Add(l) SendCoins.Balance = l submitBtn, err := gtk.ButtonNewWithLabel("Send") if err != nil { log.Fatal(err) } submitBtn.SetSizeRequest(150, -1) submitBtn.SetHAlign(gtk.ALIGN_END) submitBtn.SetHExpand(true) submitBtn.SetSensitive(false) submitBtn.Connect("clicked", func() { sendTo := make(map[string]float64) for e := recipients.Front(); e != nil; e = e.Next() { r := e.Value.(*recipient) // Get and validate address addr, err := r.payTo.GetText() if err != nil { d := errorDialog("Error getting payment address", err.Error()) d.Run() d.Destroy() return } _, net, err := btcutil.DecodeAddress(addr) if err != nil { d := errorDialog("Invalid payment address", fmt.Sprintf("'%v' is not a valid payment address", addr)) d.Run() d.Destroy() return } switch net { case btcwire.MainNet: if !cfg.MainNet { d := errorDialog("Invalid payment address", fmt.Sprintf("'%v' is a mainnet address", addr)) d.Run() d.Destroy() return } case btcwire.TestNet3: if cfg.MainNet { d := errorDialog("Invalid payment address", fmt.Sprintf("'%v' is a testnet address", addr)) d.Run() d.Destroy() return } } // Get amount and units and convert to float64 amt := r.amount.GetValue() // Combo box isn't used right now. /* switch r.combo.GetActive() { case 0: // BTC // nothing case 1: // mBTC amt /= 1000 case 2: // uBTC amt /= 1000000 } */ sendTo[addr] = amt } go txSenderAndReplyListener(sendTo) }) SendCoins.SendBtn = submitBtn bot.Add(submitBtn) grid.Add(bot) return &grid.Container.Widget }