'Programming/GTK+'에 해당되는 글 13건

  1. 2010.09.23 [버그] glade 이미지 파일 경로 설정
  2. 2010.08.06 gtk할떄는 gtk_init의 인자를 제대로 넣자. 2
  3. 2010.07.30 외부 Thread에서 GTK 위젯 제어할시 동기화 문제 해결 5
  4. 2007.06.14 윈도우 메니져 설정 무시하고 윈도우 만들기 2
  5. 2007.03.30 g_signal_connect의 폐해? 4

[버그] glade 이미지 파일 경로 설정

glade ver 3.6.7에서

리소스 파일을 수정할때

"패스명을 정확하게 수동" 으로 넣어야한다.

(옆에 폴더 아이콘 눌러서 지정해줘도, *.glade파일이 있는 경로랑 같지 않으면 비록 glade 내부에서는

그림이 잘 나오지만, 실제로 프로그램을 실행시키면 다 액박으로 뜬다)

그러니깐 Play_icon.png 라는 파일이 glade파일이 있는 하위홀더 icons에 있다면,

직접 icon/Play_icon.png라고 써놓아야한다.

(시실뭐... 나 같은 경우에는 그냥 직접 xml파일에다가 경로를 썼음)

(원래 스크린샷을 찍을렸는데 display가 갈궈서 자꾸 검은 화면만 나오기 때문에 패스)

gtk할떄는 gtk_init의 인자를 제대로 넣자.

gtk_init은 WM_CLASS에 영향을 준다.

gtk_init(NULL, NULL);로 해도 동작은 하지만

gtk 어플은 argv[0]의 값으로  WM_CLASS값을 처리하는데 

NULL 이니깐 WM_CLASS값이 제대로 나오지 않는경우가 발생하므로

(xprop로 찍어보면 WM_CLASS = <unknown> 으로 나옴)

윈도우 관리자가 해당 어플의 윈도를 관리할때 좀 문제가 생긴다

(오박같은경우는 class, role  값이 필요하다;; 근데 이 값들이 맛이가니 설정이 당연히 안먹음

WM_CLASS값의 하위값(?) 이 WM_ROLE이라서 그런지 role만 설정해선 먹히지도 않음 )

왠만하면 main 함수에서 argv를 받아서 처리하자...

아 참고로..

gtk_init(&argc, &argv);므로

첫번째인자는 그냥 1차원 포인터로 넘기면 되는거구

두번째 인자는 3차원 포인터로 넘기면 된다.....

내가 생성하려고 했는데..

머 나같은 경우에는 외부에서 void*로 받아서 char***로 넘겨버렸다.

이너므 gtk는 기초하다가 안하고 하다가 안하고 하니깐 계속 기초만 보게된다.....

사실 gtk보단 QT를 해야 더 먹고사는데 지장이 없을텐데......

어서 빨리 윈도플머에서 리눅이플머로 넘어가야할텐데..

외부 Thread에서 GTK 위젯 제어할시 동기화 문제 해결

내가 만드는 삽질 프로그램이 하나 있는데...

얘가 원래 터미널용 프로그램이라서.. 좀 뽀대나게 겉모습을 "Music Player"같이 변모시켜보고자

Front End를 좀 만들기로 했었다.

근데 하나의 프로세스에다가

"(터미널때) 원래 실행되는 루틴 + Gui Event 콜백(Gtk 므로  gtk_main(); )을 넣다보니......

원래 진행되어야 하는 부분이 gtk_main() 때문에 수행이 되지 않으므로.......

할수 없이 pthread를 사용해서 그 두 부분을 분리하기로 했다

(난 개인적으로 스레드 정말 싫어해서... 터미널용 프로그램에서도 다행히(?)도 스레드 사용을 안했

아 하나 했었다... timer 관련해서 0.01초마다 카운터 올리는 콜백(?)함수를 사용했지...

사실 이부분도 더 신경써서 고쳐야되는데 아직도 방치중이다 아아...)

              main();
                           |
                   pthread_create();
                           |
            ------------------------------
           |                                            |
terminal_program                       create_gtk_widgets
          |                                             |
          |                                      gtk_main();
    emit gtk signal ---------------------|     
거지같아서 그림으로 대체

DIA로 열심히 그렸는데... 일헌 그림이 짤려버렸군여..

사용자 삽입 이미지

확실히 텍스트로 찍찍 그어서 만든 조합보단 훨씬 멋있다!

처음엔 신경쓰다가 결국엔 대충 그렸으니깐 "저거 이상해여" 테클걸진 말아달라는,.

코드는 기껏해야 몇천줄인데 저렇게 보니깐 엄청 뭔가 한것같이 느껴지네...ㅋ 그림의 위엄 ㅋ

처음에 분기하는 부분은 pthreaad로 내가 직접 생성한거구

Terminal Thread를 나눈건.. 내가 직접 나눈것이 아니라, Timer라이브러리에서 Thread를 나누는것.

(이 부분은 별 신경 안썼다... )

내가 원하는건 왼쪽 (MPD Event Callback이랑 Timer Callback)에서 Gtk한테

"라벨 위젯 글자좀 바꿔주셈" 이라고 요청한것...

근데 그냥 이렇게 하면.. 몇십초 동안 프로그램이 잘 동작하다가 갑자기 죽어버리거나,

