折腾了很久的Hyprland/Wayland

陆陆续续,折腾了半个月。被其丝滑动画所吸引,抛弃了使用多年的x11,投向了wayland怀抱 :smile:

不过动画虽丝滑,问题也贼多。比如原生wayland,chromium 输入法不能用,不能vaapi硬解。还有很多软件没有原生wayland,只能在xwayland中运行,然后就各种奇奇怪怪的bug。

折腾效果图:

桌面: Hyprland
status bar: waybar
终端: Alacritty / foot
字体: Rec Mono Casual
gtk主题: Gruvbox

2 个赞

我也刚刚入坑 Hyprland。最初只是想了解、尝试一下。但现在经过简单配置,Hyprland 已经取代了我之前一直使用的 dwm 了。
在 Arch 中,从安装到配置使用,都非常舒适、顺滑。
在 Fedora 中,虽然按照 wiki 介绍的,安装了必要组件、编译,但没有成功!
目前,个人很喜欢使用 Hyprland!

1 个赞

火狐的响应速度肉眼地提高了。

x11再也回不去了。

我也用 Hyprland,不仅是高分屏,还是 N 卡,有各种问题。

这个Hyprland比起Sway有什么优势?

已使用hyprland大半年了。

比起sway,多了一些动画,窗口圆角,gaps等。

2 个赞

waybar设置挺好看的。

比起sway更大的优势是开发特别活跃,sway到现在还没有合并input popup导致输入法在一些地方没有候选框(貌似是因为当前pr里的实现还存在问题)

的确!而且特别喜欢 Hyprland 设置配置时,实时生效。透明、模糊效果也不会拖慢系统流畅度!











1 个赞

分享下配置,最近也在折腾linux,学习一下。

配置文件东拼西凑,挺挫的,在某里云盘上,https://espeon.eu.org

加入参数—enable-wayland-ime以在启用wayland的chromium内核的产品中使用输入法

1 个赞

我的老旧ati显卡最高只支持opengl2,导致我只能使用legacyranderer的版本并忍受一大堆渲染问题和鼠标指针的卡顿

我希望有人可以告诉我要怎么给ati x1300装上opengl3

最近在 aur 的 chromium-wayland-vaapi 看到了--enable-wayland-ime 选项的评论,但是在chrome的release版本和Arch自己的chromium中没有看到这个实验性选项,以为只有该patch的aur包里增添了该选项,但是由于编译这个包在我的机器上需要4个小时,遂没有理会。 但是刚刚我在命令行中尝试强制指定该选项启动chrome居然成功了,感谢楼主提醒。

同时这个评论也给没有尝试的朋友们做个实验佐证 (即使这个选项在117版本的chrome和chromium中没有explicit的指明)。

分享一个脚本,hypr-other-window, 是对 hyprctl --batch "dispatch cyclenext; dispatch bringactivetotop" 的简单包装 通常我绑定为cmd+ctrl+o(space被我映射为cmd+ctrl,所以= space+o), 功能相当于 emacs 的 C-x o 即焦点在各个窗口间切换。 但是 如果 我在同一个workspace 开了一个多 窗口 emacs ,还有一个firefox ,我也希望 当按下 cmd+ctrl+o 时,即可以在emacs 内部的多个window 间切换,也可以装焦点转移到emacs 外的firefox 则可以使用以下脚本 和 elisp 配合后实现

#!/usr/bin/env bash
# ws=$(hyprctl activeworkspace -j)
# ws_id=`echo $ws|jq -r '.id'`
# app count in current workspace
# app_cnt=$(hyprctl clients -j | jq -cr '.[] | select(.workspace.id == '$ws_id')'|wc -l)

appinfo=`hyprctl activewindow -j`

# if front app exits
if [ -n "$appinfo" ]; then
    class=`echo $appinfo|jq -r '.class'|head -n 1`
    # fullscreen=`echo $appinfo|jq -r '.fullscreen'|head -n 1`
     # ( "$app_cnt" = "1" || "$fullscreen" = "true" )
    if [[ "$class" = "emacs" ]]; then
        echo key ctrl+super+o|dotoolc
    else
        hyprctl --batch "dispatch cyclenext; dispatch bringactivetotop"
    fi
else
    hyprctl --batch "dispatch cyclenext; dispatch bringactivetotop"
