Skip to content

Commit

Permalink
Avoid expensive check callbacks where we can
Browse files Browse the repository at this point in the history
  • Loading branch information
andydotxyz committed Jan 3, 2024
1 parent d8d100d commit c7629f1
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 85 deletions.
31 changes: 8 additions & 23 deletions internal/x11/win/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,9 @@ type client struct {
// NewClient creates a new X11 client for the specified window ID and X window manager
func NewClient(win xproto.Window, wm x11.XWM) x11.XWin {
c := &client{win: win, wm: wm, desk: fynedesk.Instance().Desktop()}
err := xproto.ChangeWindowAttributesChecked(wm.Conn(), win, xproto.CwEventMask,
xproto.ChangeWindowAttributes(wm.Conn(), win, xproto.CwEventMask,
[]uint32{xproto.EventMaskPropertyChange | xproto.EventMaskEnterWindow | xproto.EventMaskLeaveWindow |
xproto.EventMaskVisibilityChange}).Check()
if err != nil {
fyne.LogError("Could not change window attributes", err)
}
xproto.EventMaskVisibilityChange})
windowAllowedActionsSet(wm.X(), win, x11.AllowedActions)

initialHints := x11.WindowExtendedHintsGet(wm.X(), c.win)
Expand Down Expand Up @@ -92,10 +89,7 @@ func (c *client) Close() {
}

if !askNicely {
err := xproto.DestroyWindowChecked(c.wm.Conn(), c.win).Check()
if err != nil {
fyne.LogError("Close Error", err)
}
xproto.DestroyWindow(c.wm.Conn(), c.win)

return
}
Expand All @@ -118,10 +112,7 @@ func (c *client) Close() {
return
}

err = xproto.SendEventChecked(c.wm.Conn(), false, c.win, 0, string(cm.Bytes())).Check()
if err != nil {
fyne.LogError("Window Delete Error", err)
}
xproto.SendEvent(c.wm.Conn(), false, c.win, 0, string(cm.Bytes()))
}

func (c *client) Desktop() int {
Expand Down Expand Up @@ -316,11 +307,8 @@ func (c *client) RaiseAbove(win fynedesk.Window) {
return
}

err := xproto.ConfigureWindowChecked(c.wm.Conn(), c.id, xproto.ConfigWindowSibling|xproto.ConfigWindowStackMode,
[]uint32{uint32(topID), uint32(xproto.StackModeAbove)}).Check()
if err != nil {
fyne.LogError("Restack Error", err)
}
xproto.ConfigureWindow(c.wm.Conn(), c.id, xproto.ConfigWindowSibling|xproto.ConfigWindowStackMode,
[]uint32{uint32(topID), uint32(xproto.StackModeAbove)})
}

func (c *client) RaiseToTop() {
Expand Down Expand Up @@ -430,12 +418,9 @@ func (c *client) positionNewWindow() {
decorated, fynedesk.Instance().Screens())
}

err = xproto.ConfigureWindowChecked(c.wm.Conn(), c.win, xproto.ConfigWindowX|xproto.ConfigWindowY|
xproto.ConfigureWindow(c.wm.Conn(), c.win, xproto.ConfigWindowX|xproto.ConfigWindowY|
xproto.ConfigWindowWidth|xproto.ConfigWindowHeight, []uint32{uint32(x), uint32(y),
uint32(w), uint32(h)}).Check()
if err != nil {
fyne.LogError("", err)
}
uint32(w), uint32(h)})
}

