GTK 프로그래밍 한번더 질문 올립니다

lowid의 이미지

첫번째 질문
윈도우에서 타이틀 바 중에서 _ ㅁ X (최소,최대,종료) 버튼을 제어해 줄려면 어떻게 해야하나요?
gtk_window_set_decorated(GTK_WINDOW(set_window),FALSE);
로 하니까는 타이틀 바 전체가 다 없어지네요,,; 이렇게 말고 각각의 버튼을 TRUE,FALSE 시키고 싶어요

두번째 질문
윈도우의 위치를 고정시키고.크기 변겅을 막는 그런
아.. 이건 찾아보면 금방 나올거 같긴하네요.;;

세번째 질문
TAB키를 누르면 화면상에 나온 위젯들 끼리 이동하잖아요..(ex>텍스트박스(edit 불가능)->엔트리박스->버튼1->버튼2.......)
이경로를 정해줄수 있는 방법이 있나요?
체팅프로그램이라 텍스트뷰(edit금지,메세지 출력부) 엔트리박스(메세지 입력부 물론 한줄) 가 있는데..
프로그램을 처음 시작하면 텍스트뷰에 커서(키보드)가 가있어서 탭을 누질르든가 해서 엔트리박스로 이동해야 하거든요.
프로그램을 처음 시작 시켰을때 커서를 엔트리박스에 두는 방법을 알고 싶습니다.. 물론 움직일때 제어하는 방법도요
(TAB 눌렀을때 시그널을 어떻게 하면... 되려나요?)

네번째 질문
자식 윈도우에 입력을 받게 할때
자식 윈도우에서 제대로 입력이 될때까지
부모 윈도우에 접근을 금지시켜려면 어떻게 하여야 하나요?

다섯번째 질문
GTK를 배울만한 책을 찾습니다..
현재는 홈페이지에서 레퍼런스 찾아가면서 하고 있습니다만.. 좀 불편한거 같아서..
강컴에서 gtk로 검색해보니깐 책이 원서 합쳐서 10권도 검색이 안되는군요

여섯번째 질문
GTK는 레퍼런스북 프로그램이 어떤것이 있나요??
devhelp라는 프로그램을 찾고, gtk홈페이지에서 html파일을 타볼로 받았는데
원최 인식을 못하는군요.. ~/.devhelp/books 파일 에다가 놓아도 인식을 못해요
따로 format이 있나요? devhelp 전용으로요.

일곱번째 질문
GTK가 실무에서는 어떤곳에 쓰이나요?

여덟변째 질문
우리나라에서 GTK를 다루는 포럼 같은곳을 알고 계시면 좀 가르켜주세요
그놈.or.kr 빼고는 모르겠네요

gtk-demo 로는 벅차군요 ;

keizie의 이미지

3. gtk_container_set_focus_chain()
4. gtk_dialog_run()

devhelp에서 찾아보세요.

dalgarak의 이미지

1. 쓰신 함수는 borderless window를 만들때 쓰는겁니다. 대신에, gdk_window_set_decorations () 를 쓰세요.
접근할수 있는 enum은 http://developer.gnome.org/doc/API/2.0/gdk/gdk-Windows.html#GdkWMDecoration 을 참고하세요.

2. gtk_window_set_resizable() 을 쓰세요.

3. kz님이 먼저 답변해주셨군요.

4는.. dialog로 해결 할 수도 있지만 윈도우 위젯간에는 gtk_window_set_transient_for () 를 사용하면 됩니다.

5. http://developer.gnome.org/doc/ 를 보세요. gnome-developer-documentation rulez ;-) gdk-pixbuf 같은건 따로 문서가 있습니다. 잘 찾아보세요. =3
튜토리얼도 많이 퍼져있어 그렇지 꽤 쓸만한 튜토리얼이 많습니다. cairo/pango integration 등도 마찬가지구요.

6. 해당 배포판 패키지 관리자의 doc 패키지를 쓰거나, gtk-doc를 설치하고 --enable-doc 로 소스 컴파일후 설치해서 쓰시면 됩니다. /usr/share/gtk-doc/html/ 내에 맞춰서 넣어주는 방법도 있겠고.. 뭐 여러가집니다.

----
It's Friday I want to play,
on Saturday don't want to stay, at home
thinking of you
so let me party all night long.

from m-flo, Come again lyrics

http://luna.onionmixer.net

keizie의 이미지

질문하신 분은 부모창에 접근을 못하도록 하고 싶은 거고, transient는 위치만 상위로 두는 걸로 알고 있습니다.

dalgarak의 이미지

오우.. 제가 뭔가 잘못 이해했군요. =3=3 transient는 위치만 상위에 두는게 맞습니다. :)

