トップ 一覧 検索 ヘルプ RSS ログイン

GApplicationによるコマンドライン解析機能サポート #hsp3 #gtk3の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
:: このページの目次
{{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
{{include_html _code_gapplication_commandline}}