'가사'에 해당되는 글 7건

  1. 2010.07.30 외부 Thread에서 GTK 위젯 제어할시 동기화 문제 해결 5
  2. 2010.06.24 오늘도 실수.. iconv
  3. 2010.06.20 Screenlet 에 현재 재생중인 음악파일 커버 출력시키기 6
  4. 2007.08.28 심심해......... 12
  5. 2007.08.04 dwm 2일째 벌써...불편함이 6

외부 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일 발행

오늘도 실수.. iconv

문자열을 변환하는데.. "춏" 이런 글자가 나오면 문제가 생기길래..

로케일 문자에러가 생긴다는 생각은 했는데...

암튼 막 문제가 생기는거 같은 부분을 쭉쭉 타고 역으로 올라가다보니깐 (한시간 더 찾았다 -_-)

perror(); 써서 확인해보니깐
"부적절하거나 불완전한 다중바이트 또는 광역 문자" 라는 메세지가 뜨고.....

그래서 설마 하며 #define한걸 보니

#define LRC_FILE_LOCALE    "EUCKR //IGNORE"         /*  */
#define PRINTED_LOCALE     "UTF8"          /*  */

UTF8 => EUCKR로 변환하는건 옵션을 붙였는데
EUCKR=> UTF8로 변환할때는 옵션을 안붙였네 아놔...

아나 iconv_open 하는 부분의 //IGNORE 가  빠져 있음 ....

//IGNORE  추가....
#define PRINTED_LOCALE     "UTF8 //IGNORE"          /*  */

결국엔

iconv_open("EUCKR //IGNORE", "UTF8 //IGNORE"); // 이런식이 되시겠다.... 맞나 이게...

맨 페이지 아저씨는 이렇게 말씀하셧따.

       //TRANSLIT
              When  the  string  "//TRANSLIT"  is appended to tocode, transliteration is activated.  This means that when a character cannot be represented in the target
              character set, it can be approximated through one or several similarly looking characters.

       //IGNORE
              When the string "//IGNORE" is appended to tocode, characters that cannot be represented in the target character set will be silently discarded.

- 요약하자면... 그냥 로게일 뒤에
"//IGNORE" 써주면 인식 못하는 문자는 무시한다는거구
"//TRANSLIT"는  iconv_open이 비슷한 문자를 알아서 때려넣어(?) 준다는것

오늘의 병신짓 ㅜㅜ.. 이젠 출력되다가 중간에 끊어먹는 버그 해결

에휴 시간 아까워...

'Programming > C' 카테고리의 다른 글

포인터 연습  (6) 2011.05.27
간단한 디버그 함수  (0) 2010.08.16
아아 또 실수~!  (4) 2009.06.22
주의력 부족  (2) 2009.06.22
이진트리를 만들고나서....아 망했어요...  (2) 2009.05.25

Screenlet 에 현재 재생중인 음악파일 커버 출력시키기

저번에 한번 conky자체에 그림나오는 기능을 사용해서 자켓 이미지를 출력하게 시도한 적이 있었다는..

http://lowid.tistory.com/entry/conky-%EA%B7%B8%EB%A6%BC

그런데 그때는... cpu를 너무 많이 먹는 바람에 하루정도 돌리고 포기...

그러다가 새로운  desklet을 한번 알게 되었는데 그게 바로 screenlet

이것을 좀 보니깐 python스크립트로 되어있는거라.. 좀 깨름직했지만...

(개인적으로  pstree 했을때 python 실행파일이 보이는것이 영 내키지 않아서)

그래도 어짜피 메모리 많이 남으니깐..

(전체 2긱인데 vm, firefox를 안돌리면 절대 200mb(각하의 100배임) 을 넘길일이 없으니)

그냥 쓰기로 해따.. 뭐 많은데 쓰지뭐

어쨋던 그렇게 하고.. screenlet 에 어떤 위젯(?) 이 있나 보니깐..

"SlideShow" 라는게 있어서 좀 살펴보니깐, 특정 디렉토리에 있는 그림파일을 출력해 주는 기능이 있었다는.

