gtk_init 그리고 gtk_main과 gtk_main_quit

1. 초기화

gtk_init함수는 GTK를 이용한 모든 GUI 프로그램은 한번씩 호출해준다.

gtk_init 함수는 main함수가 시작할때 변수선언을 제외한 gtk 관련작업이 이루어지기전에 꼭 한번씩 호출해주어야한다. gtk_init함수를 호출하게되면 GTK에 관련된 초기화를 하여 다른 GTK작업이 진행되게 한다.

2. Main Event Loop

GLib의 Main Event Loop

GLib에 보면 Main Event Loop라는것이 있다. GUI 어플리케이션은 화면에 그려내기만 한다고 끝나는것이 아니다. GUI 어플리케이션은 사용자가 원하기전까지는 종료되지 않은채로 대기하여 지속성을 유지해야하며 사용자의 요구에 반응해야한다. 바로 이러한 부분들을 처리하기 위해 기본적인 부분을 담당한다.

개발자는 gtk_main과 gtk_main_quit만 쓸줄 알아도 프로그램은 만들 수 있겠으나 GTK에서가 아니더라도 재미있는 내용이니 GLib API에서 한번쯤 찾아보도록 하자.

gtk_main 함수를 호출하여 Main Event Loop를 실행한다.

C언어를 이용해 만듬 프로그램들은 main함수를 작성해 두고 프로그램을 실행하면 main함수를 실행하게 된다.

main 함수가 끝난 뒤에는 어떻게 될까? 당연히 프로그램이 끝나버린다. 하지만 GUI 프로그램은 사용자가 원하기전까진 끝나선 안된다.

결국 GTK는 gtk_main 함수를 호출함으로서 위에서 설명한 Main Event Loop를 생성하여 실행한다.

GTK에서 Main Event Loop와 Signal

gtk_main을 호출하여 프로그램이 Main Event Loop로 인해 대기하게 된다고 하였다.

자 그럼 이게 끝? 아니다 대기만 하는걸 프로그램이라고 할 수 있겠는가 -_-;

GTK에서는 Event가 생기면 Widget에 의해 Signal이 발생된다고 이전에 Event와 Signal을 설명하며 언급했었다.

무작정 대기하는것이 아니고 Event로 인해 Signal이 발생하면 잠시 일어나 해당 Signal에 설정된 Callback 함수로 제어권을 넘기고 Loop로 인해 다시 대기상태가 되는것이다.

gtk_main_quit 함수를 호출하여 Main Loop를 종료한다.

gtk_main으로 Main Event Loop를 실행하였으니 당연히 종료시에는 그 Main Event Loop가 끝나게 해야할 것이다. GTK에서는 gtk_main_quit함수를 호출하여 Main Event Loop가 종료되게 한다.

3. GTK GUI 어플리케이션의 기본 구조

int main (int argc, char *argv[])

{

// 초기화

gtk_init (&argc, &argv);

// GTK 관련 작업

...

// Main Loop 실행

gtk_main ();

/* gtk_main_quit로 Main Loop가 종료된후 처리해야할 작업

* 이는 gtk_main_quit를 호출하는 부분에서 함께 작업해 주어도 된다.

*/

...

}

    1. 먼저 gtk_init를 호출하여 초기화를 한다.
    2. 그다음 원하는 GTK관련 작업을 수행한다.
    3. gtk_main함수의 호출로 Main Event Loop를 실행한다.
    4. 이 지점에서 main 함수는 대기하게 되고 gtk_main_quit를 호출했을때 gtk_main으로 실행되었던 Main Event Loop가 중단 되어 그 아래 구문으로 넘어간다.

gtk_init후 프로그램 구동시 기본적으로 화면에 보여져야하는 Widget의 생성과 Signal의 연결을 한후 gtk_main으로 Loop에 진입 그 뒤로는 gtk_main을 정의된 Signal또는 Thread (Timer 포함)등에 의한 작업만 수행된다. gtk_main 아래에 작업한 내역은 gtk_main_quit가 호출되기 전까지는 수행되지 않는다.

참고로 Signal의 연결은 gtk_main이 실행되어 프로그램이 작동되어지고 있는중에도 넣었다 뺐다 할 수 있다.