----
It's Friday I want to play,
on Saturday don't want to stay, at home
thinking of you
so let me party all night long.

from m-flo, Come again lyrics

http://luna.onionmixer.net

lowid의 이미지

답변 달아주신 분들 감사드립니다 ~
감사의 의미? 로 재질문 돌입!

1 gdk 까지 건들여야 하는건가요 ㅡㅜ gtk도 초본데.. 일단 미뤄두죠,.;;
gtk_window_set_resizable() 로 대충 해결했습니다만(설정하니까 창 크기 조절 버튼이 없어지더라고요)
gtk로 버튼 제어를 할수 없었다니..

3번

typedef struct {
gpointer data;
GList *next;
GList *prev;
} GList;

GtkWidget *username_entry,*password_entry;
GtkWidget *ok_button;
GList *en1,*en2,*buok;

//en1->prev=? 없어도 된다?
en1->data=&password_entry;
en1->next=en2; //en2는 쓰레기값이라 넣어주면 안되는거 아닌가요? 주소넘겨줄래니까 워닝이 뜨길래..
en2->prev=en1;
en2->data=&username_entry;
en2->next=buok;
buok->prev=en2;
buok->data=&ok_button;
buok->next=NULL; // 이렇게 하면 리스트 구성 아닌가요? ^^;;;;

gtk_container_set_focus_chain(GTK_CONTAINER(window),en1);

이런식으로 하니까 안되는거 같은데요. 어떻게 하죠?

4번은 제가 설명을 잘못 한듯하네요..
사용자가 자식 윈도우에 있을때는 부모윈도우가 비활성화 되게 해야한달까요..
예를 들어서 사용자가 자식윈도우에 있을때 부모 윈도우에 버튼을 아예 못느루게 하다는 식으로요
(gtk_window_set_transient_for () 는 안먹혀서요 ;)
gtk_dialog_run ()은 dialog일때만 되는거 아닌가요?

gint result = gtk_dialog_run (GTK_DIALOG (dialog));
switch (result)
{
case GTK_RESPONSE_ACCEPT:
do_application_specific_something ();
break;
default:
do_nothing_since_dialog_was_cancelled ();
break;
}
gtk_widget_destroy (dialog);

일반 윈도로 하니깐 반응이 좀 이상해서요

devhelp..정말 골치네요.. gtk-doc이 설치되는 폴더 /usr/share/gtk-doc/html로 직접 넣어주어도
html파일 인식을 못합니다 .;; (소스는 gtk.org 에서 받음)
아예 configure할때 소스 경로를 정해줄수 없는지요
devhelp자체에는 경로 설정이 없어서요

---------------------------------------------
아치리눅스좀 써주세요
-> 아치리눅스 유저 좀 꼬셔오세요. 1인당 10명!

dalgarak의 이미지

1. Window decoration 중 최대/최소화 버튼 제어쪽은 오른쪽 버튼을 눌러서 제어하는것 까지 통제하기 위해
gdk_window_set_functions ()로 해줘야 할껍니다. set_decorations()는 무슨 연유에서던지 2.10.1에서 기묘하게 작동하더군요.
(더이상은 귀찮아서.. 테스트 안했습니다.)

Gdk는... GtkWindow 구조체 내에 window 멤버가 있는데, 이것이 GdkWindow * 타입을 가집니다. 이걸로 억세스 하면 됩니다.
아래는 대충 쓴 짤방 코드. (....중얼) 대충 저런식으로 쓸 수 있을 껍니다. 자세한건 API 문서를 보세요.
뭐 그다지 어렵게 생각하지 않으시는게 좋지 않을까.. 싶군요 일단 마음가짐이라도 :-)

gdk_window_set_functions (GDK_WINDOW(_GTKWINDOWWIDGET_VARIABLE->window), (GDK_FUNC_RESIZE|GDK_FUNC_MOVE|GDK_FUNC_CLOSE));

3. GList는 자체가 D-liked list입니다. 조작용 API는 다음의 페이지를 참조하시길.
http://developer.gnome.org/doc/API/2.0/glib/glib-Doubly-Linked-Lists.html

4. 흠.. 안본지 오래되어서 좀 기억이 가물가물하군요... 이놈의 정신이란.
여튼....일반적인 GtkWindow에 다이얼로그 속성을 먹여서 사용하면 됩니다.