사용자 삽입 이미지

(Terminal lyrics, Slideshow, conky의 조화!!)

그래서 생각한게... 뭐 그냥 그 디렉토리에다가 현재 mpd로 재생중인 파일의 path을 알아내서

find로 찾아주면 간단하겠네.... 라는 생각이 들어서 바로 만들어 봤다..

find할때 재대로 안되는건 쿼우팅이 문제라서 따옴표를 붙여주고...

디렉토리 이름에 공백문자가 들어가서 생기는 문제는 IFS로 해결했다.

이러니깐 어지간한건 다 잡는듯.....

다음은 스크립트

#!/bin/bash

# MPD 설정 디렉토리
MPD_DIR="/data/mp3"

# 현재 재생중인 파일의 MPD 디렉토리
MPD_PATH=$(dirname "$(mpc -f "%file%" | head -n 1)")

# 자켓이 임시 복사될 디렉토리
JACKET_DIR="/home/lowid/etc/mpd_jacket"

# 현재 재생중인 파일의 디렉토리
PLAY_FILE_DIR="$MPD_DIR"/"$MPD_PATH"

# 경로에서 확장자가 jpg인것을 검색(작은따옴표 주의)
JACKET_FILES="$(find "$PLAY_FILE_DIR" -iname '*.jpg' -o -iname '*.png' -o -iname '*.gif')"

