git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] git-gui: keep showing selection when diff view gets deactivated on Mac

From
Stefan Haller <stefan@haller-berlin.de>
Date
Nov 30, 2020, 20:18 UTC
Message-ID
<20201130201837.19091-2-stefan@haller-berlin.de>
In-Reply-To
<20201130201837.19091-1-stefan@haller-berlin.de>

On Mac, Tk text widgets don't draw the selection when they are inactive and disabled [1]. This causes the diff selection to disappear on Mac when the diff view loses focus.

To work around that, we configure text views to be enabled when they become deactivated. While this feels wrong, there's not problem with it because as soon as the user tries to interact with the view, the first thing that happens is that it gets disabled again.

[1] https://github.com/tcltk/tk/blob/main/generic/tkTextDisp.c#L847
Signed-off-by: Stefan Haller <stefan@haller-berlin.de>
---
 lib/themed.tcl | 36 ++++++++++++++++++++++++++++++++++--
 1 file changed, 34 insertions(+), 2 deletions(-)
diff --git a/lib/themed.tcl b/lib/themed.tcl
index db49085..eeb5bf8 100644
--- a/lib/themed.tcl
+++ b/lib/themed.tcl
@@ -302,6 +302,38 @@ proc tspinbox {w args} {
 	}
 }

+proc focus_text {w} {
+	global text_states
+
+	[winfo parent $w] state focus
+
+	if {[is_MacOSX]} {
+		# Restore the disabled state that we remembered for this widget when it
+		# got deactivated last. If there's no remembered state, then this is the
+		# first time we are being activated right after construction, and
+		# there's no need to change the state.
+		if {[info exists text_states($w)]} {
+			$w configure -state $text_states($w)
+			unset text_states($w)
+		}
+	}
+}
+
+proc unfocus_text {w} {
+	global text_states
+
+	[winfo parent $w] state !focus
+
+	if {[is_MacOSX]} {
+		# On Mac, the selection is not drawn when a text widget is inactive and
+		# disabled. To work around that, set the disabled state back to normal
+		# when deactivating the widget. Remember the disabled state so that we
+		# can restore it when we become active again.
+		set text_states($w) [lindex [$w configure -state] end]
+		$w configure -state normal
+	}
+}
+
 # Create a text widget with any theme specific properties.
 proc ttext {w args} {
 	global use_ttk
@@ -315,8 +347,8 @@ proc ttext {w args} {
 	set w [eval [linsert $args 0 text $w]]
 	if {$use_ttk} {
 		if {[winfo class [winfo parent $w]] eq "EntryFrame"} {
-			bind $w <FocusIn> {[winfo parent %W] state focus}
-			bind $w <FocusOut> {[winfo parent %W] state !focus}
+			bind $w <FocusIn> {focus_text %W}
+			bind $w <FocusOut> {unfocus_text %W}
 		}
 	}
 	return $w
--
2.29.0.21.g59e7d82785.dirty
Previous: Stefan HallerNext: Stefan Haller
Message 21 of 37 in “git-gui: Basic dark mode support”
  1. git-gui: Basic dark mode supportSerg Tereshchenko, Aug 24, 2020
  2. Matthias AßhauerAug 25, 2020
  3. Pratyush YadavSep 22, 2020
  4. git-gui: Basic dark mode supportSerg Tereshchenko, Sep 26, 2020
  5. Pratyush YadavOct 7, 2020
  6. Serg TereshchenkoOct 8, 2020
  7. Pratyush YadavOct 8, 2020
  8. Stefan HallerNov 21, 2020
  9. serg.partizan@gmail.comNov 22, 2020
  10. git-gui: Fix selected text colorsSerg Tereshchenko, Nov 22, 2020
  11. Stefan HallerNov 22, 2020
  12. serg.partizan@gmail.comNov 22, 2020
  13. git-gui: use gray selection background for inactive text widgetsStefan Haller, Nov 23, 2020
  14. serg.partizan@gmail.comNov 23, 2020
  15. Stefan HallerNov 23, 2020
  16. serg.partizan@gmail.comNov 23, 2020
  17. Stefan HallerNov 29, 2020
  18. serg.partizan@gmail.comNov 30, 2020
  19. Pratyush YadavNov 30, 2020
  20. Stefan HallerNov 30, 2020
  21. git-gui: keep showing selection when diff view gets deactivated on MacStefan Haller, Nov 30, 2020
  22. Stefan HallerNov 23, 2020
  23. serg.partizan@gmail.comNov 23, 2020
  24. Stefan HallerNov 24, 2020
  25. git-gui: use gray background for inactive text widgetsStefan Haller, Nov 24, 2020
  26. Pratyush YadavDec 17, 2020
  27. Stefan HallerDec 17, 2020
  28. Pratyush YadavDec 18, 2020
  29. Stefan HallerDec 18, 2020
  30. git-gui: use gray background for inactive text widgetsStefan Haller, Dec 18, 2020
  31. Pratyush YadavDec 18, 2020
  32. Pratyush YadavDec 18, 2020
  33. Pratyush YadavDec 17, 2020
  34. Pratyush YadavOct 7, 2020
  35. Serg TereshchenkoOct 8, 2020
  36. Pratyush YadavOct 8, 2020
  37. Serg TereshchenkoOct 8, 2020

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.