From: Araki K. <j00...@ip...> - 2002-01-10 14:00:21
|
荒木です:-) すみません、反応が遅くなりました。 Subject: [Mlterm-dev-ja] image escape sqeuence From: MINAMI Hirokazu <mi...@ch...> Message-ID: <200...@ch...> Date: Thu, 10 Jan 2002 15:07:20 +0900 > eterm では (たぶん aterm でも) > > ESC ] 20 ; filename [; adjusting ] [: operation] BEL > > で背景画像が変えられるようです > (http://www.eterm.org/docs/view.php?doc=ref#image)。 そんなんがあるんですね。 # というか、どこかでみたことのある... ^_^; # ちなみに、w3m-img は、ほんとうにたまたま(はじめてだったかも)坂本さんの掲示 # 板を覗いてみつけたんですが、あのとき坂本さんにメールおくらなければ、今、絶 # 対にこんなことしてないです。 # 今から考えると、あれが分岐点だったような.... > どのくらい受け入れられている拡張なのかはよくしらないのですが、 > これ(ら)が使えると GUI なしでもある程度は端末設定が変更できて > 便利そうなので、とりあえず画像の変更だけはできるようにしてみました。 ありがとうございます。 のちほど、commit させていただきます_o_ # この辺は、ただでさえ、context によって、呼べたり呼べなかったりする関数 # 満載な上、Bidi/ISCII 対応の結果、undocumented な制約が増えておりますの # で、いじりにくかったと思います。すみません。 > eterm とおなじく > echo -e "\e]20;/path/to/foo.jpg;\007" で背景を foo.jpg に変更 > 読み込みに失敗したら背景画像の使用を停止 > とかできるはずですが、いかがでしょう? 以下のような修正をくわえされていただきましたがよろしいでしょうか? まず、VT100 シーケンスの場合と、mlconfig の場合で、背景画像はりつけに失敗 した場合の処理が異なるのは、なんかいやですので、error がおこった場合には、 set_wall_picture() 内で即座に背景画像を使用停止するように致しました。 その上で、ml_vt100_cmd_change_wall_picture() 内では、 ml_config_menu_event_listener_t:change_wall_picture を直接呼びだすだけに いたしました。 また、vt100 シーケンス処理中にウィンドウ描画処理を行なうことになりますので、 change_wall_picture() よびだし前後で、 ml_term_screen_{start|stop}_vt100_cmd() を呼びだす必要があります。 # この関数内部で、カーソルの消去や、画面イメージの logical order <=> visual order # の変換などを行なっております。 それから、index() ですが、これはコメントしていただいておりました通り、ANSI C 準拠ではありませんので、strchr() に修正させていただきました。 最後に、勝手な話なのですが、わたしの趣味で tab 幅 は 8 で開発しておりま すため、それでみたときに明らかに indent がずれるケースについては、修正させ てください _o_ パッチを添付いたしますので、ご確認などおねがいいたします。 では -- kiken j00...@ip... Index: src/ml_term_screen.c =================================================================== RCS file: /home/ken/cvsroot/mlterm/src/ml_term_screen.c,v retrieving revision 1.267 diff -u -r1.267 ml_term_screen.c --- src/ml_term_screen.c 2002/01/09 04:26:23 1.267 +++ src/ml_term_screen.c 2002/01/10 13:33:48 @@ -748,7 +748,7 @@ if( ! ml_picture_init( &pic , &termscr->window)) { - return 0 ; + goto error ; } if( ! ml_picture_load( &pic , termscr->pic_file_path)) @@ -756,16 +756,16 @@ kik_msg_printf( " wall picture file %s is not found.\n" , termscr->pic_file_path) ; - return 0 ; + ml_picture_final( &pic) ; + + goto error ; } if( ! ml_window_set_wall_picture( &termscr->window , pic.pixmap)) { - kik_msg_printf( "a wall picture failed to be set.\n") ; - ml_picture_final( &pic) ; - - return 0 ; + + goto error ; } else { @@ -773,6 +773,14 @@ return 1 ; } + +error: + free( termscr->pic_file_path) ; + termscr->pic_file_path = NULL ; + + ml_window_unset_wall_picture( &termscr->window) ; + + return 0 ; } static int Index: src/ml_vt100_command.c =================================================================== RCS file: /home/ken/cvsroot/mlterm/src/ml_vt100_command.c,v retrieving revision 1.2 diff -u -r1.2 ml_vt100_command.c --- src/ml_vt100_command.c 2002/01/06 22:25:44 1.2 +++ src/ml_vt100_command.c 2002/01/10 13:44:03 @@ -14,8 +14,8 @@ * for VT100 commands * * !! Notice !! - * these functions considers termscr->image not to be visual bidi order. - * call ml_term_screen_stop_bidi() before using them. + * these functions considers termscr->image to be logical order. + * call ml_term_screen_start_vt100_cmd() before using them. */ int @@ -670,6 +670,39 @@ ml_image_fill_all( termscr->image , &e_ch) ; ml_char_final( &e_ch) ; + + return 1 ; +} + +int +ml_vt100_cmd_change_wall_picture( + ml_term_screen_t * termscr , + char * path + ) +{ + if( *path == '\0') + { + /* Do not change current image but alter diaplay setting */ + /* XXX nothing can be done for now */ + + return 0 ; + } + + /* + * XXX + * trigger config_menu_event_listener. + */ + if( termscr->config_menu_listener.change_wall_picture) + { + /* + * without ml_term_screen_{start|stop}_vt100_cmd() , a cursor will + * be drawn on an old position in change_wall_picture + * (-> ml_window_set_wall_picture -> window_exposed). + */ + ml_term_screen_stop_vt100_cmd( termscr) ; + (*termscr->config_menu_listener.change_wall_picture)( termscr , path) ; + ml_term_screen_start_vt100_cmd( termscr) ; + } return 1 ; } Index: src/ml_vt100_command.h =================================================================== RCS file: /home/ken/cvsroot/mlterm/src/ml_vt100_command.h,v retrieving revision 1.1 diff -u -r1.1 ml_vt100_command.h --- src/ml_vt100_command.h 2002/01/05 09:36:04 1.1 +++ src/ml_vt100_command.h 2002/01/10 08:25:55 @@ -123,5 +123,7 @@ int ml_vt100_cmd_fill_all_with_e( ml_term_screen_t * termscr) ; +int ml_vt100_cmd_change_wall_picture( ml_term_screen_t * termscr , char * path) ; + #endif Index: src/ml_vt100_parser.c =================================================================== RCS file: /home/ken/cvsroot/mlterm/src/ml_vt100_parser.c,v retrieving revision 1.181 diff -u -r1.181 ml_vt100_parser.c --- src/ml_vt100_parser.c 2002/01/08 16:18:31 1.181 +++ src/ml_vt100_parser.c 2002/01/10 08:29:08 @@ -1723,6 +1723,22 @@ ml_vt100_cmd_set_window_name( vt100_parser->termscr , pt) ; } + else if( ps == 20) + { + /* image commands */ + char * index_p; + + /* XXX discard all adjust./op. settings.*/ + /* XXX may break multi-byte character string. */ + if ( index_p = strchr(pt, ';')){ + *index_p = '\0'; + } + if ( index_p = strchr(pt, ':')){ + *index_p = '\0'; + } + + ml_vt100_cmd_change_wall_picture( vt100_parser->termscr , pt); + } else if( ps == 46) { /* change log file */ |