다모앙 커뮤니티 운영 규칙을 확인하세요.
X

심플 미니멀 XMonad 스크린샷

페이지 정보

작성자 JUQ123
작성일 2025.03.19 23:59
257 조회
4 추천

본문

돌고 돌아. 역시 컴퓨터의 주용도는 음악 감상이네요.


- 심플하고 미니멀한 XMonad 초기화면입니다.


1.  $ startx 이후 초기 자동 화면

  1번 워크스페이스 : btop

  5번 워크스페이스 : nsxiv(mpd | mopidy | spotify 의 cover art), tmux(ncmpcpp + cava)



   1-1. xmonad 워크스페이스 화면 분할

https://xmonad.github.io/xmonad-docs/xmonad-contrib/XMonad-Layout-LayoutScreens.html

:: file name :: ~/.xmonad/xmonad.hs

import XMonad.Layout.LayoutScreens

import XMonad.Layout.TwoPane


----------------------------------------------------------------------------}}}

-- Key Binding {{{

-------------------------------------------------------------------------------

-- FOR MULTIMEDIA KEYS RUN:

-- xev | grep -A2 --line-buffered '^KeyRelease' | sed -n '/keycode /s/^.*keycode ([0-9]*).* (.*, (.*)).*$/1 2/p'

-- Then look in /usr/include/X11/XF86keysym.h and look for the name and code.

--

-- Graphics.X11 keysym definitions:https://wiki.haskell.org/Xmonad/Key_codes

-- /usr/include/X11/keysymdef.h


-- Define keys to add

keysToAdd x =

    [

     -- Fixed Singgle Layout expand & divide 2 pane

    (((modMask x .|. controlMask .|. shiftMask), xK_x), layoutScreens 1 (fixedLayout [Rectangle 0 0 3840 1080]))

    , (((modMask x .|. controlMask .|. shiftMask), xK_d), layoutSplitScreen 2 (TwoPane 0.5 0.5 )) -- divide single screen to 2 screen

    , (((modMask x .|. controlMask .|. shiftMask), xK_f), layoutSplitScreen 2 (TwoPane 0.25 0.75)) -- divide single screen to 2 screen

    , (((modMask x .|. controlMask .|. shiftMask), xK_r), layoutScreens 2 (TwoPane 0.25 0.75))


    -- Return Default Layout

    , (((modMask x .|. controlMask .|. shiftMask), xK_space), rescreen)

    ]


-- Compose all my new key combinations.

myKeys x = M.union (strippedKeys x) (M.fromList (keysToAdd x ))


-- startup program

myStartupHook :: X()

myStartupHook = do

    layoutSplitScreen 2 (TwoPane 0.25 0.75) -- divide single screen to 2 screen



    1-2. 유직 전용 5번 워크스페이스에 music을 실행시키고  자동 이동

:: file name :: ~/.xmonad/xmonad.hs

import XMonad.ManageHook --https://hackage.haskell.org/package/xmonad-0.15/docs/XMonad-ManageHook.html


----------------------------------------------------------------------------}}}

​-- Window rules: Manage Hook {{{

-------------------------------------------------------------------------------

-- Execute arbitrary actions and WindowSet manipulations when managing

-- a new window. You can use this to, for example, always float a

-- particular program, or have a client always appear on a particular

-- workspace.

--

-- To find the property name associated with a program, use

-- > xprop | grep WM_CLASS

-- and click on the client you're interested in.

--

-- To match on the WM_NAME, you can use 'title' in the same way that

-- 'className' and 'resource' are used below.

--

-- The class name of an application corresponds to the first

-- value of WM_CLASS (“Pidgin”).

-- The resource corresponds to the second value of WM_CLASS (also “Pidgin”).

-- The title corresponds to WM_NAME (“Buddy List”).


-- Define the workspace on application has to go to

myManageHook :: ManageHook

myManageHook = (composeAll . concat $

[

    ---------------------------------------------------------------------------------

    --- !.local/bin/music

    ---------------------------------------------------------------------------------

    , [ resource =? "nsxiv-mpd" <||> className =? "music-tmux" --> doF (W.shift (myWorkspaces !! 4)) ]

    , [ resource =? "nsxiv-mpd" <||> className =? "music-tmux" --> doF (W.view (myWorkspaces !! 4)) ]

])    <+> manageHook def


-- startup program

myStartupHook :: X()

myStartupHook = do

    spwan "urxvt -e btop"

    nextScreen

    spwan "~/.local/bin/music"


----------------------------------------------------------------------------}}}