fi
(global-set-key (kbd "C-s-o") 'vmacs-other-window)
(defvar vmacs-window-status nil)
(defun vmacs-focus()
  (if (frame-focus-state)
      (unless (and vmacs-window-status
                   (window-live-p vmacs-window-status))
        (setq vmacs-window-status (selected-window)))
    ;; (setq vmacs-window-status (selected-window))
    (setq vmacs-window-status nil)))
(add-function :after after-focus-change-function #'vmacs-focus)

(defun vmacs-other-window()
  (interactive)
  (select-window (next-window))
  (when (eq (selected-window) vmacs-window-status)
    (call-process "hyprctl" nil nil nil "--batch"
                  "dispatch cyclenext; dispatch bringactivetotop"))
  (unless (and vmacs-window-status
               (window-live-p vmacs-window-status))
    (setq vmacs-window-status (selected-window))))

用到了 dotool: Command to simulate input anywhere (X11, Wayland, TTYs) 来实现 模拟发送快捷键 echo key ctrl+super+o|dotoolc 是模拟按下 ctrl+cmd+o

1 个赞

再分享一个https://github.com/jixiuf/dotfiles/blob/main/linux/bin/hypr-fullscreen ,功能类似于 上面的 hrpr-other-window, 它是对 hyprctl dispatch fullscreen 1 的封装 实现最大化窗口与正常窗口的一键切换

同样的道理,emacs 内部也是多窗口, 我希望emacs 也可以一键实现窗口的切换

#!/usr/bin/env bash

ws=$(hyprctl activeworkspace -j)
ws_id=`echo $ws|jq -r '.id'`
# app count in current workspace
app_cnt=$(hyprctl clients -j | jq -cr '.[] | select(.workspace.id == '$ws_id')'|wc -l)

appinfo=`hyprctl activewindow -j`

# if front app exits
if [ -n "$appinfo" ]; then
    class=`echo $appinfo|jq -r '.class'|head -n 1`
    # fullscreen=`echo $appinfo|jq -r '.fullscreen'|head -n 1`
    if [[ "$class" = "emacs"  ]]; then
        sleep 0.1
        echo key ctrl+super+m|dotoolc
    else
        hyprctl dispatch fullscreen 1
    fi
else
    hyprctl dispatch fullscreen 1
fi
(global-set-key (kbd "C-s-m") 'vmacs-fullscreen)
(defvar vmacs--fullscreen-window-configuration nil)
(defun vmacs-fullscreen()
  (interactive)
  (if (and (eq this-command 'vmacs-fullscreen)
           (eq last-command 'vmacs-fullscreen)
           (not (string-equal "1" (string-trim (shell-command-to-string "ws_id=$(hyprctl activeworkspace -j|jq -r '.id');hyprctl clients -j | jq -cr '.[] | select(.workspace.id == '$ws_id')'|wc -l")))))
      (progn
        (call-process "hyprctl" nil nil nil "dispatch" "fullscreen" "1")
        (setq this-command 'hypr-fullscreen))
    (if (> (length (window-list)) 1)
        (progn
          (setq vmacs--fullscreen-window-configuration (current-window-configuration))
          (delete-other-windows))
      (when vmacs--fullscreen-window-configuration
        (set-window-configuration vmacs--fullscreen-window-configuration)
        (setq vmacs--fullscreen-window-configuration nil)))))

核心代码 大都在以下文件中,如果有缺漏的可以去那找 https://github.com/jixiuf/vmacs/blob/master/conf/conf-evil-window.el#L32 https://github.com/jixiuf/vmacs/blob/master/lazy/lazy-window.el#L1

hypr-resize 也类似,我使用xremap 配置了以下4个按键调整窗口的大小,同样我也期望相同的按键 当 当前窗口是emacs 时,也可以调整emacs内部的window大小

      # 窗口大小调整 space+ 箭头
      super-C-l: { launch: ["hypr-resize" ,"right"]}
      super-C-h: { launch: ["hypr-resize" ,"left"]}
      super-C-k: { launch: ["hypr-resize" ,"up"]}
      super-C-j: { launch: ["hypr-resize" ,"down"]}
#!/usr/bin/env bash

resize_window() {
    case "$1" in
        left*)
            hyprctl dispatch resizeactive -15 0
            ;;
        right*)
            hyprctl dispatch resizeactive 15 0
            ;;
        up*)
            hyprctl dispatch resizeactive 0 -15
            ;;
        down*)
            hyprctl dispatch resizeactive 0 15
            ;;
    esac
}
# need https://github.com/ramnes/move-border for emacs
resize_emacs_window() {
    case "$1" in
        left*)
            echo key ctrl+super+h|dotoolc
            ;;
        right*)
            echo key ctrl+super+l|dotoolc
            ;;
        up*)
            echo key ctrl+super+k|dotoolc
            ;;
        down*)
            echo key ctrl+super+j|dotoolc
            ;;
    esac
}


ws=$(hyprctl activeworkspace -j)
ws_id=`echo $ws|jq -r '.id'`
# app count in current workspace
app_cnt=$(hyprctl clients -j | jq -cr '.[] | select(.workspace.id == '$ws_id')'|wc -l)

appinfo=`hyprctl activewindow -j`
if [ -n "$appinfo" ]; then
    class=`echo $appinfo|jq -r '.class'|head -n 1`
    fullscreen=`echo $appinfo|jq -r '.fullscreen'|head -n 1`
    if [[ "$class" = "emacs" && ( "$app_cnt" = "1" || "$fullscreen" = "true" ) ]]; then
        resize_emacs_window $1
    else
        resize_window $1
    fi
else
        resize_window $1
fi
(global-set-key (kbd "C-s-k") 'move-border-up)
(global-set-key (kbd "C-s-j") 'move-border-down)
(global-set-key (kbd "C-s-h") 'move-border-left)
(global-set-key (kbd "C-s-l") 'move-border-right)
 ;;用到了 https://github.com/ramnes/move-border