aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sx-interaction.el6
-rw-r--r--sx-question-print.el4
-rw-r--r--sx.el24
3 files changed, 18 insertions, 16 deletions
diff --git a/sx-interaction.el b/sx-interaction.el
index 92b062b..b6113a2 100644
--- a/sx-interaction.el
+++ b/sx-interaction.el
@@ -31,11 +31,11 @@
;;; Using data in buffer
(defun sx--data-here ()
"Get the text property `sx--data-here'."
- (or (get-text-property (point) 'sx--data-here)
+ (or (get-pos-property (point) 'sx--data-here)
(and (derived-mode-p 'sx-question-list-mode)
(tabulated-list-get-id))
- (or (derived-mode-p 'sx-question-mode)
- sx-question-mode--data)))
+ (and (derived-mode-p 'sx-question-mode)
+ sx-question-mode--data)))
(defun sx--maybe-update-display ()
"Refresh the question list if we're inside it."
diff --git a/sx-question-print.el b/sx-question-print.el
index f49346b..45124c4 100644
--- a/sx-question-print.el
+++ b/sx-question-print.el
@@ -185,7 +185,7 @@ QUESTION must be a data structure returned by `json-read'."
DATA can represent a question or an answer."
;; This makes `data' accessible through `sx--data-here'.
(sx-assoc-let data
- (sx--wrap-in-text-property
+ (sx--wrap-in-overlay
(list 'sx--data-here data)
(insert sx-question-mode-header-title)
(insert-text-button
@@ -270,7 +270,7 @@ DATA can represent a question or an answer."
"Print the comment described by alist COMMENT-DATA.
The comment is indented, filled, and then printed according to
`sx-question-mode-comments-format'."
- (sx--wrap-in-text-property
+ (sx--wrap-in-overlay
(list 'sx--data-here comment-data)
(sx-assoc-let comment-data
(insert
diff --git a/sx.el b/sx.el
index fc58b02..f1d3634 100644
--- a/sx.el
+++ b/sx.el
@@ -215,6 +215,11 @@ Anything before the (sub)domain is removed."
"Overlays created by sx on this buffer.")
(make-variable-buffer-local 'sx--overlays)
+(defvar sx--overlay-printing-depth 0
+ "Track how many overlays we're printing on top of each other.
+Used for assigning higher priority to inner overlays.")
+(make-variable-buffer-local 'sx--overlay-printing-depth)
+
(defmacro sx--wrap-in-overlay (properties &rest body)
"Start a scope with overlay PROPERTIES and execute BODY.
Overlay is pushed on the buffer-local variable `sx--overlays' and
@@ -224,24 +229,21 @@ Return the result of BODY."
(declare (indent 1)
(debug t))
`(let ((p (point-marker))
- (result (progn ,@body)))
+ (result (progn ,@body))
+ ;; The first overlay is the shallowest. Any overlays created
+ ;; while the first one is still being created go deeper and
+ ;; deeper.
+ (sx--overlay-printing-depth (1+ sx--overlay-printing-depth)))
(let ((ov (make-overlay p (point)))
(props ,properties))
(while props
(overlay-put ov (pop props) (pop props)))
+ ;; Let's multiply by 10 just in case we ever want to put
+ ;; something in the middle.
+ (overlay-put ov 'priority (* 10 sx--overlay-printing-depth))
(push ov sx--overlays))
result))
-(defmacro sx--wrap-in-text-property (properties &rest body)
- "Start a scope with PROPERTIES and execute BODY.
-Return the result of BODY."
- (declare (indent 1)
- (debug t))
- `(let ((p (point-marker))
- (result (progn ,@body)))
- (add-text-properties p (point) ,properties)
- result))
-
(defun sx--user-@name (user)
"Get the `display_name' of USER prepended with @.
In order to correctly @mention the user, all whitespace is