-- Now run xmonad with all the defaults we set up. {{{

-------------------------------------------------------------------------------

--

-- Run xmonad with the settings you specify. No need to modify this.

--

--main = xmonad defaults


defaults = def {

    -- Simple stuff

         -- terminal = myTerminal

         --, focusFollowsMouse = myFocusFollowsMouse

         --, clickJustFocuses = myClickJustFocuses

         --, borderWidth = myBorderWidth

         --, modMask = myModMask

         --, workspaces = myWorkspaces

         --, normalBorderColor = myNormalBorderColor

        --, focusedBorderColor = myFocusedBorderColor

    -- key bindings

        , keys = myKeys <+> customKeys (const []) inskeys

        --, mouseBindings = myMouse

    -- hooks, layouts

        --, layoutHook = myLayouts

        , manageHook = myManageHook

        --, handleEventHook = myEventHook

}


1-1  과 1-2 를 합치면 위 스크린샷 결과가 됩니다.


::file name:: ~/.local/bin/music

#!/bin/bash


session="Music"

cover="/home/nietz/Music/cover_ori.png"


#mpv --profile=tv --x11-name=livetv --keepaspect --playlist-start=15 ~/TVChannels/my_tvheadend.m3u & >/dev/null 2>&1


if ! pidof mpd >/dev/null; then mpd; fi

[[ ! -f $cover ]] && ffmpeg -f lavfi -i color=c=red:s=320x240:d=10 -vf "drawtext=fontsize=30:box=1:boxborderw=5:boxcolor=white@0.25:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2:text='Clien Linuxer'" $cover;


tmux -2 has-session -t $session

if [ $? -eq 0 ]; then

    tmux -2 attach -t $session

    /usr/bin/kitty --class=music-tmux --hold sh -c "tmux attach-session -t Music" & >/dev/null 2>&1

    /usr/bin/nsxiv -b -N nsxiv-mpd $cover & >/dev/null 2>&1

    exit 0

fi


tmux new-session -d -s $session

tmux set-option status off


tmux send-keys -t "$session:1" '/usr/bin/ncmpcpp' C-m

tmux split-window -t "$session:1" -v -p 30 -d '/usr/bin/cava'


tmux new-window -t "$session:2"

tmux send-keys -t "$session:2" '~/.local/bin/notification music 2>/dev/null' C-m


tmux select-window -t "$session:1"

#tmux attach-session -t $session


/usr/bin/kitty --class=music-tmux --hold sh -c "tmux attach-session -t Music" & >/dev/null 2>&1

/usr/bin/nsxiv -b -N nsxiv-mpd $cover & >/dev/null 2>&1




:: file name ::  ~/.local/bin/notification

#!/bin/bash


MUSIC_DIR="$HOME/Music/"

ICON="$MUSIC_DIR/cover.png"

ICON2="$MUSIC_DIR/cover_ori.png"


spotify_app="ncspot" # spotify, ncspot

#spotify_app="spotify" # spotify, ncspot

#spotify_app="chromium.instance3290" # spotify, ncspot

spotify_cover="$HOME/Music/cover_spotify.jpg"


# mpd or mopidy

function music

{

    while true; do

    mpc idleloop |

    while read update; do

        if [ $update == "player" ]; then

            ffmpeg -i "$MUSIC_DIR/`mpc current -f '%file%'`" -vf scale=100:-1

-codec png -y $ICON >/dev/null 2>&1;

             ffmpeg -i "$MUSIC_DIR/`mpc current -f '%file%'`" -vf scale=480:-1

-codec png -y $ICON2 >/dev/null 2>&1;


            # Get fields from mpc, split by tabs.

            IFS=$'t' read album artist title

               <<< "$(mpc --format="%album%t%artist%t%title%")"


            notify-send --urgency=normal --expire-time=5000 --app-name=mpd

                    --icon=$ICON " $title" " by $artist"

        elif [ $update == "mixer" ]; then

            # Get volume

            vol=`mpc | tail -n1 | awk '{print $2}'`

            notify-send --urgency=low --expire-time=1000 --app-name=mpd

                       --icon=$ICON " Volume: $vol" "Mixer Changed"

        fi

        done

done

}


# spotify

function music_spotify

{

    if pidof ${spotify_app} >/dev/null; then

        old_cover=$(playerctl -p ${spotify_app} metadata mpris:artUrl)

        wget ${old_cover} -O ${spotify_cover} & >/dev/null 2>&1;

        while true; do

                new_cover=$(playerctl -p ${spotify_app} metadata mpris:artUrl)

                if [[ ${old_cover} != ${new_cover} ]]; then

                   wget ${new_cover} -O ${spotify_cover} & >/dev/null 2>&1;

               fi

               old_cover=${new_cover}

        done

    else

        :

        #ffmpeg -f lavfi -i color=c=red:s=320x240:d=10 -vf "drawtext=fontsize=30:box=1:boxborderw=5:boxcolor=white@0.25:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2:text='Clien Linuxer'" -frames:v 1 -y ${spotify_cover};

    fi

}


case $1 in

    music) music ;;

    music_s) music_spotify ;;

    *) exit 1 ;;

