다음 이전 차례

19. GTK의 rc 파일

GTK는 rc 파일을 이용해서 어플의 디폴트 환경을 다룬다. 이들은 앞서 설명한 어떤 widget의 색깔은 물론 배경에 넣을 pixmap을 설정할 수도 있다.

19.1 rc 파일을 위한 함수

어플을 시작하는 부분에서 이 함수를 포함시키자.

void gtk_rc_parse (char *filename);

인자는 우리 rc 파일의 이름이다. 이것은 GTK가 이 파일을 읽어서 widget들의 스타일을 그곳에 정의된 대로 세팅하도록 한다.

만약 widget들 중에 다른 것들과 구별되어야 할 특별한 스타일을 가져야 할 것이 있다면, 또는 다른 목적으로 widget들을 논리적으로 분류하려면, 이 함수를 이용한다.

void gtk_widget_set_name (GtkWidget *widget,
                                                gchar *name);

첫번째 인자로 새로 만든 widget을 주고, 두번째 인자는 그것에 부여하고자 하는 이름이다. 이것은 이 widget의 속성을 rc 파일에 있는 이름을 통하여 바꿀 수 있게 한다.

이런 식으로 함수를 호출했다고 생각해 보자.

button = gtk_button_new_with_label ("Special Button");
gtk_widget_set_name (button, "special button");

그럼 이 버튼은 "special button"으로 이름붙고 rc 파일에서 "special button. GtkButton"이라는 이름으로 될 것이다. (확인해 보자!)

아래의 rc 파일 예제는 main 윈도의 속성을 세팅하고, 그 main 윈도의 child 들은 "main button"의 스타일을 상속받게 된다. 이 어플에서 쓰인 코드는 이렇게 된다.

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_name (window, "main window");

그리고 rc 파일에서 정의되는 스타일은 이렇게 된다.

widget "main window.*GtkButton*" style "main_button"

"main window"에 있는 모든 GtkButton widget을 rc 파일에서 정의한 "main_buttons"의 스타일대로 세팅한다.

보다시피, 이것은 상당히 강력하고 유연한 시스템이다. 이것으로 최고의 효과를 얻기 위해 각자 상상력을 동원해 보기 바란다.

19.2 GTK rc 파일의 포맷

GTK rc 파일의 포맷은 뒤따르는 예제에서 보여지고 있다. 이것은 GTK 배포본에 함께 있는 testgtkrc 파일이고, 내가 약간의 주석 같은 것을 더했다. 누구든지 이것을 어플에 포함시켜서 사용자들이 이용하게 할 수 있을 것이다.

Widget의 속성을 변화시킬 때 몇가지 직관적인 것들이 있다.

이것들에 덧붙여, widget들에 가해질 수 있는 몇가지 state가 있고, 우리는 다른 색깔, 픽스맵, 그리고 폰트를 각 상태에 세팅해 줄 수 있다. 이 state들은 다음과 같다.

Widget의 색깔을 변화시키는 키워드인 "fg"와 "bg"를 사용할 때의 포맷은 이렇다.

fg[<STATE>] = { Red, Green, Blue }

여기서 STATE는 위의 표현들(PRELIGHT, ACTIVE 등) 중 하나고, Red, Green, Blue는 0부터 1까지의 부동소수점 수다. 이들은 반드시 부동소수로 표현되어야 하며, 그렇지 않으면 0으로 인식될 것이다. "1"은 동작하지 않는다, 꼭 "1.0" 으로 해야 한다. 단순히 "0"이라고 하는 것은 인식되지 않는 값이 0이므로 무방할 것이다.

bg_pixmap은 위의 경우와 매우 비슷하다, color가 filename으로 대치될 뿐.

pixmap_path는 ":"으로 구분된 경로의 리스트다. 이 경로는 우리가 설정한 대로 어떤 픽스맵이라도 찾을 것이다.

font도 직관적으로 이렇게만 하면 된다.

font = "<font name>"

딱 하나 어려운 게 있다면 폰트 이름의 문자열을 다루는 것이다. xfontsel 이나 유사한 유틸리티들이 도움이 될 것이다.

"widget_class"는 widget들의 클래스 스타일을 세팅한다. 이 클래스들은 widget의 개요 부분에서 보인 클래스 계층구조에 나와 있다.

"widget"은 직관적으로, 이름 붙여진 widget의 집합을 주어진 스타일대로 설정하며, 주어진 widget 클래스에 대해 어떤 스타일이라도 오버로드한다. 이런 widget들은 gtk_widget_set_name() 함수에 의해 어플 내부에 등록되어 있다. 이것은 widget 클래스 전체적으로가 아니라 어떤 widget을 basis로 하고 있는 어느 한 widget의 특성을 설정해 줄 수 있도록 한다. 사용자들이 나름대로 설정 해서 이용할 있도록, 이런 특별한 widget이라면 뭐든지 문서화해 둘 것을 적극 권하는 바이다.

키워드 "parent"가 속성 설정에 쓰이면, 그 widget은 parent의 속성을 따르게 된다.

스타일을 정의하면서, 이전에 정의된 스타일을 새로운 것에 대입해 주는 것도 가능하다.

style "main_button" = "button"
{
        font = "-adobe-helvetica-medium-r-normal--*-100-*-*-*-*-*-*"
        bg[PRELIGHT] = { 0.75, 0, 0 }
}

