:: このページの目次 {{outline}} !!! ダウンロード * {{ref gapplication_commandline_support_20160718.zip}} !!! メインのスクリプトとその説明 /* GApplicationによるコマンドライン解析機能サポート 起動例: gtk3_gapplication_commandline_support.exe --help gtk3_gapplication_commandline_support.exe -h gtk3_gapplication_commandline_support.exe --version gtk3_gapplication_commandline_support.exe -v gtk3_gapplication_commandline_support.exe --width=300 --height=100 gtk3_gapplication_commandline_support.exe -w 300 -t 100 gtk3_gapplication_commandline_support.exe てすと.txt main.hsp (G_APPLICATION_HANDLES_OPENまたはG_APPLICATION_HANDLES_COMMAND_LINEフラグ必須) gtk3_gapplication_commandline_support.exe --width=300 -t 100 main.hsp (G_APPLICATION_HANDLES_OPENまたはG_APPLICATION_HANDLES_COMMAND_LINEフラグ必須) */ *_build #runtime "hsp3cl" #define NAME_APP "gtk3_gapplication_commandline_support" #packopt name NAME_APP *_include #include "modclbk.as" #include "gtk+3.as" *_const #define VARTYPE_STR 2 #define NULL 0 #define APPID "jp.lldev.hspgtk." + NAME_APP #define OPTION_VERSION "version" #define OPTION_VERSION_SHORT 'v' #define OPTION_VERSION_HELP "プログラムのバージョンを表示して終了する" #define VERSION_APP "0.0.1" #define OPTION_WIDTH "width" #define OPTION_WIDTH_SHORT 'w' #define OPTION_WIDTH_HELP "ウィンドウの横幅" #define OPTION_WIDTH_ARGDISC "WIDTH" #define OPTION_HEIGHT "height" #define OPTION_HEIGHT_SHORT 't' #define OPTION_HEIGHT_HELP "ウィンドウの縦幅" #define OPTION_HEIGHT_ARGDISC "HEIGHT" #const DEF_WIN_WIDTH 200 #const DEF_WIN_HEIGHT 200 *_subroutines /* g_convert関数による文字コード変換 */ #module #defcfunc gconv var from_, str set_to_, str set_from_ g_convert@ varptr( from_ ), -1, set_to_, set_from_, NULL@, NULL@, NULL@ p = stat dupptr buf, p, 1, VARTYPE_STR@ to = buf g_free@ p return to #global /* SJIS文字列をUTF-8に変換 */ #module #defcfunc u str str_ from = str_ return gconv@( from, "UTF-8", "CP932" ) #global /* UTF-8文字列をSJISに変換 */ #module #defcfunc s str str_ from = str_ return gconv@( from, "CP932", "UTF-8" ) #global /* argc、argv、その他を取得 */ #module #uselib "msvcrt" #func __getmainargs "__getmainargs" int, int, int, int, int #deffunc getmainargs var argc_, var argv_, var env_, var sinfo_ argc_ = 0 argv_ = 0 env_ = 0 sinfo_ = 0 __getmainargs varptr( argc_ ), varptr( argv_ ), varptr( env_ ), 0, varptr( sinfo_ ) return #global /* コマンドラインオプション登録 */ #module #deffunc register_options var app_ // --version long = OPTION_VERSION@ short = OPTION_VERSION_SHORT@ flag = G_OPTION_FLAG_NONE@ arg = G_OPTION_ARG_NONE@ help = u( OPTION_VERSION_HELP@ ) g_application_add_main_option@ app_, long, short, flag, arg, help, 0 // --width long = OPTION_WIDTH@ short = OPTION_WIDTH_SHORT@ flag = G_OPTION_FLAG_IN_MAIN@ arg = G_OPTION_ARG_INT@ help = u( OPTION_WIDTH_HELP@ ) argdisc = OPTION_WIDTH_ARGDISC@ g_application_add_main_option@ app_, long, short, flag, arg, help, argdisc // --height long = OPTION_HEIGHT@ short = OPTION_HEIGHT_SHORT@ flag = G_OPTION_FLAG_IN_MAIN@ arg = G_OPTION_ARG_INT@ help = u( OPTION_HEIGHT_HELP@ ) argdisc = OPTION_HEIGHT_ARGDISC@ g_application_add_main_option@ app_, long, short, flag, arg, help, argdisc return #global /* 新しいウィンドウを開く */ #module #const GETPATH_REMDIR 8 #deffunc open_new_window var app_, str path_, int width_, int height_ if path_ = "" { ttl = "untitled" } else { ttl = getpath( path_, GETPATH_REMDIR ) } gtk_application_window_new@ app_ win = stat gtk_window_set_title@ win, ttl gtk_widget_set_size_request@ win, width_, height_ gtk_widget_show_all@ win return win #global *_main // argc, argvを取得 mes "args" getmainargs argc_, argv_, env_, sinfo_ // init app mes "init" ;G_APPLICATION_HANDLES_COMMAND_LINE ; ;G_APPLICATION_FLAGS_NONE gtk_application_new APPID, G_APPLICATION_HANDLES_OPEN app_ = stat register_options app_ width_ = DEF_WIN_WIDTH ; オプション引数用 height_ = DEF_WIN_HEIGHT ; オプション引数用 newclbk3 cb_app_handlelocaloptions, 3, *on_app_handlelocaloptions, CLBKMODE_CDECL newclbk3 cb_app_startup, 2, *on_app_startup, CLBKMODE_CDECL newclbk3 cb_app_commandline, 3, *on_app_commandline, CLBKMODE_CDECL newclbk3 cb_app_open, 5, *on_app_open, CLBKMODE_CDECL newclbk3 cb_app_activate, 2, *on_app_activate, CLBKMODE_CDECL newclbk3 cb_app_shutdown, 2, *on_app_shutdown, CLBKMODE_CDECL g_signal_connect_data app_, "handle-local-options", cb_app_handlelocaloptions, NULL, NULL, NULL g_signal_connect_data app_, "startup", cb_app_startup, NULL, NULL, NULL g_signal_connect_data app_, "command-line", cb_app_commandline, NULL, NULL, NULL g_signal_connect_data app_, "open", cb_app_open, NULL, NULL, NULL g_signal_connect_data app_, "activate", cb_app_activate, NULL, NULL, NULL g_signal_connect_data app_, "shutdown", cb_app_shutdown, NULL, NULL, NULL // start app mes "start" g_application_run app_, argc_, argv_ status = stat // end app g_object_unref app_ #ifdef _debug mes "exit " + status : stop #endif end status *_signal_handlers *on_app_handlelocaloptions mes "signal: handle-local-options" clbkargprotect args options = args( 1 ) // --version g_variant_dict_contains options, OPTION_VERSION if stat { mes NAME_APP + " version " + VERSION_APP return 0 ; exit } // --width g_variant_dict_lookup options, OPTION_WIDTH, "i", varptr( optarg ) if stat { width_ = optarg mes OPTION_WIDTH + ": " + width_ } // --height g_variant_dict_lookup options, OPTION_HEIGHT, "i", varptr( optarg ) if stat { height_ = optarg mes OPTION_HEIGHT + ": " + height_ } return -1 ; don't exit *on_app_startup mes "signal: startup" clbkargprotect args return *on_app_open mes "signal: open" clbkargprotect args app = args( 0 ) cnt_files = args( 2 ) dupptr gfiles, args( 1 ), cnt_files * 4 repeat cnt_files g_file_get_path gfiles( cnt ) ptr_path = stat dupptr path, ptr_path, 1, VARTYPE_STR open_new_window app, path, width_, height_ g_free ptr_path loop return *on_app_commandline mes "signal: command-line" clbkargprotect args cmdline = args( 1 ) g_application_command_line_get_arguments cmdline, varptr( argc_ ) p = stat dupptr argv, p, argc_ * 4 repeat argc_ dupptr arg, argv( cnt ), 1, VARTYPE_STR mes s( arg ) loop return 0 *on_app_activate mes "signal: activate" clbkargprotect args open_new_window args( 0 ), "", width_, height_ return *on_app_shutdown mes "signal: shutdown" clbkargprotect args return