esac



tmux  music 스크립트 하나 만들고,  msuic cover art 데몬 스크립트 하나 만들어서, 위 xmonad.hs 파일에 적절한 룰을 설정하면, 로그인시 자동 화면 구성 완료.

스크린샷 자체는 깔끔한데요. 스크립트 2개 만들고, 전체 xmonad 설정과 키바인딩 설정은 방대 합니다. 기타 스크핍트들과 유기적으로 연결하여야 하구요.

그래도 이게 젤 편한거 같아요. 10년 전에도 이 구성,  현재도 이 구성.. arch 리눅스 한번 깔면 10년은 거뜬히 가는 것 같습니다.




2.  선호 하는 XMonad 의 레이아웃 중 하나

  - 듀얼 Pane(= Dual Workspace) 에 "ResizableThreeCol" Layout 에 magnifiercz 1.5(=활성화된 윈도우 창이 1.5배 확대됩니다) 적용

   요즈음은 유투부도 핸드폰으로 보고, 드라마/영화 같은 것도 넷플릭스나 다른 OTT로 보고,, 그것 감상할 때 말고는 토랭이 사용할 일이 거의 없는 것 같아요.


-- Mirror transformation:

, ("M-C-S-m" , sendMessage $ XMonad.Layout.MultiToggle.Toggle MIRROR ) -- bottom xmobar toggle struct. then properly works.

  그리고 위 단축키 하나 지정해서 사용하면,  아래 화면의 1번 워크스페이스의 활성화된 윈도우 창 4개가 간단하게 가로 세로 모드로 단축키 누를때 마다 양방 변환 되구요