(1) 생성은 GtkWindow로 하되,
(2) gtk_widow_set_type_hint로 타입 힌트를 Dialog로 맞추고,
(http://developer.gnome.org/doc/API/2.0/gtk/GtkWindow.html#gtk-window-set-type-hint ...를 참조.)
(3) gtk_window_set_modal()로 모달 속성을 가지게 하신 후,
(http://developer.gnome.org/doc/API/2.0/gtk/GtkWindow.html#gtk-window-set-modal 를 참조하세요.)
(4) gtk_window_set_transient_for() 로 해당 모달이 부모 윈도우 최상단에 항상 머물도록 하면 됩니다.

이렇게 하면 부모 윈도우가 가진 일부 속성에는 접근이 되겠지만, 포커스가 잡히지 않고 부모 윈도우에 억세스가 되지 않게 될 것입니다.
사실은 모달 속성을 부여하는게 가장 중요한 것이 되겠군요. :)

devhelp나 뭐나.. 하는 것들은 configure --prefix 로 경로 prefix를 먼저 지정해서 통일해줘야 합니다. gtk+을 설치하실때 configure 옵션으로 앞과 이전에 언급한 대로 옵션과 prefix를 맞춰주시고, gtk-doc 패키지가 정상적으로 깔려있으면 올라갈껍니다.
굳이 해당 배포판의 패키지를 쓰지 않으시는 이유가... "너무 오래되었기 때문" 이라면.. gtk+ glib 등을 전부 손컴파일해서 올려주시는게 좋을껍니다.
(prefix를 쓰고, make install 타이밍때 해당 구조를 따라가는 상태에서 다른 위치에 설치를 할 수 있습니다.

$ make DESTDIR="테스트할 경로" install

같이 말이죠. 이런것으로 해당 소스의 INSTALL 문서라던지.. autotools 등을 보시는게 좋을 것입니다.)

추가 : glade와 libglade를 사용하시는건 어떨까요? 훨씬 쉽게 gtk+ 프로그래밍을 하실 수 있을 것입니다. :)

----
It's Friday I want to play,
on Saturday don't want to stay, at home
thinking of you
so let me party all night long.

from m-flo, Come again lyrics

http://luna.onionmixer.net

lowid의 이미지

답해주셔서 감사합니다 ^^

다름이 아니라 앞에 적은 글에서
GtkWindow 구조체 내에 window 멤버가 있는데, 이것이 GdkWindow * 타입을 가집니다
라고 하셔서

  1 #include<gtk/gtk.h>
  2
  3 void closeApp(GtkWidget *window,gpointer data)
  4 {
  5     gtk_main_quit();
  6 }
  7
  8 int main(int argc,char *argv[])
  9 {
 10     GtkWindow *win;
 11
 12     gtk_init(&argc,&argv);
 13
 14     //win=gtk_window_new(GTK_WINDOW_TOPLEVEL);
 15     gdk_window_set_functions(GDK_WINDOW(win->window),(GDK_FUNC_RESIZE|GDK_FUNC_MOVE|GDK_FUNC_CLOSE));
 16     gtk_widget_show(win);
 17
 18     g_signal_connect(GTK_OBJECT(win),"destroy",GTK_SIGNAL_FUNC(closeApp),NULL);
 19     gtk_main();
 20
 29     return 0;
 30
 31 }

컴파일...

wind.c:16: warning: passing argument 1 of ‘gtk_widget_show’ from incompatible pointer type
wind.c:15: error: ‘GtkWindow’ has no member named ‘window’ 라는 어러가 나길래 찾아 봤습니다
window멤버가 없는거 같아요

typedef struct _GtkWindow       GtkWindow;
 
 struct _GtkWindow
 {
   GtkBin bin;
 
   gchar *title;
   gchar *wmclass_name;
   gchar *wmclass_class;
   GtkWindowType type;
 
   GtkWidget *focus_widget;
   GtkWidget *default_widget;
   GtkWindow *transient_parent;
 
   gushort resize_count;
   guint allow_shrink : 1;
   guint allow_grow : 1;
   guint auto_shrink : 1;
   guint handling_resize : 1;
   guint position : 2;
 
   /* The following flag is initially TRUE when a window is mapped.
    * and will be set to FALSE after it is first positioned.
    * It is also temporarily reset when the window's size changes.
    *
    * When TRUE, we move the window to the position the app set.
    */
   guint use_uposition : 1;
   guint modal : 1;
 
   /* Set if the window, or any descendent of it, has the focus
    */
   guint window_has_focus : 1;
 
  /* Set if !window_has_focus, but events are being sent to the
   * window because the pointer is in it. (Typically, no window
   * manager is running.
   */
  guint window_has_pointer_focus : 1;
};

PS;4번은 잘되네요~

---------------------------------------------
아치리눅스좀 써주세요
-> 아치리눅스 유저 좀 꼬셔오세요. 1인당 10명!

dalgarak의 이미지

