Skip to content

Commit

Permalink
Refactor fullscreen and maximized window logic.
Browse files Browse the repository at this point in the history
The new foreign interface architecture handles the state of the relevant window
slots (such as fullscreen-p) instead of doing that on the renderer packages.
This replaces the need for the :skip-renderer-resize keyword.

Fixed bug in toggle-message-buffer, where the height of the buffer was being
probed incorrectly.

Refactor how the window-state-event in handled in GTK.

Simplify implementation of toggle-fullscreen, toggle-maximize,
toggle-status-buffer and toggle-message-buffer.

In terms of the UI:

- a fullscreen invoked by the user or by the window manager expands the UI
fully (keeping the status and message buffers);

- a fullscreen requested by the renderer (e.g. fullscreen video stream) hide the
status and message buffers.
  • Loading branch information
aadcg committed Jul 23, 2024
1 parent 102f4db commit b0dca8e
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 71 deletions.
41 changes: 32 additions & 9 deletions source/foreign-interface.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,38 @@ If the `:setter-p' option is non-nil, then a dummy setf method is defined."
(define-ffi-generic ffi-window-delete (window)
(:documentation "Delete WINDOW."))

(define-ffi-generic ffi-window-fullscreen (window)
(:documentation "Set fullscreen WINDOW state on."))
(define-ffi-generic ffi-window-unfullscreen (window)
(:documentation "Set fullscreen WINDOW state off."))

(define-ffi-generic ffi-window-maximize (window)
(:documentation "Set WINDOW to a maximized state."))
(define-ffi-generic ffi-window-unmaximize (window)
(:documentation "Set WINDOW to an unmaximized state."))
(define-ffi-generic ffi-window-fullscreen (window &key &allow-other-keys)
(:method :around ((window window) &key user-event-p &allow-other-keys)
(setf (slot-value window 'fullscreen-p) t)
(if user-event-p
(call-next-method)
;; Hide the status and message buffers only in this case as to account
;; for full screening a video stream.
(toggle-toolbars window)))
(:documentation "Set fullscreen WINDOW state on.
USER-EVENT-P helps to distinguish events requested by the user or
renderer (e.g. fullscreen a video stream)."))
(define-ffi-generic ffi-window-unfullscreen (window &key &allow-other-keys)
(:method :around ((window window) &key user-event-p &allow-other-keys)
(setf (slot-value window 'fullscreen-p) nil)
(if user-event-p
(call-next-method)
(toggle-toolbars window)))
(:documentation "Set fullscreen WINDOW state off.
See `ffi-window-fullscreen'."))