defaultLayouts = avoidStruts ( Circle ||| gaptiled ||| resize_threecol ||| resize_threecolmid )

    where

        -- default tiling algorithm partitions the screen into two panes

        --tiled = gaps [(U,5), (D,5), (R,5), (L,5)] $ spacing 2 $ Tall nmaster delta ratio -- gap all direction 5

        tiled = spacing 0 $ ResizableTall nmaster delta ratio []​

        --tiled = Tall nmaster delta ratio

        gaptiled = gaps [(U,4), (D,4), (L,4), (R,4)] $ spacing 8 $ ResizableTall nmaster delta ratio []

        -- The default number of windows in the master pane

        resize_threecol = gaps [(U,4), (D,4), (L,4), (R,4)] $ spacing 8 $ magnifiercz' 1.5 $ ResizableThreeCol 1 (3/100) (1/2) []

        resize_threecolmid = gaps [(U,4), (D,4), (L,4), (R,4)] $ spacing 8 $ magnifiercz' 1.5 $ ResizableThreeColMid 1 (3/100) (1/2) []

        nmaster = 1

        -- Default proportion of screen occupied by master pane

        ratio = 3/5

        -- Percent of screen to increment by when resizing panes

        delta = 3/100




3.  $ startx 이후 초기 자동 화면 : 우측 최하단의  ncspot(=spotify 프리미엄 계정일 때) 앱을 music tmux 에 추가하고 spotify cover art 데몬 스크립트도 추가한 화면,   nsxiv의 covar art 는 spotify cover 또는 mpd cover


돌고 돌아 역시 데스크탑 컴퓨터의 용도는 음악 감상이네요.

추후,  10년 후에도 위 XMonad 화면이 제 로그인 화면이 될 것 같아요.

-- 컴퓨타 커면 노래 틀고, 30초 후 모니터 절전화면 모드 --


예전에는 다른  WM이 궁금하거, 필요한 용도가 있을시. 메인 tty1 은 xmonad 로 x를 띠운 상태고, "ctrl + alt + f2" 를 눌러 tty2 에서 로그인해서, openbox나 kde wm 을 띠우곤 했는데. 요즈음은 F1 X에도 xmonad,   F2번 X에도 xmonad 를 띠우네요.


tty 2번 X 에는 edge 웹브라우저를 하나를 전체 화면으로  띠워놓고, 유투브 탭은 하나 띠워 놓고요.

"아들아 컴퓨타로 유투브를 보고 싶으면   "Ctrl + Alt + F2" 를 눌르거라 "


그러합니다. XMonad 는 키보드 단축키와 rofi 단축키와 터미널 단축키 등을 모르면 평범한 데스크탑 사용자는  아무것도 할 수 없습니다. 미니멀 그 자체 입니다.


4. 빅뉴스 입니다.  (여자)아이돌 걸그룹  리눅스 "스웨이"  쓰는 덕후랍니다.



긴 글 읽어 주셔서 감사합니다. 즐거운 한 주 되세요

4추천인 목록보기
댓글 9

신사아님당님의 댓글

작성자 신사아님당
작성일 03.20 03:46
와~ 오랜만에 뵙습니다. 이렇게 또 xmonad 이야기를 올려주셔서 감사합니다.
xmonad는 문법이 일단 어려워 보이고 또 wayland 지원도 요원해 보이기도 하고... 그래서 지금 들어가기는 좀 그렇다며 포기했는데, JUQ123님께서 올려주시는 글, 스샷을 보면 또 마음이 들썩이곤 합니당. ㅎㅎㅎ 

+
가족에게 PC가 노출될 때 wm이 갖는 보안상의 장점이 있군요. 참고하겠습니다. (응?)

++
ctrl + alt + f1을 누르니 GDM 로그인 화면이 뜨고 f2를 누르니 원래 사용중인 그놈화면이 떠서, ctrl + alt + f3을 누르고 로그인 해서 hyprland를 실행했더니, 오! 되네요!
X를 두 개 띄우는건 생각도 못해봤는데;; 그동안은 wm 찍먹 할 때마다 그놈에서 로그아웃하고 찍먹용 계정으로 로그인 하는 식으로 했거든요.  신세경입니다. ㅠㅠ* 

JUQ123님의 댓글의 댓글

