Computer >> 컴퓨터 >  >> 시스템 >> Linux

dwm 사용 경험을 한 단계 끌어올려 줄 5가지 유용한 패치

dwm 사용 경험을 한 단계 끌어올려 줄 5가지 유용한 패치

dwm은 미니멀리즘 소프트웨어의 훌륭한 예입니다. 단 2,000줄 남짓한 코드만으로 빠르고 가벼운 윈도우 매니저를 구현해냈습니다. 하지만 이러한 검소한 개발 철학에는 대가가 따랐습니다. 프로그램 크기를 최소화하기 위해 일부 기능이 과감히 생략된 것입니다.

그럼에도 불구하고 dwm은 소스 코드 기반으로 배포되기 때문에, 소스 코드에 패치를 적용하는 방식으로 새로운 기능을 추가할 수 있습니다. 사실 기본적인 설정조차 config.h 파일을 수정해야 하는데, 이 파일 자체가 dwm 소스 코드의 일부입니다.

dwm 사용 경험을 한 단계 끌어올려 줄 5가지 유용한 패치

처음에는 복잡해 보일 수 있지만, 패칭 과정의 몇 가지 핵심 원리만 이해하면 dwm 패치는 생각보다 간단합니다. 이 글에서는 직접 dwm 설치 환경에 패치를 성공적으로 적용하기 위해 알아야 할 기본 지식을 다루고, 실제로 활용 가치가 높은 5가지 패치를 소개합니다.

패치란 무엇인가?

패치는 더 큰 코드베이스에 삽입할 수 있는 작은 코드 조각입니다. 규모가 큰 소프트웨어 프로젝트에서 여러 개발자가 협업할 때, 서로의 변경 사항을 빠르게 파악하고 공유할 수 있다는 점에서 매우 유용합니다.

dwm 사용 경험을 한 단계 끌어올려 줄 5가지 유용한 패치

패치의 규모는 다양합니다. 버그 하나를 고치는 한 줄짜리 수정일 수도 있고, 새로운 기능 전체를 추가하는 여러 파일에 걸친 대규모 변경일 수도 있습니다.

dwm 소스 코드에 패치 적용하는 방법

소스 코드에 패치를 적용하는 방법은 여러 가지가 있으며, 가장 널리 쓰이는 방식은 git 명령어를 활용하는 것입니다. git 저장소에 패치를 적용하려면 다음 명령어를 입력합니다.

git apply -3 path/to/the/patch.diff
  • apply 함수는 패치 파일의 내용을 지정된 소스 파일에 삽입하려고 시도합니다.
  • -3 옵션은 충돌이 발생했을 때 자동으로 병합을 시도하고, 사용자가 직접 오류를 수정할 수 있도록 도와줍니다.
dwm 사용 경험을 한 단계 끌어올려 줄 5가지 유용한 패치

반면, 버전 관리 시스템 없이 소스 코드를 편집하는 경우라면 GNU patch 프로그램을 사용할 수 있습니다.

patch -p1 < path/to/the/patch.diff
  • -p1 옵션은 패치 파일 내 경로 정보를 올바르게 해석하도록 patch 프로그램에 지시하는 역할을 합니다.

다만 dwm에 패치를 적용할 때는 이러한 도구들이 실패하는 경우가 종종 있습니다. 패칭 도구는 기본 dwm 설치 상태와 유사한 소스 코드를 가정하고 동작하기 때문입니다.

즉, 패치를 많이 적용할수록 패칭 프로그램이 새 패치를 삽입하기가 점점 어려워집니다. 그렇기 때문에 패치 파일의 구조와 작동 방식을 이해해 두면, 도구가 실패하더라도 수동으로 패치를 적용할 수 있습니다.

패치 파일 읽는 법

패치 파일은 크게 세 가지 요소로 구성됩니다.

  • 코드를 삽입할 대상 파일을 나타내는 헤더
  • 삽입 위치가 될 줄 번호나 함수를 나타내는 서브헤더
  • 실제 코드 내용

앞서 언급했듯이 하나의 패치 파일에는 여러 파일에 들어갈 여러 코드 조각이 담길 수 있습니다. 이 덕분에 소스 파일마다 개별 패치 파일을 만들 필요 없이, 단일 파일로 배포할 수 있습니다.

dwm 사용 경험을 한 단계 끌어올려 줄 5가지 유용한 패치

결국 패치 파일을 읽는 것은 헤더 문법만 이해하면 됩니다. 헤더 구조를 파악하고 나면 실제 패칭은 단순히 코드를 복사해서 붙여넣는 작업에 가깝습니다.