(define-ffi-generic ffi-window-maximize (window &key &allow-other-keys)
(:method :around ((window window) &key user-event-p &allow-other-keys)
(setf (slot-value window 'maximized-p) t)
(when user-event-p (call-next-method)))
(:documentation "Set WINDOW to a maximized state.
USER-EVENT-P helps to distinguish events requested by the user or renderer."))
(define-ffi-generic ffi-window-unmaximize (window &key &allow-other-keys)
(:method :around ((window window) &key user-event-p &allow-other-keys)
(setf (slot-value window 'maximized-p) nil)
(when user-event-p (call-next-method)))
(:documentation "Set WINDOW to an unmaximized state.
See `ffi-window-maximize'."))

(define-ffi-generic ffi-buffer-url (buffer)
(:documentation "Return the URL associated with BUFFER as a `quri:uri'.
Expand Down
24 changes: 10 additions & 14 deletions source/renderer/gtk.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -500,12 +500,10 @@ response. The BODY is wrapped with `with-protect'."
(on-signal-destroy window))
(connect-signal window "window-state-event" nil (widget event)
(declare (ignore widget))
(setf (nyxt::fullscreen-p window)
(find :fullscreen
(gdk:gdk-event-window-state-new-window-state event)))
(setf (nyxt::maximized-p window)
(find :maximized
(gdk:gdk-event-window-state-new-window-state event)))
(dolist (state (gdk:gdk-event-window-state-new-window-state event))
(case state
(:fullscreen t) ; No-op for now.
(:maximized (ffi-window-maximize window :user-event-p nil))))
nil))

(unless nyxt::*headless-p*
Expand All @@ -523,16 +521,16 @@ response. The BODY is wrapped with `with-protect'."
(define-ffi-method ffi-window-delete ((window gtk-window))
(gtk:gtk-widget-destroy (gtk-object window)))

(define-ffi-method ffi-window-fullscreen ((window gtk-window))
(define-ffi-method ffi-window-fullscreen ((window gtk-window) &key &allow-other-keys)
(gtk:gtk-window-fullscreen (gtk-object window)))

(define-ffi-method ffi-window-unfullscreen ((window gtk-window))
(define-ffi-method ffi-window-unfullscreen ((window gtk-window) &key &allow-other-keys)
(gtk:gtk-window-unfullscreen (gtk-object window)))

(define-ffi-method ffi-window-maximize ((window gtk-window))
(define-ffi-method ffi-window-maximize ((window gtk-window) &key &allow-other-keys)
(gtk:gtk-window-maximize (gtk-object window)))

(define-ffi-method ffi-window-unmaximize ((window gtk-window))
(define-ffi-method ffi-window-unmaximize ((window gtk-window) &key &allow-other-keys)
(gtk:gtk-window-unmaximize (gtk-object window)))

(defun derive-key-string (keyval character)
Expand Down Expand Up @@ -1610,13 +1608,11 @@ the `active-buffer'."
nil)
(connect-signal buffer "enter-fullscreen" nil (web-view)
(declare (ignore web-view))
(setf (nyxt::fullscreen-p (current-window)) t)
(toggle-fullscreen :skip-renderer-resize t)
(ffi-window-fullscreen (current-window) :user-event-p nil)
nil)
(connect-signal buffer "leave-fullscreen" nil (web-view)
(declare (ignore web-view))
(setf (nyxt::fullscreen-p (current-window)) nil)
(toggle-fullscreen :skip-renderer-resize t)
(ffi-window-unfullscreen (current-window) :user-event-p nil)
nil)
buffer)

Expand Down
74 changes: 26 additions & 48 deletions source/window.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -178,24 +178,18 @@ not try to quit the browser."
(window-set-buffer window buffer)
(values window buffer)))

(define-command toggle-fullscreen (&key (window (current-window))
skip-renderer-resize)
"Fullscreen WINDOW, or the current window, when omitted.
When `skip-renderer-resize' is non-nil, don't ask the renderer to fullscreen the window."
(let ((fullscreen (fullscreen-p window)))
(unless skip-renderer-resize
(if fullscreen
(ffi-window-unfullscreen window)
(ffi-window-fullscreen window)))
(toggle-status-buffer :show-p (not fullscreen))
(toggle-message-buffer :show-p (not fullscreen))))

(define-command toggle-maximize (&key (window (current-window)))
"Maximize WINDOW, or the current window, when omitted."
(let ((maximized (maximized-p window)))
(if maximized
(ffi-window-unmaximize window)
(ffi-window-maximize window))))
;; can't hide message buffer otherwise info is lost. see how other browsers do it.
(define-command toggle-fullscreen (&optional (window (current-window)))
"Toggle fullscreen state of window."
(if (fullscreen-p window)
(ffi-window-unfullscreen window)
(ffi-window-fullscreen window)))

(define-command toggle-maximize (&optional (window (current-window)))
"Toggle maximized state of window."
(if (maximized-p window)
(ffi-window-unmaximize window)
(ffi-window-maximize window)))

(defun enable-status-buffer (&optional (window (current-window)))
(setf (ffi-height (status-buffer window)) (height (status-buffer window))))
Expand All @@ -211,33 +205,17 @@ When `skip-renderer-resize' is non-nil, don't ask the renderer to fullscreen the

(define-command toggle-toolbars (&optional (window (current-window)))
"Toggle the visibility of the message and status buffers."
(toggle-status-buffer :window window)
(toggle-message-buffer :window window))

(define-command toggle-status-buffer (&key (window (current-window))
(show-p nil show-provided-p))
"Toggle the visibility of the status buffer.
If SHOW-P is provided:
- If SHOW-P is T, then `status-buffer' is always enabled;
- Otherwise, it is always disabled."
(cond ((and show-provided-p show-p)
(enable-status-buffer window))
((and (not show-provided-p)
(zerop (ffi-height (status-buffer window))))
(enable-status-buffer window))
(t (disable-status-buffer window))))

(define-command toggle-message-buffer (&key (window (current-window))
(show-p nil show-provided-p))
"Toggle the visibility of the message buffer.
If SHOW-P is provided:
- If SHOW-P is T, then `message-buffer' is always enabled;
- Otherwise, it is always disabled."
(cond ((and show-provided-p show-p)
(enable-message-buffer window))
((and (not show-provided-p)
(zerop (height (message-buffer window))))
(enable-message-buffer window))
(t (disable-message-buffer window))))
(toggle-status-buffer window)
(toggle-message-buffer window))

(define-command toggle-status-buffer (&optional (window (current-window)))
"Toggle the visibility of the status buffer."
(if (zerop (ffi-height (status-buffer window)))
(enable-status-buffer window)
(disable-status-buffer window)))

(define-command toggle-message-buffer (&optional (window (current-window)))
"Toggle the visibility of the message buffer."
(if (zerop (ffi-height (message-buffer window)))
(enable-message-buffer window)
(disable-message-buffer window)))

0 comments on commit b0dca8e

Please sign in to comment.