이 예제는 "button"의 스타일을 취해서, 단지 이것에서 font와 prelight background color를 바꾸는 것으로 새로운 "main_button" 스타일을 만들어낸다.

물론, 이런 속성 중 많은 것들은 모든 widget에 대해 적용가능한 것이 아니다. 이것은 상식적이고 간단한 것이다. 적용가능한 것이 있다면 적용하면 된다.

19.3 rc 파일의 예제

# pixmap_path "<dir 1>:<dir 2>:<dir 3>:..."
#
pixmap_path "/usr/include/X11R6/pixmaps:/home/imain/pixmaps"
#
# style <name> [= <name>]
# {
#   <option>
# }
#
# widget <widget_set> style <style_name>
# widget_class <widget_class_set> style <style_name>

# 이것은 가능한 state들의 리스트다.  이들 중 일부는 특정한 widget들에
# 대해서는 적용되지 않음을 주의하라.
#
# NORMAL - The normal state of a widget, without the mouse over top of
# it, and not being pressed etc.
#
# PRELIGHT - When the mouse is over top of the widget, colors defined
# using this state will be in effect.
#
# ACTIVE - When the widget is pressed or clicked it will be active, and
# the attributes assigned by this tag will be in effect.
#
# INSENSITIVE - When a widget is set insensitive, and cannot be
# activated, it will take these attributes.
#
# SELECTED - When an object is selected, it takes these attributes.
#
# Given these states, we can set the attributes of the widgets in each of
# these states using the following directives.
#
# fg - Sets the foreground color of a widget.
# fg - Sets the background color of a widget.
# bg_pixmap - Sets the background of a widget to a tiled pixmap.
# font - Sets the font to be used with the given widget.
#

# 여기서 "button"이라 불리우는 스타일을 세팅한다.  파일의 마지막 부분에서
# 실제의 widget에 지정되고 있으므로 여기서의 이름은 중요하지 않다.

style "window"
{
        # 이것은 주어진 픽스맵으로 윈도의 패딩을 세팅한다.
        #bg_pixmap[<STATE>] = "<pixmap filename>"
        bg_pixmap[NORMAL] = "warning.xpm"
}

style "scale"
{
        # "NORMAL" state에서 foreground(font) 색깔을 red로 세팅한다.

        fg[NORMAL] = { 1.0, 0, 0 }

        # 이 widget의 background pixmap을 parent의 그것으로 세팅한다.
        bg_pixmap[NORMAL] = "<parent>"
}

style "button"
{
        # 여기서 어떤 버튼에 대하여 가능한 모든 state를 보여준다.  딱 하나
        # 적용되지 않는 것은 SELECTED state다.

        fg[PRELIGHT] = { 0, 1.0, 1.0 }
        bg[PRELIGHT] = { 0, 0, 1.0 }
        bg[ACTIVE] = { 1.0, 0, 0 }
        fg[ACTIVE] = { 0, 1.0, 0 }
        bg[NORMAL] = { 1.0, 1.0, 0 }
        fg[NORMAL] = { .99, 0, .99 }
        bg[INSENSITIVE] = { 1.0, 1.0, 1.0 }
        fg[INSENSITIVE] = { 1.0, 0, 1.0 }
}

# 이 예제에서, 우리는 "button" 스타일의 속성을 상속받는다.  그리고 
# 새로 "main_button" 스타일을 만들게 될때면 font와 background 색깔은
# 따로 지정해서 쓴다.

style "main_button" = "button"
{
        font = "-adobe-helvetica-medium-r-normal--*-100-*-*-*-*-*-*"
        bg[PRELIGHT] = { 0.75, 0, 0 }
}

style "toggle_button" = "button"
{
        fg[NORMAL] = { 1.0, 0, 0 }
        fg[ACTIVE] = { 1.0, 0, 0 }

        # toggle_button의 background pixmap을 그것의 parent widget(어플에서
        # 정의된대로)의 속성으로 세팅한다.
        bg_pixmap[NORMAL] = "<parent>"
}

style "text"
{
        bg_pixmap[NORMAL] = "marble.xpm"
        fg[NORMAL] = { 1.0, 1.0, 1.0 }
}

style "ruler"
{
        font = "-adobe-helvetica-medium-r-normal--*-80-*-*-*-*-*-*"
}

# pixmap_path "~/.pixmaps"

# 이들은 widget의 타입들을 위에서 정의된 스타일에 따르게 한다.
# Widget 타입들은 클래스 계층구조에 리스트되어 있지만, 이 문서에 리스트된
# 것들도 사용자들에게 좋은 참고가 될 수 있다.

widget_class "GtkWindow" style "window"
widget_class "GtkDialog" style "window"
widget_class "GtkFileSelection" style "window"
widget_class "*Gtk*Scale" style "scale"
widget_class "*GtkCheckButton*" style "toggle_button"
widget_class "*GtkRadioButton*" style "toggle_button"
widget_class "*GtkButton*" style "button"
widget_class "*Ruler" style "ruler"
widget_class "*GtkText" style "text"

# 이것은 모든 버튼들("main window"의 children들)을 main_button의 스타일
# 대로 세팅한다.
widget "main window.*GtkButton*" style "main_button"


다음 이전 차례