detached 042e3de

fix(workspace): migrate workspace_popup.go to gotk4 API

- Remove unused gtk import
- Remove CreateWindow config field assignments (field doesn't exist)
- Convert WebView IDs to string using IDString() helper (uint64 → string)
  - Fixed popupWebViewID comparisons and append operations
  - Fixed parentWebViewID in localStorage script injection
- Replace widget method calls with webkit helpers:
  - container.SetSizeRequest() → webkit.WidgetSetSizeRequest()
  - container.QueueResize() → webkit.WidgetQueueResize()

Fixed 23 compilation errors in popup window handling.
commit
042e3deaa72371dfcf80dcf6dc2fecfbc988a5ba
author
bamen · · 2025-10-08 20:34 UTC
committer
bamen · · 2025-10-08 18:50 UTC
parent
f6d1269
signature
unsigned
1 file · +8 -14
M internal/app/browser/workspace_popup.go +8 -14
@@ -9,7 +9,6 @@ import (
99
1010 "github.com/bnema/dumber/internal/app/messaging"
1111 "github.com/bnema/dumber/pkg/webkit"
12- "github.com/diamondburned/gotk4/pkg/gtk/v4"
1312 )
1413
1514 const (
@@ -71,7 +70,6 @@ func (wm *WorkspaceManager) HandlePopup(source *webkit.WebView, url string) *web
7170 log.Printf("[workspace] failed to build webkit config: %v - allowing native popup", err)
7271 return nil
7372 }
74- webkitCfg.CreateWindow = false
7573 // Create as related to avoid WindowFeatures crash; we'll decide final placement later
7674 newView, err := webkit.NewWebViewWithRelated(webkitCfg, source)
7775 if err != nil {
@@ -107,7 +105,6 @@ func (wm *WorkspaceManager) HandlePopup(source *webkit.WebView, url string) *web
107105 log.Printf("[workspace] failed to build webkit config: %v - allowing native popup", err)
108106 return nil
109107 }
110- webkitCfg.CreateWindow = false
111108 newView, err := webkit.NewWebViewWithRelated(webkitCfg, source)
112109 if err != nil {
113110 log.Printf("[workspace] failed to create placeholder WebView: %v - allowing native popup", err)
@@ -143,7 +140,7 @@ func (wm *WorkspaceManager) HandlePopup(source *webkit.WebView, url string) *web
143140
144141 // Get the new node and popup WebView ID for tracking
145142 newNode := wm.viewToNode[newView]
146- popupWebViewID := newView.ID()
143+ popupWebViewID := newView.IDString()
147144
148145 // Apply different behavior based on target type
149146 if isBlankTarget {
@@ -345,7 +342,6 @@ func (wm *WorkspaceManager) handleIntentAsTab(sourceNode *paneNode, url string,
345342 log.Printf("[workspace] failed to build webkit config: %v - allowing native popup", err)
346343 return nil
347344 }
348- webkitCfg.CreateWindow = false
349345
350346 newView, err := webkit.NewWebView(webkitCfg)
351347 if err != nil {
@@ -402,7 +398,6 @@ func (wm *WorkspaceManager) handleIntentAsPopup(sourceNode *paneNode, url string
402398 log.Printf("[workspace] failed to build webkit config: %v - allowing native popup", err)
403399 return nil
404400 }
405- webkitCfg.CreateWindow = false
406401
407402 newView, err := webkit.NewWebViewWithRelated(webkitCfg, sourceNode.pane.webView)
408403 if err != nil {
@@ -411,8 +406,8 @@ func (wm *WorkspaceManager) handleIntentAsPopup(sourceNode *paneNode, url string
411406 }
412407
413408 // Log the parent-popup WebView ID relationship for OAuth auto-close
414- parentWebViewID := sourceNode.pane.webView.ID()
415- popupWebViewID := newView.ID()
409+ parentWebViewID := sourceNode.pane.webView.IDString()
410+ popupWebViewID := newView.IDString()
416411 log.Printf("[workspace] Created popup WebView: parentID=%s popupID=%s url=%s", parentWebViewID, popupWebViewID, url)
417412
418413 // Store popup WebView ID in parent's localStorage for OAuth callback lookup
@@ -612,7 +607,7 @@ func (wm *WorkspaceManager) configureRelatedPopup(sourceNode *paneNode, webView
612607 return
613608 }
614609 node := wm.viewToNode[related]
615- popupWebViewID := related.ID()
610+ popupWebViewID := related.IDString()
616611
617612 if node != nil {
618613 node.windowType = webkit.WindowTypePopup
@@ -717,15 +712,15 @@ func (wm *WorkspaceManager) applyPopupSizeConstraints(view *webkit.WebView, widt
717712
718713 // Apply to container
719714 if container := view.RootWidget(); container != nil {
720- container.SetSizeRequest(minWidth, minHeight)
721- container.QueueResize()
715+ webkit.WidgetSetSizeRequest(container, minWidth, minHeight)
716+ webkit.WidgetQueueResize(container)
722717 log.Printf("[workspace] Applied minimum size %dx%d to popup container=%p", minWidth, minHeight, container)
723718 }
724719
725720 // Apply to WebView widget
726721 if webViewWidget := view.Widget(); webViewWidget != nil {
727- webViewWidget.SetSizeRequest(minWidth, minHeight)
728- webViewWidget.QueueResize()
722+ webkit.WidgetSetSizeRequest(webViewWidget, minWidth, minHeight)
723+ webkit.WidgetQueueResize(webViewWidget)
729724 log.Printf("[workspace] Applied minimum size %dx%d to popup webview=%p", minWidth, minHeight, webViewWidget)
730725 }
731726 }
@@ -797,7 +792,6 @@ func (wm *WorkspaceManager) handleDetectedWindowType(sourceNode *paneNode, webVi
797792 log.Printf("[workspace] failed to build webkit config for tab: %v", err)
798793 return
799794 }
800- webkitCfg.CreateWindow = false
801795
802796 // Create independent WebView like handleIntentAsTab does
803797 independentView, err := webkit.NewWebView(webkitCfg)
@@ -9,7 +9,6 @@ import (
9 9
10 "github.com/bnema/dumber/internal/app/messaging"10 "github.com/bnema/dumber/internal/app/messaging"
11 "github.com/bnema/dumber/pkg/webkit"11 "github.com/bnema/dumber/pkg/webkit"
12- "github.com/diamondburned/gotk4/pkg/gtk/v4"
13 )12 )
14 13
15 const (14 const (
@@ -71,7 +70,6 @@ func (wm *WorkspaceManager) HandlePopup(source *webkit.WebView, url string) *web
71 log.Printf("[workspace] failed to build webkit config: %v - allowing native popup", err)70 log.Printf("[workspace] failed to build webkit config: %v - allowing native popup", err)
72 return nil71 return nil
73 }72 }
74- webkitCfg.CreateWindow = false
75 // Create as related to avoid WindowFeatures crash; we'll decide final placement later73 // Create as related to avoid WindowFeatures crash; we'll decide final placement later
76 newView, err := webkit.NewWebViewWithRelated(webkitCfg, source)74 newView, err := webkit.NewWebViewWithRelated(webkitCfg, source)
77 if err != nil {75 if err != nil {
@@ -107,7 +105,6 @@ func (wm *WorkspaceManager) HandlePopup(source *webkit.WebView, url string) *web
107 log.Printf("[workspace] failed to build webkit config: %v - allowing native popup", err)105 log.Printf("[workspace] failed to build webkit config: %v - allowing native popup", err)
108 return nil106 return nil
109 }107 }
110- webkitCfg.CreateWindow = false
111 newView, err := webkit.NewWebViewWithRelated(webkitCfg, source)108 newView, err := webkit.NewWebViewWithRelated(webkitCfg, source)
112 if err != nil {109 if err != nil {
113 log.Printf("[workspace] failed to create placeholder WebView: %v - allowing native popup", err)110 log.Printf("[workspace] failed to create placeholder WebView: %v - allowing native popup", err)
@@ -143,7 +140,7 @@ func (wm *WorkspaceManager) HandlePopup(source *webkit.WebView, url string) *web
143 140
144 // Get the new node and popup WebView ID for tracking141 // Get the new node and popup WebView ID for tracking
145 newNode := wm.viewToNode[newView]142 newNode := wm.viewToNode[newView]
146- popupWebViewID := newView.ID()143+ popupWebViewID := newView.IDString()
147 144
148 // Apply different behavior based on target type145 // Apply different behavior based on target type
149 if isBlankTarget {146 if isBlankTarget {
@@ -345,7 +342,6 @@ func (wm *WorkspaceManager) handleIntentAsTab(sourceNode *paneNode, url string,
345 log.Printf("[workspace] failed to build webkit config: %v - allowing native popup", err)342 log.Printf("[workspace] failed to build webkit config: %v - allowing native popup", err)
346 return nil343 return nil
347 }344 }
348- webkitCfg.CreateWindow = false
349 345
350 newView, err := webkit.NewWebView(webkitCfg)346 newView, err := webkit.NewWebView(webkitCfg)
351 if err != nil {347 if err != nil {
@@ -402,7 +398,6 @@ func (wm *WorkspaceManager) handleIntentAsPopup(sourceNode *paneNode, url string
402 log.Printf("[workspace] failed to build webkit config: %v - allowing native popup", err)398 log.Printf("[workspace] failed to build webkit config: %v - allowing native popup", err)
403 return nil399 return nil
404 }400 }
405- webkitCfg.CreateWindow = false
406 401
407 newView, err := webkit.NewWebViewWithRelated(webkitCfg, sourceNode.pane.webView)402 newView, err := webkit.NewWebViewWithRelated(webkitCfg, sourceNode.pane.webView)
408 if err != nil {403 if err != nil {
@@ -411,8 +406,8 @@ func (wm *WorkspaceManager) handleIntentAsPopup(sourceNode *paneNode, url string
411 }406 }
412 407
413 // Log the parent-popup WebView ID relationship for OAuth auto-close408 // Log the parent-popup WebView ID relationship for OAuth auto-close
414- parentWebViewID := sourceNode.pane.webView.ID()409+ parentWebViewID := sourceNode.pane.webView.IDString()
415- popupWebViewID := newView.ID()410+ popupWebViewID := newView.IDString()
416 log.Printf("[workspace] Created popup WebView: parentID=%s popupID=%s url=%s", parentWebViewID, popupWebViewID, url)411 log.Printf("[workspace] Created popup WebView: parentID=%s popupID=%s url=%s", parentWebViewID, popupWebViewID, url)
417 412
418 // Store popup WebView ID in parent's localStorage for OAuth callback lookup413 // Store popup WebView ID in parent's localStorage for OAuth callback lookup
@@ -612,7 +607,7 @@ func (wm *WorkspaceManager) configureRelatedPopup(sourceNode *paneNode, webView
612 return607 return
613 }608 }
614 node := wm.viewToNode[related]609 node := wm.viewToNode[related]
615- popupWebViewID := related.ID()610+ popupWebViewID := related.IDString()
616 611
617 if node != nil {612 if node != nil {
618 node.windowType = webkit.WindowTypePopup613 node.windowType = webkit.WindowTypePopup
@@ -717,15 +712,15 @@ func (wm *WorkspaceManager) applyPopupSizeConstraints(view *webkit.WebView, widt
717 712
718 // Apply to container713 // Apply to container
719 if container := view.RootWidget(); container != nil {714 if container := view.RootWidget(); container != nil {
720- container.SetSizeRequest(minWidth, minHeight)715+ webkit.WidgetSetSizeRequest(container, minWidth, minHeight)
721- container.QueueResize()716+ webkit.WidgetQueueResize(container)
722 log.Printf("[workspace] Applied minimum size %dx%d to popup container=%p", minWidth, minHeight, container)717 log.Printf("[workspace] Applied minimum size %dx%d to popup container=%p", minWidth, minHeight, container)
723 }718 }
724 719
725 // Apply to WebView widget720 // Apply to WebView widget
726 if webViewWidget := view.Widget(); webViewWidget != nil {721 if webViewWidget := view.Widget(); webViewWidget != nil {
727- webViewWidget.SetSizeRequest(minWidth, minHeight)722+ webkit.WidgetSetSizeRequest(webViewWidget, minWidth, minHeight)
728- webViewWidget.QueueResize()723+ webkit.WidgetQueueResize(webViewWidget)
729 log.Printf("[workspace] Applied minimum size %dx%d to popup webview=%p", minWidth, minHeight, webViewWidget)724 log.Printf("[workspace] Applied minimum size %dx%d to popup webview=%p", minWidth, minHeight, webViewWidget)
730 }725 }
731 }726 }
@@ -797,7 +792,6 @@ func (wm *WorkspaceManager) handleDetectedWindowType(sourceNode *paneNode, webVi
797 log.Printf("[workspace] failed to build webkit config for tab: %v", err)792 log.Printf("[workspace] failed to build webkit config for tab: %v", err)
798 return793 return
799 }794 }
800- webkitCfg.CreateWindow = false
801 795
802 // Create independent WebView like handleIntentAsTab does796 // Create independent WebView like handleIntentAsTab does
803 independentView, err := webkit.NewWebView(webkitCfg)797 independentView, err := webkit.NewWebView(webkitCfg)

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