음, GtkWindow가 아니라 GtkWidget으로 선언하고, gtk_window_new()로 생성해야 합니다. 정신이 잠시 외출했나 봅니다. -0-
GtkWidget 의 구조는 아래의 페이지를 참고하세요.
http://developer.gnome.org/doc/API/2.0/gtk/GtkWidget.html#GtkWidget-struct

위의 코드를 약간 수정해서 올바르게 하기 위해서는, gtk_widget_realize ()를 하여 Gdk 자원을 윈도우에 미리 할당해줘야 합니다.
사실 gtk_widget_show ()를 하게 되면 자동적으로 realize 된 후 화면에 매핑됩니다만, 화면에 매핑되기 전에 set_functions()가 적용되어 있어야 합니다.
그렇기 위해 임의로 realize를 해주는 것이지요.

따라서 대충 고치자면, 아래와 같은 코드가 되겠지요.

#include &lt;gtk/gtk.h&gt;
#include &lt;stdlib.h&gt;
 
void closeApp (GtkWidget *window, gpointer data)
{
	gtk_main_quit ();
}
 
int main (int argc, char *argv[])
{
	GtkWidget *win = NULL;
 
	gtk_init (&argc, &argv);
 
	win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
	gtk_widget_realize (win);
	gdk_window_set_functions (GDK_WINDOW (win->window), (GDK_FUNC_RESIZE|GDK_FUNC_MOVE|GDK_FUNC_CLOSE));
	gtk_widget_show (GTK_WIDGET (win));
 
	g_signal_connect (GTK_OBJECT (win), "destroy", GTK_SIGNAL_FUNC(closeApp), NULL);
	gtk_main ();
 
	return EXIT_SUCCESS;
 
}

...흠, code 태그도 < 표기를 위해 & lt;를 써야 하는군요..-ㅅ-;
----
It's Friday I want to play,
on Saturday don't want to stay, at home
thinking of you
so let me party all night long.

from m-flo, Come again lyrics

http://luna.onionmixer.net

lowid의 이미지

gtk_container_set_focus_chain() 함수를 테스트 하려고
딴걸로 편집해 봤는데요

gtk_container_set_focus_chain: assertion `GTK_IS_WIDGET (tmp_list->data)' failed 라고 오류 메세지가 뜨네요
리스트에 뭔가 오류가 있는것 같으데요.. 뭔가가..

해결..>에.. 순서를 잘 못집어넣어서 그렇네요 ,ㅡ;;
위젯 순서에 맞게 집어넣어야 했었는데..;;;

---------------------------------------------
아치리눅스좀 써주세요
-> 아치리눅스 유저 좀 꼬셔오세요. 1인당 10명!

keizie의 이미지

어떤 점을 잘못하고 있었는지, 어떻게 고쳤더니 됐는지 자세히 말씀해주시겠습니까? 궁금해서요.

lowid의 이미지

아주 사소한? 겁니다.. 정신놓고 코드를 적어서 그런거에요.;;

285 tab_list=g_list_append(tab_list,entry_box);
286 tab_list=g_list_append(tab_list,connect_button);
287 tab_list=g_list_append(tab_list,set_button);

리스트에 각 위젯들을 g_list_append함수에 대입을 하잖습니까?
그런데 저 변수들이 쓰이기 전에(각각의 위젯들을 ~_new()로 만들어 주기 전에)
리스트를 만들어 주었으므로 당연히 포인터 주소값이 이상한게 있었겠죠(쉽게 말해서 쓰레기 값)

한마디로 요약해서..위젯을 만들기 전에 리스트를 써서 그런것이었네요.;;

---------------------------------------------
아치리눅스좀 써주세요
-> 아치리눅스 유저 좀 꼬셔오세요. 1인당 10명!

dalgarak의 이미지

사소한 사항 외에도.. Gtk+ 매뉴얼을 보시면 realize나, mapping 이전에 해줘야 하는 일과, 이후에 해줘야 하는 일 등 처리 순서에 대한 내용들이 많습니다.
선행조건이 안맞아 떨어지면 assertion error가 발생할껍니다. 문제는, libc의 assert()와 달리 warning 메시지는 프로그램을 계속 진행시킵니다.
이런 버그는 gdb로 디버깅을 할때 breakpoint를 잡아줄 필요없이, warning 메시지가 뜰때 프로그램을 강제 종료 시그널을 일으킬 수 있습니다.

(gdb) run --g-fatal-warnings

gdb 커맨드 라인에서 위와 같이 실행하면, 해당 warning 메시지 발생 위치를 backtrace 하기 쉽습니다. 이런식으로 접근하면 좀더 버그를 빨리 잡는데 도움이 될 껍니다.

----
It's Friday I want to play,
on Saturday don't want to stay, at home
thinking of you
so let me party all night long.

from m-flo, Come again lyrics

http://luna.onionmixer.net

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.