대댓글 작성자 JUQ123
작성일 03.20 13:49
@신사아님당님에게 답글 XMonad 웨이랜드 포팅은 요원해 보입니다. 그 수많은 XMonad 모듈들과 스크래치들이 다 X에 최적화 되어 코드가 짜여잇다던데 “사용자야 좋갯지만 개발자 입장에서는 지님들이 상당히 힘들다” 고 하네요

마우스가 없고 무각 키보드에 리모컨 하나 보안상 완벽합니다. 음핳핫

신세경은 이쁜 한국 배우 맞슴까 ???

신사아님당님의 댓글의 댓글

대댓글 작성자 신사아님당
작성일 03.21 02:53
@JUQ123님에게 답글 아.. 원래 배우 이름이죠?    언젠가부턴가 신세경이라고 하면 신세계의 경치/경관이 눈앞에 펼쳐지는 느낌(!)이 제일 먼저 떠오르더라구요. ㅎㅎㅎ

마우스도 키보드의 각인도 없어야 한다니... 보안의 길은 멀고도 험하군요.

가끔씩 xmonad.org의 news/blog 에 들어가 보곤 합니다. 혹시 웨일랜드 관련 소식 있을까 하고요.. 

+
xrandr로 모니터를 가상으로 나눌 필요도 없이 별도의 워크스페이스로 나눠버리다니... ㄷㄷㄷ xmonad의 layout 기능은 정말 부럽습니다.

JUQ123님의 댓글의 댓글

대댓글 작성자 JUQ123
작성일 03.21 05:07
@신사아님당님에게 답글 저도 신박한거 발견하면 '오호 심봤다. 신세경이닷" 이라고 합니다.
가상 스크린은 와이드 화면 쓰시는 분들에게 유용하죠. 스크린 무한 분할... 와이드 스크린이면 3개 정도로 분활 하면 딱일 것 같아요(외관은 보통의 three_colom layout 와 분할하지만, 독립된 워크스페이스라는)
제가 주목했던 XMonad의 장점은. 1. 키보드 Based  ,  2. Layout Based 왼도우 매니져.  온갖 레이아웃 다 있어요. 서브 레이아웃 모듈 써서 한 워크스페이스에서 다중 레이아웃 설정도 할 수 있구요.

저 신사아님당님 의 경험처럼. 새벽에 아치 업데이트 작살났었는데. 드뎌 업데이트 다 했어요. 재부팅하니 잘 되네요.

fastfetch 처음으로 설치하고, 한장 찍었어요. 듀얼모니터에 3x 워크스페이스(1번, 5번, tv),  4개까진 확장해서 써봤는데, . 그 이상은 역시 와이드 모니터나 인치수 큰 모니터가 필요합니다. ㅠ.ㅠ, 한때는 27인치 모니터 3대를 세로로 놓고 반대로 X시네라마로 모니터 물리스크린 3개를 하나의 스크린으로 병합해서  kodi 앱으로 영화 본다고 사용한적도 있는데, 다중 모니터는 전기세가 역시 무섭습니다.

- 저처럼 fastfetch 을 이번에 처음 접하는 유저분들을 위한. fastfetch 설치/사용법
* 설치 : $ sudo pacman -S fastfetch
* config 파일 복사 : $ cp -a /usr/share/fastfetch/presets/examples ~/.config/fastfetch
* 이미지 로고는 kitty 터미널에서 잘 뜨네요 (--logo-height 는 안적어도 될것 같아요. 정확한 수치 기재 안하니, ratio 깨지는 경우가 많아서, 아래 옵션으로,  흠 옵션값들 참으로 방대하네요. 먼 말인지(???) )
  $ clear && fastfetch --logo /tmp/SSIS-888-poster-korean.jpg --logo-type auto --logo-width 88 --logo-preserve-aspect-ratio -c ~/.config/fastfetch/25.jsonc
    2번부터 25번 설정파일 전부 찍어봤는데 저는 25번 설정파일이 가장 맘에 드네요.

케이블 TV의 종편 방송은 대역폭 8Mbps 조금 넘네요.