갱신이 안되고 계속 멍때리고 있는 문제가 발생한다..... (

처음엔 내가 만들었던 소스코드가 문제가 있나싶어서 열심히 뒤졌지만... 그래도 안나오는거짐..

gdb로 디버깅해도 이상한데서 죽어버리거나, 프로그램은 잘 살아 있는데도 글자갱신이 안되는

문제가 그대로 발생했었다..

이게 뭔가... 분명 GUI 씌우기 전에는 제대로 동작을 했었는데.. 씌우고 나서 안되니..

음.... 그러다가 갑자기 thread에 feel이 와서 구글을 찾아보니 왠걸..

http://library.gnome.org/devel/gdk/stable/gdk-Threads.html

역시 매뉴얼을 잘 읽어봐야 한다 -_-.......................

Gtk랑 pthread랑 같이 사용한다면..

gdk_threads_enter();

GTK_SourceCode;

gdk_threads_leave();

왜 같이 사용해야한다...

즉 다른 thread에서 GTK 사용할때는 gdk내부에 크리티컬섹션을 만들어 줘야 함

(외부 thread에서 gtk 함수 콜하는 모든 부분을 저렇게 보호)

근데 원인이 뭘까?

위젯값들은 전역에 static으로 선언 해서 위젯 포인터 받은이후는 바뀔일은 없을텐데...

gdk 이벤트 관련해서 문제가 생기나....

으아아아아...

핀트는 좀 다르지만.
3년전에 내 블로그에 이 내용 썼구나...

바보 인증 ㅠㅠ
http://lowid.tistory.com/entry/gtk-Thread

다음 부터는 내 블로그 먼저 검색해봐야 겠다.......

7월 18일 "제목" 작성, 7월 31일 발행

윈도우 메니져 설정 무시하고 윈도우 만들기

 if(term_cfg -> all_workspace_view == TRUE)
       //모든 워크스페이스에 출력
        gtk_window_stick(GTK_WINDOW(term_widget -> window));

    if(term_cfg -> taskbar_view == FALSE)   //default TRUE
        //테스크바에 안보이게 하기
        gtk_window_set_skip_taskbar_hint(GTK_WINDOW(term_widget -> window), TRUE); 

    if(term_cfg -> layer == 1) 
        gtk_window_set_keep_above(GTK_WINDOW(term_widget -> window), TRUE);         //최상위 윈도우로 만들기 (단 윈도 매니져가 우선)
    else if(term_cfg -> layer==0){
        /* gdk_window_lower,gdk_window_set_override_redirect 함수와
         * gtk_window_new 함수 연결 같은거.. 하려고;;
         * (window -> window 내용 채우기 위해서 ㅋ*/
        gtk_widget_realize(term_widget -> window);
        if(term_widget -> window -> window == NULL){
            puts("NULL!!!");
            exit(1);
        }  

        //윈도우 메니져의 설정을 무시한닷!!!
        gdk_window_set_override_redirect(term_widget ->window ->window,TRUE);
           
        //윈도우를 최하위로 만든담에 (이거 안되는데; )
        //gdk_window_lower(term_widget -> window -> window);
    }  

kldp에다가 질문을 올렸었는데 뭐 갈켜주는 사람도 없고 해서 어쩔수 없이 혼자 찾은
구글링 해서 찾았는데.......
역시 제일 나은건 man페이지라는거.........
------------------------------------------------------------
기억 보존을 위해서 적어둠...

'Programming > GTK+' 카테고리의 다른 글

gtk할떄는 gtk_init의 인자를 제대로 넣자.  (2) 2010.08.06
외부 Thread에서 GTK 위젯 제어할시 동기화 문제 해결  (5) 2010.07.30
g_signal_connect의 폐해?  (4) 2007.03.30
xlib 에러 해결!  (2) 2007.02.28
gtk Thread  (2) 2007.02.27

g_signal_connect의 폐해?

왜그런진 모르겠으나..

이상하게 gtk  signal을 연결해줄때 쓰는 함수

g_signal_connect 힘수 (또는 그 외에도 많지만은..)

이상하게 인자를 하나만 받아들이게 되어있어서

결국엔 구조체를 만든다음 한꺼번에 인자하나로 넘겨줄수 밖에 없는데

그러다보니...

/*header*/
59 struct st_quit
60 {
61     GtkWidget *window;
62     GtkWidget *terminal;
63     int terminal_number;
64     int *S_term;
65 };

/*main*/
 25     static struct st_quit Quit_Data[TERM_LIMIT];
30     static int terminal_onoff[TERM_LIMIT];  
51     Quit_Data[terminal_num].S_term=terminal_onoff;

/*func*/
  8     //혹시 함수 잘못 불러올까봐서 ...;                                                                
  9     if(G_st->S_term[G_st->terminal_number]==ON){                                               
 10         //받은 위젯 파괴, 그리고 플래그 OFF시킴
 11         gtk_widget_destroy(G_st->window);
 12         G_st->S_term[G_st->terminal_number]=OFF;    
 13     } 
                          
if(G_st->S_term[G_st->terminal_number]==ON)
라는 복잡한놈으로 변한다..

와 gtk 함수들은(일부?) 는 인자를 여러게 받게 안만들어 놨을까..?

(함수의 갯수가 유한하지만(8개였나??) 그래도 좀 많이 만들어 놓지 불편하잖아..)

이거...한 한달만 안보고 있다가 이거 보면 과연 내가 짜논거 제대로 이해나 할수 있을런지 모르겠다 -_-a

뭐 어쩔수 업지멀.. 호좁이라 이정도 밖에 머리를 못쓰겠는걸,.
(그렇다고 전역변수 쓰기도 그렇고........).
prev 1 2 3 next