JUQ123 (138.♡.22.136)
2025년 3월 19일 PM 11:59 · 수정됨(03. 22. 02:13)
돌고 돌아. 역시 컴퓨터의 주용도는 음악 감상이네요.
- 심플하고 미니멀한 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. 빅뉴스 입니다. (여자)아이돌 걸그룹 리눅스 "스웨이" 쓰는 덕후랍니다.

긴 글 읽어 주셔서 감사합니다. 즐거운 한 주 되세요
댓글 (9)
-
신신사아님당
25.03.20 · 125.♡.243.26
-
JJUQ123
→ 신사아님당 작성자
25.03.20 · 125.♡.235.177
XMonad 웨이랜드 포팅은 요원해 보입니다. 그 수많은 XMonad 모듈들과 스크래치들이 다 X에 최적화 되어 코드가 짜여잇다던데 “사용자야 좋갯지만 개발자 입장에서는 지님들이 상당히 힘들다” 고 하네요
마우스가 없고 무각 키보드에 리모컨 하나 보안상 완벽합니다. 음핳핫
신세경은 이쁜 한국 배우 맞슴까 ??? -
신신사아님당
→ JUQ123
25.03.21 · 125.♡.243.26
아.. 원래 배우 이름이죠? {emo:onion-013.gif:50} 언젠가부턴가 신세경이라고 하면 신세계의 경치/경관이 눈앞에 펼쳐지는 느낌(!)이 제일 먼저 떠오르더라구요. ㅎㅎㅎ
마우스도 키보드의 각인도 없어야 한다니... 보안의 길은 멀고도 험하군요. {emo:onion-014.gif:50}
가끔씩 xmonad.org의 news/blog 에 들어가 보곤 합니다. 혹시 웨일랜드 관련 소식 있을까 하고요.. {emo:onion-024.gif:50}
+
xrandr로 모니터를 가상으로 나눌 필요도 없이 별도의 워크스페이스로 나눠버리다니... ㄷㄷㄷ xmonad의 layout 기능은 정말 부럽습니다. {emo:damoang-emo-007.gif:50} -
JJUQ123
→ 신사아님당 작성자
25.03.21 · 125.♡.235.177
저도 신박한거 발견하면 '오호 심봤다. 신세경이닷" 이라고 합니다.
가상 스크린은 와이드 화면 쓰시는 분들에게 유용하죠. 스크린 무한 분할... 와이드 스크린이면 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번 설정파일이 가장 맘에 드네요.
[https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5dDEHuyzBdtDbJat6YB0PHvZ_ggysyLr_brfrzNduTpVSBwnH-_jYVZB5-BIeYp8GN4TfSpAE7CxjhNwNbNNE3iO3PR4sbsyIIymI54gSHQ3kPlFI2uY_KliIazlq3CQc30ZmvxI9vJvRj7dfcHj1M9XiNqOMus5N2nEMqLhiWTx2qSvqnO2OwNveA6yd/s16000/2025-03-21-04:36:20_3840x1080_Desktop.png]
케이블 TV의 종편 방송은 대역폭 8Mbps 조금 넘네요. -
신신사아님당
→ JUQ123
25.03.22 · 125.♡.243.26
아~ 알죠~ 알고계실거라는걸 모른척 한겁니다~ 하하하하하 {emo:onion-051.gif:50}
아치 업데이트 icu 관련 댓글 작성하신거 봤습니다.
8년된 pacman.conf 라니요, 저는 종가집 씨간장을 떠올렸답니다. {emo:onion-053.gif:50}
fastfetch 보기 설정이 /usr/share/fastfetch에 있었군요. 이런건 어떻게 하는건가 궁금했었습니다.
저도 따라해 봤는데 foot터미널에서는 정말 사진이 안뜨더군요. kitty에서는 잘 표시되네요. {emo:damoang-emo-018.gif:50}
저도 예전엔 모니터 3대 썼었는데, 지금은 한 대만 쓰고있습니다. 전기요금... 무섭습니다. {emo:onion-010.gif:50} -
RRealtime
25.03.20 · 75.♡.158.112
(스크롤 드륵드륵드륵 음 건전하군 드륵드륵드륵 멈칫...! 아 가수구나 가수 맞지 드륵드륵드륵)
저는 미디어는 그냥 크롬이나 데스크탑앱 쓰는게 편하더라구요.
코딩이나 파일 관리 정도만 터미널로... -
JJUQ123
→ Realtime 작성자
25.03.20 · 125.♡.235.177
1. 첫전째 한국 가수 아아유 - 국내 최정상급 탑티어 가수
3. 세번째 한국 가수 소향 - 세계 최정상급 넘버 원 가수
2. 두뻔째 일본 가수 카와키타 사이카 - 일본 최정상급 가수(???) 노래 실력은 과연 ?
- 카와키타 사이카 •즛토 이쇼니(언제나 함께)•
{video: https://youtu.be/CURQV3UpLD0?si=v6yI7ZgyOEhp2Le8 }
2-2. 일본 최정상급 여배우 연기실력은 과연?
- “카오키타 사이카의 출장 앤티알” (직장인의 출장지에서의 “애환” 을 “깊게” 다룬 영화, ¥ 흠 과음이 이렇게 위헙합니다 아 맥주 먹고 싶어요 ¥)
{video: https://youtu.be/7AuQe0mhXcw?si=RRaw4qje4fS8hHWr }
저는 미디어는 mpv 하나로 거진 퉁치는 것 같아요. 웹브라우저에서 mpv확장 익스텐션으로 브라우저의 영상을 mpv로 토스하면 하드웨어 가속 잘되서 좋고 각종 옵션 설정할 수 잇어서 유용하엿어요
세로 영상 보기애도 편햇구요
그러합니다. 오늘은 정말 건전하엿습니다 -
Hhooxoo
25.03.20 · 58.♡.65.143
엄두도 안나는 xmonad랑 haskell.. 대단하십니다! -
JJUQ123
→ hooxoo 작성자
25.03.20 · 125.♡.235.177
사실 haskell 언어는 모릅니다.
다만 “내 용도에 부합하는 나만의 커스텀 wm”이라는 목표 방향이 잇엇던지라, 방대한 xmonad 관련 문서는 다 읽엇던 기억이 납니다.
각종 앱의 세팅/테마 파일들과 잡다한 스크립트 들 - 파일 100개 이상에, 라인수 5만 라인 가량(??), 사용하는 단축키 1,000여개, - 키보드로 90% 가량 다 되긴 하는데, 컴터 한동안 안 쓰다 다시 쓰려하면, 자주 사용하는 필수 단축키 제외라면, 설정햇던 앱들의 대다수 단축키가 기억이 안 나는 난감함이 발생하네요. 음 ㅠㅠ
진정 커스텀 세팅 노가다 작업. 지금 다시 하라면 못할것 가타요. 한번 딥세팅하고 사골처럼 오래오래 우려먹자. 10년동안 세팅햇고 20년은 족히 그대로 사용할 듯 합니다
댓글을 작성하려면 이 필요합니다.
xmonad는 문법이 일단 어려워 보이고 또 wayland 지원도 요원해 보이기도 하고... 그래서 지금 들어가기는 좀 그렇다며 포기했는데, JUQ123님께서 올려주시는 글, 스샷을 보면 또 마음이 들썩이곤 합니당. ㅎㅎㅎ {emo:onion-002.gif:50}
+
가족에게 PC가 노출될 때 wm이 갖는 보안상의 장점이 있군요. 참고하겠습니다. (응?)
++
ctrl + alt + f1을 누르니 GDM 로그인 화면이 뜨고 f2를 누르니 원래 사용중인 그놈화면이 떠서, ctrl + alt + f3을 누르고 로그인 해서 hyprland를 실행했더니, 오! 되네요!
X를 두 개 띄우는건 생각도 못해봤는데;; 그동안은 wm 찍먹 할 때마다 그놈에서 로그아웃하고 찍먹용 계정으로 로그인 하는 식으로 했거든요. 신세경입니다. ㅠㅠ* {emo:damoang-emo-007.gif:50}