신사아님당님의 댓글의 댓글

대댓글 작성자 신사아님당
작성일 어제 02:13
@JUQ123님에게 답글 아~ 알죠~ 알고계실거라는걸 모른척 한겁니다~ 하하하하하

아치 업데이트 icu 관련 댓글 작성하신거 봤습니다. 
8년된 pacman.conf 라니요,  저는 종가집 씨간장을 떠올렸답니다.

fastfetch 보기 설정이  /usr/share/fastfetch에 있었군요. 이런건 어떻게 하는건가 궁금했었습니다.
저도 따라해 봤는데 foot터미널에서는 정말 사진이 안뜨더군요. kitty에서는 잘 표시되네요.

저도 예전엔 모니터 3대 썼었는데, 지금은 한 대만 쓰고있습니다. 전기요금... 무섭습니다.

Realtime님의 댓글

작성자 Realtime
작성일 03.20 13:11
(스크롤 드륵드륵드륵 음 건전하군 드륵드륵드륵 멈칫...! 아 가수구나 가수 맞지 드륵드륵드륵)

저는 미디어는 그냥 크롬이나 데스크탑앱 쓰는게 편하더라구요.
코딩이나 파일 관리 정도만 터미널로...

JUQ123님의 댓글의 댓글

대댓글 작성자 JUQ123
작성일 03.20 14:02
@Realtime님에게 답글 1. 첫전째 한국 가수 아아유 - 국내 최정상급 탑티어 가수

3. 세번째 한국 가수 소향 - 세계 최정상급 넘버 원 가수

2. 두뻔째 일본 가수 카와키타 사이카 - 일본 최정상급 가수(???) 노래 실력은 과연 ?
- 카와키타 사이카 •즛토 이쇼니(언제나 함께)•

2-2. 일본 최정상급 여배우 연기실력은 과연?
- “카오키타 사이카의 출장 앤티알” (직장인의 출장지에서의 “애환” 을 “깊게” 다룬 영화, ¥ 흠 과음이 이렇게 위헙합니다 아 맥주 먹고 싶어요 ¥)

저는 미디어는 mpv 하나로 거진 퉁치는 것 같아요.  웹브라우저에서 mpv확장 익스텐션으로 브라우저의 영상을 mpv로 토스하면 하드웨어 가속 잘되서 좋고 각종 옵션 설정할 수 잇어서 유용하엿어요
세로 영상 보기애도 편햇구요

그러합니다. 오늘은 정말 건전하엿습니다

hooxoo님의 댓글

작성자 no_profile hooxoo
작성일 03.20 14:54
엄두도 안나는 xmonad랑 haskell.. 대단하십니다!

JUQ123님의 댓글의 댓글

대댓글 작성자 JUQ123
작성일 03.20 18:04
@hooxoo님에게 답글 사실 haskell 언어는 모릅니다.
다만 “내 용도에 부합하는 나만의 커스텀 wm”이라는 목표 방향이 잇엇던지라, 방대한 xmonad 관련 문서는 다 읽엇던 기억이 납니다.

각종 앱의 세팅/테마 파일들과 잡다한 스크립트 들 - 파일 100개 이상에, 라인수 5만 라인 가량(??), 사용하는 단축키 1,000여개, - 키보드로 90% 가량 다 되긴 하는데, 컴터 한동안 안 쓰다 다시 쓰려하면, 자주 사용하는 필수 단축키 제외라면, 설정햇던 앱들의 대다수 단축키가 기억이 안 나는 난감함이 발생하네요. 음 ㅠㅠ

진정 커스텀 세팅 노가다 작업. 지금 다시 하라면 못할것 가타요. 한번 딥세팅하고 사골처럼 오래오래 우려먹자. 10년동안 세팅햇고 20년은 족히 그대로 사용할 듯 합니다
홈으로 전체메뉴 마이메뉴 새글/새댓글
전체 검색