패치 헤더 문법

패치의 헤더에는 소스 파일의 위치에 관한 핵심 정보가 담겨 있습니다. 예를 들어 다음은 dwm autoresize 패치의 헤더입니다.

diff --git a/dwm.c b/dwm.c
index 0362114..e4e8514 100644
--- a/dwm.c
+++ b/dwm.c

첫 번째, 세 번째, 네 번째 줄은 dwm.c 파일의 두 버전 간 차이(diff)임을 나타냅니다. 즉, 수정 대상 파일이 "dwm.c"라는 것을 알려주는 것입니다.

하지만 어떤 파일을 수정해야 하는지만으로는 부족합니다. 파일 내에서 정확히 어느 위치에 코드를 삽입해야 하는지도 알아야 합니다. 이때 패치 파일의 서브헤더가 유용합니다.

예를 들어, 앞서 언급한 autoresize 패치의 일부는 다음과 같습니다.

@@ -92,7 +92,7 @@ struct Client {
 	int basew, baseh, incw, inch, maxw, maxh, minw, minh;
 	int bw, oldbw;
 	unsigned int tags;
-	int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen;
+	int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen, needresize;
 	Client *next;
 	Client *snext;
 	Monitor *mon;

다소 복잡해 보이지만, 여기서 확인해야 할 것은 딱 세 가지입니다.

  • 첫 번째 줄은 코드 조각을 삽입해야 할 줄 번호를 나타냅니다. 이 예제에서는 92번째 줄에 해당합니다.
  • 첫 줄의 두 번째 인자인 struct Client {는 수정해야 할 특정 함수(구조체)를 알려줍니다. 소스 파일에 이미 많은 패치가 적용되어 왼쪽의 줄 번호가 실제와 맞지 않을 때 특히 유용합니다.
  • 마지막으로 코드 블록 안의 +- 기호를 살펴야 합니다. 마이너스(-) 기호는 삭제할 줄, 플러스(+) 기호는 추가할 줄을 의미합니다.

이 정도면 소스 파일 패칭의 기본 원리는 충분히 이해했습니다. 이제 dwm에 적용하면 좋은 5가지 유용한 패치를 살펴보겠습니다.

1. Systray (시스템 트레이)

대부분의 데스크톱 환경과 달리, dwm은 기본적으로 시스템 트레이를 제공하지 않습니다. 시스템 트레이는 백그라운드에서 실행 중인 프로그램과 빠르게 상호작용할 수 있도록 애플리케이션이 아이콘을 띄워두는 화면 영역입니다.

dwm 사용 경험을 한 단계 끌어올려 줄 5가지 유용한 패치

이 패치는 해당 기능을 dwm에 추가합니다. 설치하면 systray 패치가 dwm 바의 가장 오른쪽 영역을 시스템 트레이 프로그램들에게 할당합니다. 멀티 모니터 환경도 지원하며, 이 경우 트레이는 항상 마우스 포인터가 있는 모니터에 표시됩니다.

dwm 사용 경험을 한 단계 끌어올려 줄 5가지 유용한 패치

2. Xresources

Xresources 패치를 적용하면 xrdb 프로그램을 통해 dwm의 그래픽 설정을 지정할 수 있습니다. .Xresources 파일을 사용해 색상과 폰트를 프로그램 재컴파일 없이 변경할 수 있게 되는 것입니다. 이미 터미널 색상 테마를 .Xresources 파일로 관리하고 있는 사용자에게 특히 유용합니다.

dwm 사용 경험을 한 단계 끌어올려 줄 5가지 유용한 패치

또한 xrdb가 dwm의 외관을 결정하게 되면 여러 테마를 손쉽게 전환할 수도 있습니다. 원하는 색상 스킴에 맞게 .Xresources 파일을 수정한 뒤 dwm을 리로드하여 적용하면 됩니다.

3. Tatami (타타미)

Tatami는 dwm의 대체 창 배치(layout)입니다. 화면의 창들을 전통적인 일본식 다다미 바닥처럼 배열한다고 하여 이런 이름이 붙었습니다. 기존의 master-stack 레이아웃에서는 마스터 창을 제외한 나머지 창들이 세로로 점점 좁아져 스택 아래쪽 창들은 사실상 읽기 어렵게 되는데, 타타미 레이아웃은 이러한 문제를 다른 방식으로 해결합니다.

dwm 사용 경험을 한 단계 끌어올려 줄 5가지 유용한 패치

타타미 레이아웃은 4~5개의 창을 동시에 다룰 때 특히 유용합니다. 각 창에 충분한 화면 공간을 배분해 주기 때문에 사용자가 내용을 쾌적하게 읽을 수 있습니다.

4. Focus Master

dwm이 창을 배치하는 방식은 블록을 쌓아 올리는 것과 비슷합니다. 새로 생성된 창이 이전 창 위에 놓이며, 이를 통해 창들 사이에 선형적인 순서가 생기고 어떤 창이 먼저 만들어졌는지 알 수 있습니다.

dwm 사용 경험을 한 단계 끌어올려 줄 5가지 유용한 패치

하지만 이 설계에는 한 가지 제약이 있습니다. 스택 중간에서 마스터 창을 자유롭게 선택할 수 없다는 점입니다. 마스터를 선택하려면 가장 위 블록에 도달할 때까지 창을 하나씩 순회해야 합니다. 이 패치는 이러한 동작을 바꿔, 스택의 어느 위치에서든 현재 마스터 창을 바로 선택할 수 있게 해줍니다.

여러 개의 창을 동시에 다룰 때 특히 유용합니다. 창을 하나씩 돌아가며 선택하는 대신, 창 스택의 마스터를 즉시 선택할 수 있기 때문입니다.

5. dwmc

dwm의 어떤 설정이든 변경하려면 기본적으로 프로그램을 다시 컴파일해야 합니다. 색상 스킴이나 기본 동작 등이 모두 여기에 해당합니다.

dwm 사용 경험을 한 단계 끌어올려 줄 5가지 유용한 패치

dwmc는 클라이언트 프로그램을 통해 dwm의 동작을 변경할 수 있게 해주는 간단한 패치입니다. bspwm이 bspc를 사용해 설정을 조정하는 방식과 유사한 접근입니다. dwmc는 bspc보다는 훨씬 단순하지만, 그래도 활용할 만한 유용한 설정 옵션들을 제공합니다.

예를 들어 dwmc에서 사용할 수 있는 기능 중 하나가 togglebar입니다. dwmc togglebar 명령을 실행하면 dwm 바를 동적으로 켜고 끌 수 있습니다. 이 덕분에 dwmc는 사용자 지정 창 동작을 수행하는 스크립트를 작성할 때도 유용하게 쓰입니다.

축하합니다! 이제 코드 패칭의 기본 원리를 이해했고, dwm 설치 환경에 바로 적용할 수 있는 5가지 유용한 패치도 알게 되었습니다. 브라우저에서도 비슷한 미니멀한 경험을 찾고 있다면 관련 튜토리얼을 확인해 보세요.

자주 묻는 질문

1. dwm 패치는 안전하게 사용할 수 있나요?

네! suckless 웹사이트에 게시된 패치들은 여러 유지보수자들이 검수합니다. 덕분에 사이트에 올라온 모든 패치는 해당 대상 dwm 버전에서 정상적으로 작동함이 보장됩니다.

2. git apply를 사용했는데 패치가 실패하고 dwm이 컴파일되지 않습니다. 어떻게 해야 하나요?

여러 가지 원인이 있을 수 있지만, 가장 흔한 이유는 소스 파일에 git 헤더가 그대로 남아 있는 경우입니다. 이 문제는 비교적 쉽게 해결할 수 있습니다. 헤더를 제거하고 패치를 직접 수동으로 적용하면 됩니다.

소스 파일을 열면 HEAD라는 라벨이 붙은 줄이 보일 것입니다. 이것이 수정 시작 지점을 나타내며, 그 뒤에 수정이 필요한 함수가 이어집니다. 해당 줄을 제거한 후 수동으로 패칭을 진행하세요. 이때에도 코드 왼쪽의 +- 기호가 무엇을 변경해야 하는지 안내해 줍니다.

3. 패치 적용에는 성공했는데, dwm이 컴파일되지 않으면서 누락된 변수나 선언을 요청합니다. 어떻게 해야 하나요?

패칭 프로그램이 config.h 파일에는 패치를 적용하지 못한 것입니다. 기본적으로 패치는 현재 설정과의 충돌을 피하기 위해 config.def.h 파일을 수정합니다.

하지만 그렇게 되면 config.h 파일에는 해당 패치에 필요한 설정 값이 반영되지 않습니다. 이를 해결하려면 config.def.h 파일에 적용된 변경 사항을 직접 config.h 파일에도 반영해 주어야 합니다.