func start_server(c *xgb.Conn, s *xproto.ScreenInfo, rl_execute_atom xproto.Atom) { win, err := xproto.NewWindowId(c) if err != nil { panic(err) } // Make a window which can be communicated with err = xproto.CreateWindowChecked(c, s.RootDepth, win, s.Root, 0, 0, 1, 1, 0, 0, 0, 0, nil).Check() if err != nil { panic(err) } err = xproto.ChangePropertyChecked(c, xproto.PropModeReplace, win, rl_execute_atom, xproto.AtomString, 8, xproto.PropModeReplace, []byte("\x00")).Check() if err != nil { panic(err) } err = xproto.ChangeWindowAttributesChecked(c, win, xproto.CwEventMask, []uint32{xproto.EventMaskPropertyChange}).Check() if err != nil { panic(err) } get_execute_value := func() string { response, err := xproto.GetProperty(c, false, win, rl_execute_atom, xproto.GetPropertyTypeAny, 0, 1024).Reply() if err != nil { panic(err) } result := string(response.Value) return result } log.Print("Ready and waiting..") // Event loop for { reply, err := c.WaitForEvent() if err != nil { log.Panic("Error in event loop:", err) } switch event := reply.(type) { case xproto.PropertyNotifyEvent: if event.Window == win && event.Atom == rl_execute_atom { values := strings.Split(get_execute_value(), "\x00") run(values) } } } }
func xloop(conn *xgb.Conn, c chan types.Order) { for { ev, xerr := conn.WaitForEvent() if ev == nil && xerr == nil { c <- types.KillOrder{} } if ev != nil { switch ev.(type) { case xproto.ExposeEvent: c <- types.RedrawOrder{} } } } }