func (c *client) stateMessage(state int) {
Expand Down
74 changes: 22 additions & 52 deletions internal/x11/win/frame.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,12 +155,9 @@ func newFrame(c *client) *frame {
}

if full || maximized {
err = xproto.ConfigureWindowChecked(c.wm.Conn(), c.win, xproto.ConfigWindowX|xproto.ConfigWindowY|
xproto.ConfigureWindow(c.wm.Conn(), c.win, xproto.ConfigWindowX|xproto.ConfigWindowY|
xproto.ConfigWindowWidth|xproto.ConfigWindowHeight,
[]uint32{uint32(offsetX), uint32(offsetY), uint32(framed.childWidth), uint32(framed.childHeight)}).Check()
if err != nil {
fyne.LogError("Configure Window Error", err)
}
[]uint32{uint32(offsetX), uint32(offsetY), uint32(framed.childWidth), uint32(framed.childHeight)})
}

windowStateSet(c.wm.X(), c.win, icccm.StateNormal)
Expand Down Expand Up @@ -194,33 +191,24 @@ func (f *frame) addBorder() {
}
f.applyTheme(true)

err := xproto.ConfigureWindowChecked(f.client.wm.Conn(), f.client.win, xproto.ConfigWindowX|xproto.ConfigWindowY|
xproto.ConfigureWindow(f.client.wm.Conn(), f.client.win, xproto.ConfigWindowX|xproto.ConfigWindowY|
xproto.ConfigWindowWidth|xproto.ConfigWindowHeight,
[]uint32{uint32(x), uint32(y), uint32(f.childWidth), uint32(f.childHeight)}).Check()
if err != nil {
fyne.LogError("Configure Window Error", err)
}
err = xproto.ConfigureWindowChecked(f.client.wm.Conn(), f.client.id, xproto.ConfigWindowX|xproto.ConfigWindowY|
[]uint32{uint32(x), uint32(y), uint32(f.childWidth), uint32(f.childHeight)})
xproto.ConfigureWindow(f.client.wm.Conn(), f.client.id, xproto.ConfigWindowX|xproto.ConfigWindowY|
xproto.ConfigWindowWidth|xproto.ConfigWindowHeight,
[]uint32{uint32(f.x), uint32(f.y), uint32(w), uint32(h)}).Check()
if err != nil {
fyne.LogError("Configure Window Error", err)
}
[]uint32{uint32(f.x), uint32(f.y), uint32(w), uint32(h)})

err = ewmh.FrameExtentsSet(f.client.wm.X(), f.client.win, &ewmh.FrameExtents{Left: int(borderWidth), Right: int(borderWidth), Top: int(titleHeight), Bottom: int(borderWidth)})
err := ewmh.FrameExtentsSet(f.client.wm.X(), f.client.win, &ewmh.FrameExtents{Left: int(borderWidth), Right: int(borderWidth), Top: int(titleHeight), Bottom: int(borderWidth)})
if err != nil {
fyne.LogError("", err)
}
f.notifyInnerGeometry()
}

func (f *frame) applyBorderlessTheme() {
err := xproto.ConfigureWindowChecked(f.client.wm.Conn(), f.client.win, xproto.ConfigWindowX|xproto.ConfigWindowY|
xproto.ConfigureWindow(f.client.wm.Conn(), f.client.win, xproto.ConfigWindowX|xproto.ConfigWindowY|
xproto.ConfigWindowWidth|xproto.ConfigWindowHeight,
[]uint32{uint32(0), uint32(0), uint32(f.width), uint32(f.height)}).Check()
if err != nil {
fyne.LogError("Configure Window Error", err)
}
[]uint32{uint32(0), uint32(0), uint32(f.width), uint32(f.height)})
}

func (f *frame) applyTheme(force bool) {
Expand Down Expand Up @@ -290,11 +278,8 @@ func (f *frame) copyDecorationPixels(width, height, xoff, yoff uint32, img image
i += 4
}
}
err := xproto.PutImageChecked(f.client.wm.Conn(), xproto.ImageFormatZPixmap, xproto.Drawable(pid), draw,
uint16(width), uint16(height), 0, int16(yoff), 0, depth, data).Check()
if err != nil {
fyne.LogError("Put image error", err)
}
xproto.PutImage(f.client.wm.Conn(), xproto.ImageFormatZPixmap, xproto.Drawable(pid), draw,
uint16(width), uint16(height), 0, int16(yoff), 0, depth, data)
}