# 아까 있던 파일들 모두 삭제
rm -rf "$JACKET_DIR"/*

# IFS를 '\n'으로 변경(spc 방지)
IFS='
'

# 복사
for IMAGE_FILE in $JACKET_FILES
do
    echo "$IMAGE_FILE"
    cp "$IMAGE_FILE" "$JACKET_DIR"
done

그리고 이걸 곡이 바뀔때 마다 실행해 주면 된다 -_-..

나는 그냥 귀차나서 lyrics프로그램 내부에 mpd감지하는 루틴에

system("/home/lowid/bin/mpd_jacket.sh");

넣어버림 ㅋㅋㅋㅋㅋㅋㅋ


이래도 문제는 발생한다는거...

곡이 바뀌면서 바로 커버가 바뀌는게 아니라 몇초 딜레이 시간이 필요하다. (머 1초로 설정하면 거의 없긴해두)

(SlideShow의 자체 갱신 시간이 있기때문)

python 프로그램을 찾아서 갱신시간을 event로 알아낼수 있게 어떻게 수정하면 되긴하겠는데...

python 은 귀찮기도 하고............ 걍 PASS 귀차늠..

아니 윗에처럼 하느니.. 그냥 lyrics + cover + control이 되는 새로운 프로그램을 gtk로 만드는게 나을지도

근데 이것도 귀찮아서 아마 시도도 안할거임 아마..............

추가-----

find에서 exec로 해도 되는거 같은데 .;

심심해.........

요즘엔 뭐.. 할것도 없어서.. 아 심심합니다..

정확하게 말하면 뭔가 해고픈 그런 욕구가 없다고 할까요...

그냥 죽치고 윈도에서 겜만 하는 그런 뭐...

라이즈오브네이션즈라고 마소애서 나온 뭐 그런게 있는데 죽치고 시대업만해서

쳐들어가는 그런 뻘짓을.. 안되면 치트치고... 엔딩보니까 치터의 플레이어 -_-; 이렇게만 뜨고..

os만들기 어쩌구 저쩌구 책도 봤는데.. 아직은 별 재미도 없는거 같고..(부트로더 어쩌구한것도
이거 한다고 한거... ) 해서 잠시 접고 있습니다 왠지 하고픈 욕구가 안나요...

그러자고 dwm소스 고쳐서 각창으로 단축키로 이동하게 하고 알아서 터미널 순서대로 만들어 주는거
 지정된 슬라이브 터미널 마스터로 이동하게 하는것도.. 해야하긴 하는데.. 귀차나서..................

또,가사나오게 하는것도 가끔씩 꺼지는데(한 보름동안 3-5번꺼졌나?) 왜꺼지는지도 봐야하고..

valgrind로 보니깐 내 프로그램 자체의 오류는 아닌거 같지만뭐.. 귀찮고 그렇네요..

그렇자고 놀자니 게임도 지겹고(스타,라이즈 지겹게 했으니.. 대체 몇년이고!)

애니도... 요즘엔 뭐 버닝할만한 것도 안보이거 말이죠...........

dwm 2일째 벌써...불편함이

타일형식의 윈도우 메니져에 만족은 하지만....

dwm이거 너무 가벼운지라 윈도우 기능이 너무 부족합니다..

slave윈도우간의 관리가 정말 골아프네요..

1,slave master area간의 이동이 영...
아직 기능미달이라서 그런지 Zoom함수(slave window를 master window로 교체 해주는 역활)
의 arg를 지원하지 않아서 무조건 첫번째 다음 slave윈도우와 만 교환이 되고
따로 설정할수 가 없네요 불편합니다.. 일일이 윈도우 이동해서 주윈도우로 이동해야하니까
싫어여..ㅜ

사용자 삽입 이미지
2,slave윈도우 크기조절이 안되..............;;;;;;;;;;;;
모든 slave윈도우는 slave영역(?)에 같은크기의 영역을 가지기때문에.;;
따로 크게 하고 싶은 윈도우 크기를 키우거나
작게하고 싶은 윈도우 크기를 줄일수가 없다는겁니다.;
lyrics같은경우는(전에만든 mpc터미널용..) 적은 영역만 차지하면 되는데 많은 영역을 차지해서
IRC가 나올영역을 다 먹어버(........)리네요..

3,이거 slave영역을 여러게 둘수 없어??
이건 불편하진않지만.. 되었으면 좋겠는 기능.....

4, slave윈도우 위치 기억기능
이 이름을 가진 윈도우는 slave위치에 항상 있게 하시오.. 이렇게 설정하고싶은데
방법이 없나봅니다,. 저는 lyrics를 맨위에 두고 싶은데.. 타일모드 의 윈도우에선 안되네요.

사용자 삽입 이미지
5,처음에 윈도우를 시작했을때 깔끔하지가 못하다..
restart-X를 하면.. 테투리가 (터미널일경우) 더럽게 나오네요..

dwm은 아니고 기타 자잘한 이야기..
터미널 가사출력프로그램말인데,(어짜피 나혼자만 쓰지만) 이게 안되길래.
직접 가사소스를 받아왔는데 barosl에서 서버때문에 그런지 몰라도 ,앞에 에러메세지가
마구 끼어(?) 있어서 그부분을 제거할려고 소스 5줄 넣어줌.

urxvt에서 폰트설정...
폰트설정은 아직 왜이런지 모르겠습니다
사용자 삽입 이미지
왜 저렇게 (일부 한문이)글자가 크게 나오니........; 언벨런스 하잖아..
아..지금생각났는데 굴림을 적용시킨다음,폰트크기를 따로 굴림만 작게 주면 해결될것도 같네요
괜이 사진찍었잖아............;

그래도 urxvt만세! 내가 만든 그 터미널 (lowterm?)프로그램이 쓰는 vte보다
스크롤속도가 빨라서 좋네요.. w3m도 이미지 제대로된 위치에 잘 나오고.....
overthespot이 안되는게 굉장한 흠이지만..

ION이라는것도 타일형태의 윈도우메니져라고 해서 한번켜봤는데..
그다지.........음 그것말고 타일형 윈도애니져를 아시는분좀 추천좀 해주세요........

'Linux > 스샷/외부설정' 카테고리의 다른 글

ninix 테스트..  (5) 2008.01.08
11월 스크린샷  (3) 2007.11.04
DWM(다이나믹 윈도우 메니저) 로 전향!  (6) 2007.08.03
w3m이 업뎃 됬구나!  (4) 2007.07.04
conky 설정  (2) 2007.06.26
prev 1 2 next