천재태지의 세상 돌려보기

seoz.egloos.com

- About Me... - Enlightenment, EFL - 타이젠 Tizen



[EFL] elementary로 애플리케이션 작성하기 (1) 윈도우 만들기 ├ Enlightenment, EFL

[ EFL 게시물 목차 : http://seoz.egloos.com/3458699 ]


< elementary 애플리케이션 개발 목차 >
(1) 윈도우 만들기
(2) 배경, 레이블, 버튼 만들기
(3) elementary 매크로를 이용한 메인 함수 작성

안녕하세요? 천재태지 서주영입니다.

이번 포스팅은 EFL을 이용하여 애플리케이션을 제작하는 방법에 대해서 알아보겠습니다.
지금까지 올린 포스팅은 대부분 추상적/개념적이거나 뉴스거리 등이 대부분이었는데, 개발자라면 EFL로 애플리케이션을 만드는 방법이 궁금하지 않았을까 생각합니다.

이 강좌에서는 EFL로 애플리케이션을 제작할 때 가장 많이 사용하는 elementary 위젯 라이브러리를 이용하겠습니다.
(elementary에 대한 설명은 "elementary란?[1]"을 참고 하시기 바랍니다.)
참고로 예제 소스코드는 EFL의 코딩 컨벤션[2]에 따라서 코드를 작성하도록 하겠습니다. EFL의 코딩 컨벤션은 다른 프로그래밍을 할 때와 조금 다르기 때문에 한번쯤은 눈에 익혀야 합니다.

우선, 제가 만든 예제 코드를 빌드/실행 하시려면 EFL을 설치해야 합니다.
EFL 설치 방법은 "우분투에 EFL 및 E17 설치하기[3]"를 참고 하시기 바랍니다.

자, 그럼 첫 번째 강좌이기 때문에 블로그 포스팅 두 개에 걸쳐 간단한 레이블과 버튼이 있는 윈도우만 하나 띄워보도록 하겠습니다. 최종 결과물은 아래 그림과 같습니다.

일단 이번 시간에는 윈도우를 하나 만들어보겠습니다. 이번에 만들 샘플 애플리케이션은 아래 그림처럼 생겼습니다. 아무 내용도 없는 윈도우만 하나 있습니다.

일단 전체 코드를 보여드리고 하나 하나 간단히 설명 드리겠습니다. 설명할 내용이 많으니 이 포스팅에서는 각 라인에 대해서 간단히 설명만 하고 자세한 내용은 각 항목 별로 별도로 포스팅을 하겠습니다.

// 1. Elementary.h 헤더 include
#include <Elementary.h>

// 2. main 함수 작성
int
main(int argc, char **argv)
{
   //  3. Evas_Object 선언
   Evas_Object *win;

   //  4. elementary 초기화 
   elm_init(argc, argv);
   //  5. elementary 종료 정책 설정
   elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
   
   // 6. elementary window 생성
   win = elm_win_add(NULL, "sample", ELM_WIN_BASIC);
   elm_win_title_set(win, "Sample");
   elm_win_autodel_set(win, EINA_TRUE);
   evas_object_resize(win, 200, 100);
   evas_object_show(win);
   
   // 7. main loop 시작
   elm_run();
  // 8. elementary 리소스 해제 
   elm_shutdown();
   
   return 0;
}

자, 간단한 코드를 완성했습니다. 코드를 작성하기 귀찮으신 분은 여기[5]에서 코드를 다운로드 받으세요.

그럼 코드를 tutorial_01.c 로 저장하고 일단 아래와 같이 빌드를 해볼까요?
$ gcc tutorial_01.c -o tutorial_01 `pkg-config --cflags --libs elementary`
참고로 `는 작은따옴표(')가 아니라 키보드에서 ~와 같은 키에 있는 기호입니다.

아무 에러가 없이 빌드를 하셨으면 아래와 같이 프로그램을 실행합니다.
$ ./tutorial_01

다음과 같이 검은 바탕의 창이 하나 뜨면 성공한겁니다!

그럼 간단한 코드이지만 각 라인별로 설명을 드리겠습니다.

1. elementary를 사용하려면 우선 Elementary.h 헤더를 include해야 합니다.
EFL로 애플리케이션을 개발하다보면 elementary 이외에 eina, ecore, evas 등 다른 EFL 라이브러리를 사용할 필요가 있습니다. 그런데 Elementary.h에서 Eina.h, Eet.h, Evas.h, Ecore.h, Edje.h 등 다른 주요 EFL 라이브러리의 헤더를 참조하고 있기 때문에 Elementary.h만 있으면 다른 EFL 라이브러리의 헤더를 직접 include할 필요가 거의 없습니다.

#include <Elementary.h>

2. 다음은 main 함수를 작성할 차례입니다.
C 프로그램의 몸체에 해당하는 main 함수입니다. main함수가 끝나면 프로그램이 정상적으로 종료되었다는 의미로 0을 return합니다. main 함수 안에서 프로그램의 모든 것이 시작되고 끝납니다. main 함수는 C 프로그래밍을 할 때 항상 사용하기 때문에 자세하게 설명하지 않겠습니다.

int
main(int argc, char **argv)
{
   return 0;
}

3. 우리가 사용할 Evas Object를 선언하는 부분입니다.

Evas_Object *win;

Evas_Object의 포인터 형으로 win이라는 변수를 선언했습니다. Evas_Object는 EFL에서 화면에 표시되는 모든 오브젝트(object)를 의미합니다. 즉, EFL에서 화면에 표시되는 모든 오브젝트는 Evas_Object *으로 사용하시면 됩니다.
Evas_Object는 EFL에서 canvas(도화지)에 해당하는 evas라는 라이브러리에 정의되어 있습니다.
elementary window도 화면에 표시되는 오브젝트이기 때문에 Evas_Object *형을 사용합니다.

4. 다음은 elementary를 초기화하는 부분입니다.

elm_init();

elementary는 init으로 초기화하고 shutdown으로 리소스를 해제합니다. 즉, elm_init()으로 elementary를 초기화한 후 elementary를 사용하고, elementary를 다 사용했으면 elm_shudown()으로 그동안 사용했던 리소스를 해제합니다.
이는 다른 EFL 라이브러리에서도 마찬가지로 적용되며 처음에 xxx_init()을 한 후, 마지막에 xxx_shutdown()을 합니다.

5. 다음은  elementary 종료 정책을 정하는 부분입니다.

자세한 설명은 별도의 포스팅으로 하고, 간단히 설명 드립니다.
여기서 elementary를 종료한다는 말은 elementary에서 사용하고 있는 ecore main loop을 종료한다는 말입니다.
그래서 아래 코드가 의미하는 것은  "마지막 윈도우가 닫히면 main loop도 종료해라"입니다.

elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);

6. elementary의 window를 생성하는 부분입니다.

윈도우는 elementary에서 기본이 되는 위젯입니다. 앞으로 윈도우를 먼저 생성하고 다른 위젯을 윈도우에 그리게 될 것입니다.

win = elm_win_add(NULL, "sample", ELM_WIN_BASIC);

윈도우를 생성합니다.
첫 번째 인자는 부모 오브젝트를 의미합니다. 아직 아무 오브젝트도 생성하지 않았기 때문에 처음 만드는 윈도우의 부모는 NULL이 됩니다.
두 번째 인자는 윈도우의 이름입니다. 이 이름은 하위 윈도우 시스템에서 사용됩니다.
세 번째 인자는 윈도우의 종류를 의미합니다. 툴바 형식, 메뉴 형식 등 다양한 윈도우 종류가 지원되는데 여기서는 가장 기본이 되는 ELM_WIN_BASIC 을 사용합니다.

elm_win_title_set(win, "Sample");
윈도우의 타이틀을 설정합니다. 타이틀은 애플리케이션을 실행했을 때 타이틀 바에 표시되는 내용입니다.

elm_win_autodel_set(win, EINA_TRUE);
윈도우의 X(닫기) 버튼을 누르는 등과 같이 윈도우를 종료하는 명령을 받았을 때 elementary 윈도우 오브젝트를 자동으로 삭제해줍니다. 이 옵션을 설정하지 않으면 윈도우를 닫더라도 윈도우 오브젝트는 메모리에 살아있게 됩니다. 특별한 경우가 아니라면 항상 이 옵션을 사용해주시면 됩니다.

evas_object_resize(win, 200, 100);
윈도우의 크기를 가로 200, 세로 100으로 조절합니다. EFL에서 사용하는 Evas_Object 는 기본적으로 크기가 0 x 0 이므로 자동으로든 수동으로든 항상 크기를 조절해주어야 합니다.

evas_object_show(win);
윈도우를 보여줍니다. Evas_Object를 만들더라도 기본적으로 화면에 보이지 않습니다. 그래서 자동으로든 수동으로든 항상 show 명령을 내려야 화면에 보입니다.


7. 다음은 메인 루프(main loop)를 시작하는 루틴입니다.

elm_run()은 애플리케이션의 메인 루프를 시작해주는 API입니다. GUI 프로그래밍을 할 때 지속적으로 사용자의 동작을 감시하고 이벤트를 받아 처리하는 루틴을 메인 루프라고 합니다. 이 메인 루프는 무한히 반복하게 되는데, EFL에서도 마찬가지입니다.
Elementary에서도 메인 루프를 사용해 이벤트/타이머/렌더링 등을 처리하고 GUI 애플리케이션을 동작시킵니다.
Elementary의 메인 루프는 내부적으로 Ecore의 메인 루프를 사용합니다.(Ecore의 메인 루프에 대한 자세한 설명은 여기[4]를 참고하세요.) 
elm_run()으로 시작한 메인 루프에서 빠져나오려면 elm_exit()을 호출하면 됩니다.

8. 다음은 elementary의 리소스를 해제하는 루틴입니다.

elm_shutdown()은 elementary에서 사용했던 자원을 해제하는 부분입니다. elm_init()와 대칭되는 개념입니다. elm_init()은 애플리케이션 시작 부분에서 호출하고 elm_shutdown()은 애플리케이션의 마지막에 호출하시면 됩니다.
elm_shutdown()은 보통 elm_run()아래에 위치하며 elm_shutdown() 이후 애플리케이션을 종료합니다.

elm_run();
elm_shutdown();

이렇게 간단히 윈도우를 만들어봤습니다. 다음 포스팅에서는 윈도우에 하얀 배경을 넣고, "Hello World!"를 출력하고 윈도우를 닫을 수 있는 버튼을 추가해보겠습니다.



[ EFL 게시물 목차 : http://seoz.egloos.com/3458699 ]




핑백

덧글

  • 타이젠ivi개발 2015/03/26 17:53 # 삭제 답글

    tizen ivi M3 에서는 EFL 을 지원하지 않나요?
    ivi 내의 terminal 상에서 c 코드를 짜서 gcc 컴파일 후 실행시키는데 에러가 뜨네요 ㅠㅠ....
    아직 ivi 자체에서는 EFL 을 이용한 소스코드 작성은 무리인가요...?
  • 천재태지서주영 2015/03/28 01:49 #

    Tizen IVI에서는 EFL을 지원하는 것으로 알고 있습니다.
    IVI 내의 terminal 상이라는 말이, IVI 이미지를 받아서 부팅을 하신 다음 그 이미지 내 terminal에서 gcc를 컴파일 하셨다는 말인가요?
    어떤 에러가 발생했는지, 왜 EFL을 이용한 소스코드 작성이 무리라고 생각하셨는지 궁금합니다.
댓글 입력 영역