func (f *frame) createPixmaps(depth byte) error {
Expand Down Expand Up @@ -621,11 +606,8 @@ func (f *frame) mouseMotion(x, y int16) {
if refresh {
f.applyTheme(true)
}
err := xproto.ChangeWindowAttributesChecked(f.client.wm.Conn(), f.client.id, xproto.CwCursor,
[]uint32{uint32(cursor)}).Check()
if err != nil {
fyne.LogError("Set Cursor Error", err)
}
xproto.ChangeWindowAttributes(f.client.wm.Conn(), f.client.id, xproto.CwCursor,
[]uint32{uint32(cursor)})
}

func (f *frame) lookupResizeCursor(x, y int16) xproto.Cursor {
Expand Down Expand Up @@ -802,20 +784,14 @@ func (f *frame) removeBorder() {
}
f.applyTheme(true)

err := xproto.ConfigureWindowChecked(f.client.wm.Conn(), f.client.id, xproto.ConfigWindowX|xproto.ConfigWindowY|
xproto.ConfigureWindow(f.client.wm.Conn(), f.client.id, xproto.ConfigWindowX|xproto.ConfigWindowY|
xproto.ConfigWindowWidth|xproto.ConfigWindowHeight,
[]uint32{uint32(f.x), uint32(f.y), uint32(f.width), uint32(f.height)}).Check()
if err != nil {
fyne.LogError("Configure Window Error", err)
}
err = xproto.ConfigureWindowChecked(f.client.wm.Conn(), f.client.win, xproto.ConfigWindowX|xproto.ConfigWindowY|
[]uint32{uint32(f.x), uint32(f.y), uint32(f.width), uint32(f.height)})
xproto.ConfigureWindow(f.client.wm.Conn(), f.client.win, xproto.ConfigWindowX|xproto.ConfigWindowY|
xproto.ConfigWindowWidth|xproto.ConfigWindowHeight,
[]uint32{0, 0, uint32(f.childWidth), uint32(f.childHeight)}).Check()
if err != nil {
fyne.LogError("Configure Window Error", err)
}
[]uint32{0, 0, uint32(f.childWidth), uint32(f.childHeight)})

err = ewmh.FrameExtentsSet(f.client.wm.X(), f.client.win, &ewmh.FrameExtents{Left: 0, Right: 0, Top: 0, Bottom: 0})
err := ewmh.FrameExtentsSet(f.client.wm.X(), f.client.win, &ewmh.FrameExtents{Left: 0, Right: 0, Top: 0, Bottom: 0})
if err != nil {
fyne.LogError("", err)
}
Expand Down Expand Up @@ -892,18 +868,12 @@ func (f *frame) updateGeometry(x, y int16, w, h uint16, force bool) {
f.childWidth = uint16(innerW)
f.childHeight = uint16(innerH)

err := xproto.ConfigureWindowChecked(f.client.wm.Conn(), f.client.id, xproto.ConfigWindowX|xproto.ConfigWindowY|
xproto.ConfigureWindow(f.client.wm.Conn(), f.client.id, xproto.ConfigWindowX|xproto.ConfigWindowY|
xproto.ConfigWindowWidth|xproto.ConfigWindowHeight,
[]uint32{uint32(f.x), uint32(f.y), uint32(f.width), uint32(f.height)}).Check()
if err != nil {
fyne.LogError("Configure Window Error", err)
}
err = xproto.ConfigureWindowChecked(f.client.wm.Conn(), f.client.win, xproto.ConfigWindowX|xproto.ConfigWindowY|
[]uint32{uint32(f.x), uint32(f.y), uint32(f.width), uint32(f.height)})
xproto.ConfigureWindow(f.client.wm.Conn(), f.client.win, xproto.ConfigWindowX|xproto.ConfigWindowY|
xproto.ConfigWindowWidth|xproto.ConfigWindowHeight,
[]uint32{innerX, innerY, uint32(f.childWidth), uint32(f.childHeight)}).Check()
if err != nil {
fyne.LogError("Configure Window Error", err)
}
[]uint32{innerX, innerY, uint32(f.childWidth), uint32(f.childHeight)})

newScreen := fynedesk.Instance().Screens().ScreenForWindow(f.client)
if newScreen != currentScreen {
Expand Down
13 changes: 3 additions & 10 deletions internal/x11/wm/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,7 @@ func (x *x11WM) handleActiveWin(ev xproto.ClientMessageEvent) {
}

// ask for focus, when it is lost return to root window
err = xproto.SetInputFocusChecked(x.x.Conn(), 1, ev.Window, xproto.TimeCurrentTime).Check()
if err != nil {
fyne.LogError("Could not set focus", err)
return
}
xproto.SetInputFocus(x.x.Conn(), 1, ev.Window, xproto.TimeCurrentTime).Check()
}
if notifyFocus {
protocolAtm, err := xprop.Atm(x.x, "WM_PROTOCOLS")
Expand Down Expand Up @@ -228,11 +224,8 @@ func (x *x11WM) handleKeyRelease(ev xproto.KeyReleaseEvent) {
}

func (x *x11WM) handleMouseEnter(ev xproto.EnterNotifyEvent) {
err := xproto.ChangeWindowAttributesChecked(x.x.Conn(), ev.Event, xproto.CwCursor,
[]uint32{uint32(x11.DefaultCursor)}).Check()
if err != nil {
fyne.LogError("Set Cursor Error", err)
}
xproto.ChangeWindowAttributes(x.x.Conn(), ev.Event, xproto.CwCursor,
[]uint32{uint32(x11.DefaultCursor)})
if mouseNotify, ok := fynedesk.Instance().(notify.MouseNotify); ok {
mouseNotify.MouseOutNotify()
}
Expand Down

0 comments on commit c7629f1

Please sign in to comment.