detached 44a6914

refactor(browser): migrate workspace_manager.go to gotk4 API

commit
44a691411ac1ce95715fd2ed1c4bf3047e91c23f
author
bamen · · 2025-10-09 05:26 UTC
parent
143d1f0
signature
unsigned
1 file · +14 -13
M internal/app/browser/workspace_manager.go +14 -13
@@ -12,6 +12,7 @@ import (
1212
1313 "github.com/bnema/dumber/internal/app/messaging"
1414 "github.com/bnema/dumber/pkg/webkit"
15+ "github.com/diamondburned/gotk4/pkg/glib/v2"
1516 )
1617
1718 // WorkspaceManager coordinates Zellij-style pane operations.
@@ -271,8 +272,8 @@ func (wm *WorkspaceManager) OnWorkspaceMessage(source *webkit.WebView, msg messa
271272 if err != nil {
272273 log.Printf("[workspace] split failed: %v", err)
273274 // CRITICAL FIX: Pump GTK events after validation failure to clear pending operations
274- if webkit.IsMainThread() {
275- webkit.IterateMainLoop()
275+ if glib.MainContextDefault().IsOwner() {
276+ glib.MainContextDefault().Iteration(false)
276277 }
277278 return
278279 }
@@ -307,8 +308,8 @@ func (wm *WorkspaceManager) OnWorkspaceMessage(source *webkit.WebView, msg messa
307308 if err != nil {
308309 log.Printf("[workspace] stack failed: %v", err)
309310 // CRITICAL FIX: Pump GTK events after stack failure
310- if webkit.IsMainThread() {
311- webkit.IterateMainLoop()
311+ if glib.MainContextDefault().IsOwner() {
312+ glib.MainContextDefault().Iteration(false)
312313 }
313314 return
314315 }
@@ -459,29 +460,29 @@ func (wm *WorkspaceManager) OnWorkspaceMessage(source *webkit.WebView, msg messa
459460 // The parent pane's rendering can become corrupted after popup closes
460461 if targetNode.parentPane != nil {
461462 parentNode := targetNode.parentPane
462- if parentNode.container != 0 && webkit.WidgetIsValid(parentNode.container) {
463+ if parentNode.container != nil {
463464 log.Printf("[workspace] Fixing parent pane rendering after popup close")
464465
465466 // CRITICAL: Hide parent container to disconnect WebKitGTK rendering pipeline
466- webkit.WidgetHide(parentNode.container)
467+ parentNode.container.Hide()
467468
468469 // Schedule showing and forcing GTK to reconnect rendering
469470 wm.scheduleIdleGuarded(func() bool {
470- if parentNode == nil || !parentNode.widgetValid || parentNode.container == 0 {
471+ if parentNode == nil || !parentNode.widgetValid || parentNode.container == nil {
471472 return false
472473 }
473474 // Show widget to reconnect WebKit rendering pipeline
474- webkit.WidgetShow(parentNode.container)
475+ parentNode.container.Show()
475476 // Force GTK to recalculate size and recreate rendering surface
476- webkit.WidgetQueueResize(parentNode.container)
477- webkit.WidgetQueueDraw(parentNode.container)
477+ parentNode.container.QueueResize()
478+ parentNode.container.QueueDraw()
478479
479480 // Also queue resize+draw on the WebView widget itself
480481 if parentNode.pane != nil && parentNode.pane.WebView() != nil {
481482 webViewWidget := parentNode.pane.WebView().Widget()
482- if webViewWidget != 0 && webkit.WidgetIsValid(webViewWidget) {
483- webkit.WidgetQueueResize(webViewWidget)
484- webkit.WidgetQueueDraw(webViewWidget)
483+ if webViewWidget != nil {
484+ webViewWidget.QueueResize()
485+ webViewWidget.QueueDraw()
485486 log.Printf("[workspace] Queued resize+draw for parent WebView widget")
486487 }
487488 }
@@ -12,6 +12,7 @@ import (
12 12
13 "github.com/bnema/dumber/internal/app/messaging"13 "github.com/bnema/dumber/internal/app/messaging"
14 "github.com/bnema/dumber/pkg/webkit"14 "github.com/bnema/dumber/pkg/webkit"
15+ "github.com/diamondburned/gotk4/pkg/glib/v2"
15 )16 )
16 17
17 // WorkspaceManager coordinates Zellij-style pane operations.18 // WorkspaceManager coordinates Zellij-style pane operations.
@@ -271,8 +272,8 @@ func (wm *WorkspaceManager) OnWorkspaceMessage(source *webkit.WebView, msg messa
271 if err != nil {272 if err != nil {
272 log.Printf("[workspace] split failed: %v", err)273 log.Printf("[workspace] split failed: %v", err)
273 // CRITICAL FIX: Pump GTK events after validation failure to clear pending operations274 // CRITICAL FIX: Pump GTK events after validation failure to clear pending operations
274- if webkit.IsMainThread() {275+ if glib.MainContextDefault().IsOwner() {
275- webkit.IterateMainLoop()276+ glib.MainContextDefault().Iteration(false)
276 }277 }
277 return278 return
278 }279 }
@@ -307,8 +308,8 @@ func (wm *WorkspaceManager) OnWorkspaceMessage(source *webkit.WebView, msg messa
307 if err != nil {308 if err != nil {
308 log.Printf("[workspace] stack failed: %v", err)309 log.Printf("[workspace] stack failed: %v", err)
309 // CRITICAL FIX: Pump GTK events after stack failure310 // CRITICAL FIX: Pump GTK events after stack failure
310- if webkit.IsMainThread() {311+ if glib.MainContextDefault().IsOwner() {
311- webkit.IterateMainLoop()312+ glib.MainContextDefault().Iteration(false)
312 }313 }
313 return314 return
314 }315 }
@@ -459,29 +460,29 @@ func (wm *WorkspaceManager) OnWorkspaceMessage(source *webkit.WebView, msg messa
459 // The parent pane's rendering can become corrupted after popup closes460 // The parent pane's rendering can become corrupted after popup closes
460 if targetNode.parentPane != nil {461 if targetNode.parentPane != nil {
461 parentNode := targetNode.parentPane462 parentNode := targetNode.parentPane
462- if parentNode.container != 0 && webkit.WidgetIsValid(parentNode.container) {463+ if parentNode.container != nil {
463 log.Printf("[workspace] Fixing parent pane rendering after popup close")464 log.Printf("[workspace] Fixing parent pane rendering after popup close")
464 465
465 // CRITICAL: Hide parent container to disconnect WebKitGTK rendering pipeline466 // CRITICAL: Hide parent container to disconnect WebKitGTK rendering pipeline
466- webkit.WidgetHide(parentNode.container)467+ parentNode.container.Hide()
467 468
468 // Schedule showing and forcing GTK to reconnect rendering469 // Schedule showing and forcing GTK to reconnect rendering
469 wm.scheduleIdleGuarded(func() bool {470 wm.scheduleIdleGuarded(func() bool {
470- if parentNode == nil || !parentNode.widgetValid || parentNode.container == 0 {471+ if parentNode == nil || !parentNode.widgetValid || parentNode.container == nil {
471 return false472 return false
472 }473 }
473 // Show widget to reconnect WebKit rendering pipeline474 // Show widget to reconnect WebKit rendering pipeline
474- webkit.WidgetShow(parentNode.container)475+ parentNode.container.Show()
475 // Force GTK to recalculate size and recreate rendering surface476 // Force GTK to recalculate size and recreate rendering surface
476- webkit.WidgetQueueResize(parentNode.container)477+ parentNode.container.QueueResize()
477- webkit.WidgetQueueDraw(parentNode.container)478+ parentNode.container.QueueDraw()
478 479
479 // Also queue resize+draw on the WebView widget itself480 // Also queue resize+draw on the WebView widget itself
480 if parentNode.pane != nil && parentNode.pane.WebView() != nil {481 if parentNode.pane != nil && parentNode.pane.WebView() != nil {
481 webViewWidget := parentNode.pane.WebView().Widget()482 webViewWidget := parentNode.pane.WebView().Widget()
482- if webViewWidget != 0 && webkit.WidgetIsValid(webViewWidget) {483+ if webViewWidget != nil {
483- webkit.WidgetQueueResize(webViewWidget)484+ webViewWidget.QueueResize()
484- webkit.WidgetQueueDraw(webViewWidget)485+ webViewWidget.QueueDraw()
485 log.Printf("[workspace] Queued resize+draw for parent WebView widget")486 log.Printf("[workspace] Queued resize+draw for parent WebView widget")
486 }487 }
487 }488 }

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 8

Tags 42

↑↓ moveenter openesc close