トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

GtkCalenderを利用した簡単なスケジュール入力・閲覧 #gtk3 #hsp3

[PR] 創価の正体を知るための情報ページ


このページの目次

アプリケーションの機能


 カレンダーの日付をダブルクリックすると、その日のスケジュールを入力・閲覧するためのウィンドウが表示されます。入力したデータは、スケジュールウィンドウを閉じた時、もしくはアプリケーションを終了した(カレンダーウィンドウを閉じた)時に、ユーザのホームフォルダ内の".gtk3_daily_scheduler"フォルダに保存されます。

 一応--versionオプションおよび--helpオプションに対応していますが、"hsp3cl"ランタイムでコンパイルした時のみ有効になります。

ソーススクリプトのダウンロード


 gtk3_daily_scheduler_20160921.zip(39)

メインのスクリプトとその説明


  名前が"_"で始まるラベルについて


 これらのラベルはコーディング中の目印として置いたもので、スクリプトからは利用されていません。

  冒頭コメント


/*
*	GtkCalenderを利用した簡単なスケジュール入力・閲覧アプリ

*	コマンドラインオプション

		-v, --version	: プログラムのバージョンを表示して終了する
		--xpos=???	: カレンダーを表示するデスクトップ座標(X)。デフォルト:0
		--ypos=???	: カレンダーを表示するデスクトップ座標(Y)。デフォルト:0
		--showdetails=???	: カレンダーに日付情報(details.txtの内容)を表示するかどうか
							  "yes" "y" のいずれか、または、"no" "n" のいずれかを指定する
							  デフォルト:yes
		--detailwidth=??	: カレンダーの日付情報表示エリアサイズ(桁)。デフォルト:0
		--detailheight=??	: カレンダーの日付情報表示エリアサイズ(行)。デフォルト:0

*	変数名について

		グローバル(モジュール外):
		_*** : グローバルに参照される重要な変数
		***_ : コールバック関数の引数
		モジュール内:
		_*** : モジュール変数メンバ
		***_ : ユーザ定義命令・関数の引数
 */

  #define NAME_APP "gtk3_daily_scheduler"


#define NAME_APP "gtk3_daily_scheduler"

 この文字列は、実行ファイル名、アプリケーションID(後述)、アプリケーションで入力されたデータの保存フォルダ名、versionオプションの出力テキスト、に使われています。

  *_buildパート


*_build
#ifdef _debug
	#runtime "hsp3cl"
#else
	#runtime "hsp3c"
#endif
#packopt name NAME_APP
#packopt hide 1

 デバッグ実行および実行ファイル作成に関する設定を行っています。

  *_includeパート


*_include
#include "h_myconsts.as"
#include "m_myutils.as"
#include "modclbk.as"
#include "gtk+3.as"
#include "m_gtk+3utils.as"

  • h_myconsts.as
    • サンプル作者が個人的によく使う定数をまとめたファイルです。ダウンロードアーカイブに含まれています。

  • m_myutils.as
    • サンプル作者が個人的によく使う汎用の関数やサブルーチンをまとめたファイルです。ダウンロードアーカイブに含まれています。

  • modclbk.as
    • tds12さんがhsp.tvの掲示板で公開されたHSPでコールバック関数を使うためのスクリプトを保存したファイルです。ダウンロードアーカイブに含まれています。

  • gtk+3.as
    • GTK+関連のDLLに含まれる関数をHSPで使えるように#func命令で登録するスクリプトと、GTK+のプログラミングで使われる定数の定義の一部を保存したファイルです。実際はこの中でDLLごとに分けたものをさらにインクルードしています。ダウンロードアーカイブに含まれています。さらに詳しい説明が必要な場合は、こちらのページを見てください。

  • m_gtk+3utils.as
    • サンプル作者自作の、GTK+3ライブラリを利用したユーティリティサブルーチン集です。ダウンロードアーカイブに含まれています。

  *_constパート


*_const
#define APPID "etc.domain.my." + NAME_APP

PATH_DETAILS  = MYDIR + "\\details.txt"

HOMEDIR  = getpath( dir_mydoc, GETPATH_DIR )
#define NAME_DATADIR "." + NAME_APP
DATADIR  = HOMEDIR + NAME_DATADIR

#define OPT_VERSION "version"
#define OPT_VERSION_SHORT 'v'
#define OPT_VERSION_HELP "プログラムのバージョンを表示して終了する"
#define VERSION_APP "0.0.1"

#enum OPT_XPOS_ = 0
#define OPT_XPOS "xpos"
#define OPT_XPOS_HELP "カレンダーを表示するデスクトップ座標(X)。デフォルト:0"
OPT_XPOS_ARGDISC  = u( "整数" )

#enum OPT_YPOS_ 
#define OPT_YPOS "ypos"
#define OPT_YPOS_HELP "カレンダーを表示するデスクトップ座標(Y)。デフォルト:0"
OPT_YPOS_ARGDISC  = u( "整数" )

#enum OPT_SHOWDETAILS_ 
#define OPT_SHOWDETAILS "showdetails"
#define OPT_SHOWDETAILS_HELP "カレンダーに日付情報を表示するかどうか。\"yes\" \"y\" のいずれか、または、\"no\" \"n\" のいずれかを指定する。デフォルト:yes"
#define OPT_SHOWDETAILS_ARGDISC "YESorNO"

#enum OPT_DETAILWIDTH_ 
#define OPT_DETAILWIDTH "detailwidth"
#define OPT_DETAILWIDTH_HELP "カレンダーの日付情報表示エリアサイズ(桁)。デフォルト:0"
OPT_DETAILWIDTH_ARGDISC  = u( "整数" )

#enum OPT_DETAILHEIGHT_ 
#define OPT_DETAILHEIGHT "detailheight"
#define OPT_DETAILHEIGHT_HELP "カレンダーの日付情報表示エリアサイズ(行)。デフォルト:0"
OPT_DETAILHEIGHT_ARGDISC  = u( "整数" )

#define TITLE_WIN_CAL "Calendar"
#define TITLE_WIN_SCHE "Schedule - "

 今回のサンプルアプリケーションでのみ使われる定数を定義しています。

  • APPID
    • GtkApplicationインスタンスに設定するアプリケーションID。詳しくは、最もシンプルなGTKウィンドウのページのgtk_application_new関数の説明を見て下さい。

  • PATH_DETAILS
    • カレンダーに表示する休日情報が保存されているファイル、details.txtのパス。

  • DATADIR
    • アプリケーションで入力されたデータの保存フォルダパス。具体的には、アプリケーション使用ユーザのホームフォルダに作られる".gtk3_daily_scheduler"フォルダ。

  • OPT_VERSION ブロック 〜 OPT_DETAILHEIGHT_ ブロック
    • 各コマンドラインオプションに指定された引数を参照するための番号。およびGtkApplicationインスタンスにオプション情報を登録するためのデータ。詳細は各定数が使われるところで説明します。

  • TITLE_WIN_CAL、TITLE_WIN_SCHE
    • アプリケーションで使われるウィンドウのタイトル文字列。

  *_subroutinesパート


 今回のサンプルアプリケーションでのみ使われるサブルーチンをユーザ定義命令として定義しています。変数名の管理を楽にしたり、簡単に複数回実行できるようにする意味があります。

 register_options、set_up_calendar_window、set_up_calendarの3つはアプリケーション初期化用の処理で、プログラム内で1度しか呼び出されません。

 set_up_schedule_windowとset_up_listboxの2つは、カレンダーの日付がダブルクリックされた時、新しいウィンドウを開く必要がある場合に毎回実行されます。

register_options


*_subroutines ; このプログラム専用なので外部の命令や定数に依存しています
/* コマンドラインオプション登録 */
#module 
#deffunc register_options var app_
	// --version
	long  = OPT_VERSION@
	short  = OPT_VERSION_SHORT@
	flag  = G_OPTION_FLAG_NONE@
	arg  = G_OPTION_ARG_NONE@
	help  = u( OPT_VERSION_HELP@ )
	g_application_add_main_option@  app_, long, short, flag, arg, help, 0

	// --xpos
	long  = OPT_XPOS@
	short  = 0
	flag  = G_OPTION_FLAG_NONE@
	arg  = G_OPTION_ARG_INT@
	help  = u( OPT_XPOS_HELP@ )
	argdisc  = OPT_XPOS_ARGDISC@
	g_application_add_main_option@  app_, long, short, flag, arg, help, argdisc

	// --ypos
	long  = OPT_YPOS@
	short  = 0
	flag  = G_OPTION_FLAG_NONE@
	arg  = G_OPTION_ARG_INT@
	help  = u( OPT_YPOS_HELP@ )
	argdisc  = OPT_YPOS_ARGDISC@
	g_application_add_main_option@  app_, long, short, flag, arg, help, argdisc

	// --showdetails
	long  = OPT_SHOWDETAILS@
	short  = 0
	flag  = G_OPTION_FLAG_NONE@
	arg  = G_OPTION_ARG_STRING@
	help  = u( OPT_SHOWDETAILS_HELP@ )
	argdisc  = OPT_SHOWDETAILS_ARGDISC@
	g_application_add_main_option@  app_, long, short, flag, arg, help, argdisc

	// --detailwidth
	long  = OPT_DETAILWIDTH@
	short  = 0
	flag  = G_OPTION_FLAG_NONE@
	arg  = G_OPTION_ARG_INT@
	help  = u( OPT_DETAILWIDTH_HELP@ )
	argdisc  = OPT_DETAILWIDTH_ARGDISC@
	g_application_add_main_option@  app_, long, short, flag, arg, help, argdisc

	// --detailheight
	long  = OPT_DETAILHEIGHT@
	short  = 0
	flag  = G_OPTION_FLAG_NONE@
	arg  = G_OPTION_ARG_INT@
	help  = u( OPT_DETAILHEIGHT_HELP@ )
	argdisc  = OPT_DETAILHEIGHT_ARGDISC@
	g_application_add_main_option@  app_, long, short, flag, arg, help, argdisc
	return
#global

 GtkApplication(GApplication)インスタンスに対して各コマンドラインオプションを登録する処理で、インスタンス生成直後に呼び出されています。

  • 引数
    • app_: オプションを登録するGtkApplicationインスタンス

set_up_calendar_window


/* カレンダーウィンドウ作成 */
#module 
#deffunc set_up_calendar_window var app_, var win_
	gtk_application_window_new@  app_
	win_  = stat
	gtk_window_set_title@  win_, TITLE_WIN_CAL@

	newclbk3@  cb_win_cal_deleteevent, 3, *on_win_cal_deleteevent@, CLBKMODE_CDECL@
	g_signal_connect_data@  win_, "delete-event", cb_win_cal_deleteevent, NULL@, NULL@, NULL@
	return
#global

 カレンダーを表示するウィンドウを生成して初期化する処理です。この命令とすぐ下のset_up_calendarは、GtkApplicationインスタンスのstartupシグナルのハンドラから呼び出されています。

  • 引数
    • app_: ウィンドウを関連付けるGtkApplicationインスタンス
    • win_: 生成されたGtkApplicationWindowインスタンスが入る変数

  • gtk_application_window_new
    • GtkApplicationWindowはGtkWindowと違い、生成時に引数に指定したGtkApplicationインスタンスに属するウィンドウがすべて閉じられると、自動的にイベントループを抜けるようになっています(gtk_main_quitの呼び出しが不要)。

set_up_calendar


/* カレンダー作成 */
#module 
#deffunc set_up_calendar var cal_, int showdetails_, int detail_width_, int detail_height_
	gtk_calendar_new@
	cal_  = stat

	newclbk3@  cb_cal_dayselecteddoubleclick, 2, *on_cal_dayselecteddoubleclick@, CLBKMODE_CDECL@
	newclbk3@  cb_cal_monthchanged, 2, *on_cal_monthchanged@, CLBKMODE_CDECL@
	g_signal_connect_data@  cal_, "day-selected-double-click", cb_cal_dayselecteddoubleclick, NULL@, NULL@, NULL@
	g_signal_connect_data@  cal_, "month-changed", cb_cal_monthchanged, NULL@, NULL@, NULL@

	// "show-details"プロパティ設定
	g_object_set1@  cal_, "show-details", showdetails_, NULL@

	if showdetails_ {
		// detail情報表示エリアサイズ
		gtk_calendar_set_detail_width_chars@  cal_, detail_width_
		gtk_calendar_set_detail_height_rows@  cal_, detail_height_

		// detail情報表示ルーチン登録
		newclbk3@  cb_cal_detailfunc, 5, *cal_detailfunc@, CLBKMODE_CDECL@
		gtk_calendar_set_detail_func@  cal_, cb_cal_detailfunc, NULL@, NULL@
	}

#ifdef _debug
	gtk_calendar_get_display_options@  cal_
	otps  = stat
	mes  "GTK_CALENDAR_SHOW_HEADING: " + ( ( otps & GTK_CALENDAR_SHOW_HEADING@ ) = GTK_CALENDAR_SHOW_HEADING@ )
	mes  "GTK_CALENDAR_SHOW_DAY_NAMES: " + ( ( otps & GTK_CALENDAR_SHOW_DAY_NAMES@ ) = GTK_CALENDAR_SHOW_DAY_NAMES@ )
	mes  "GTK_CALENDAR_NO_MONTH_CHANGE: " + ( ( otps & GTK_CALENDAR_NO_MONTH_CHANGE@ ) = GTK_CALENDAR_NO_MONTH_CHANGE@ )
	mes  "GTK_CALENDAR_SHOW_WEEK_NUMBERS: " + ( ( otps & GTK_CALENDAR_SHOW_WEEK_NUMBERS@ ) = GTK_CALENDAR_SHOW_WEEK_NUMBERS@ )
	mes  "GTK_CALENDAR_SHOW_DETAILS: " + ( ( otps & GTK_CALENDAR_SHOW_DETAILS@ ) = GTK_CALENDAR_SHOW_DETAILS@ )

;	otps  |= GTK_CALENDAR_NO_MONTH_CHANGE@
;	otps  |= GTK_CALENDAR_SHOW_WEEK_NUMBERS@
;	gtk_calendar_set_display_options@  cal_, otps	; 上2つのオプションをオンに
#endif
	return
#global

 カレンダーを生成して初期化する処理です。

  • 引数
    • cal_: 生成されたGtkCalenderインスタンスが入る変数
    • showdetails_: カレンダー上で各日付の詳細情報(detail)を表示するかどうかを表す真偽値。ページ冒頭のキャプチャ画像に表示あり・なし両方のウィンドウが含まれています。詳細情報とは、今回のサンプルで言うと、details.txtに保存されているテキストのことです。
    • detail_width_: 各日付の詳細情報を表示するエリアの横幅
    • detail_height_:各日付の詳細情報を表示するエリアの縦幅

  • g_object_set
    • GObjectライブラリの関数のひとつ。GObjectを継承したクラスのインスタンスに対して任意のプロパティを書き換えることができる。
    • この関数は、書き換えるプロパティ名と値を可変長引数として任意の数指定できる。サンプルソースでは、1ペア(2個)だけ指定できるg_object_setを"g_object_set1"という名前で登録しておいてそれを呼び出している。
    • 引数
      • p1: 対象のインスタンス
      • p2〜: 書き換えるプロパティ名と値を任意の数指定
      • 最後の引数: 終わりの目印として0を渡す

  • gtk_calendar_set_detail_width_chars、gtk_calendar_set_detail_height_rows
    • GTK+関連のインスタンスのプロパティを読み書きするもう一つの手段として、例えばこの2つのような各クラス専用の関数があります。

  • gtk_calendar_set_detail_func
    • GtkCalenderインスタンスに対して、各日付の詳細情報を返すコールバック関数を登録するための関数。
    • 引数
      • p1: 対象のインスタンス
      • p2: コールバック関数のポインタ。サンプルでは、newclbk3命令で取得した値。
      • p3: コールバック関数呼び出し時に利用したい変数のポインタを指定する
      • p4: ネットで見つけたサンプルを見る限り、基本NULL(0)で良いようです
    • 登録するコールバック関数で何をすればいいのかというと、引数として渡されてくる日付の下に表示したい文字列を用意して、g_strdup関数でコピーした上でそのポインタをreturnします。要は、このコールバック関数が呼ばれる=GtkCalenderインスタンスが「この日付の下に表示してほしいテキストがあったらそのポインタをくれ」と言っているということです。ただこのイベントだけがシグナルになっていないのが謎ですが……
    • コールバック関数は_other_callback_functionsパートで定義しているのでそちらの説明も読んで下さい。

  • gtk_calendar_get_display_options、gtk_calendar_set_display_options
    • GtkCalenderインスタンスのカレンダー表示に関わるプロパティをまとめて読み書きできる関数です。

set_up_schedule_window


/* 日別スケジュールウィンドウ作成 */
#module 
#deffunc set_up_schedule_window var app_, var win_
	gtk_application_window_new@  app_
	win_  = stat
	gtk_window_set_title@  win_, TITLE_WIN_SCHE@

	newclbk3@  cb_win_sche_deleteevent, 3, *on_win_sche_deleteevent@, CLBKMODE_CDECL@
	g_signal_connect_data@  win_, "delete-event", cb_win_sche_deleteevent, NULL@, NULL@, NULL@
	return
#global

 カレンダーの各日付をダブルクリックした時に表示するウィンドウを生成して初期化する処理です。

set_up_listbox


/* スケジュールリストボックス作成 */
#module 
#deffunc set_up_listbox var lbox_, array entries_
	gtk_list_box_new@
	lbox_  = stat

	repeat 24
		gtk_box_new@  GTK_ORIENTATION_HORIZONTAL@, 5
		box  = stat
	
		gtk_label_new@ strf( "%02d", cnt ) + ":00"
		lbl  = stat
	
		gtk_entry_new@
		entries_( cnt )  = stat
		gtk_widget_set_size_request@  entries_( cnt ), 500, -1
	
		gtk_box_pack_start@  box, lbl, FALSE@, FALSE@, 0
		gtk_box_pack_start@  box, entries_( cnt ), TRUE@, TRUE@, 0
		gtk_list_box_insert@  lbox_, box, -1
	loop
	return
#global

 スケジュールウィンドウに配置するリストボックスを生成して初期化する処理です。

update_data_file_list


/* データファイルリストを更新 */
#module 
#deffunc update_data_file_list var file_list_
	chdir  DATADIR@
	dirlist  file_list_, "*.txt"

#ifdef _debug
	notesel  file_list_
	mes  "dirlist: " + notemax
	noteunsel
#endif
	return
#global

 アプリケーションのユーザが入力したデータを保存したファイルのリストを(再)作成する処理です。

mark_scheduled_days


/* カレンダーの予定が入力済みの日をマーク(太字化) */
#module 
#deffunc mark_scheduled_days int cal_, var file_list_
	gtk_calendar_get_date@  cal_, varptr( year_sel ), varptr( month_sel ), varptr( day_sel )
	gtk_calendar_clear_marks@ cal_	; マークを一度クリア

	// 現在表示している年月のデータファイルが存在する日だけをマーク
	notesel  file_list_
	repeat notemax
		noteget  name, cnt
		date  = getpath( name, GETPATH_NAME@ )
		year  = int( strmid( date, 0, 4 ) )
		month  = int( strmid( date, 4, 2 ) ) - 1
		day  = int( strmid( date, 6, 2 ) )
		if year ! year_sel : continue
		if month ! month_sel : continue
		gtk_calendar_mark_day@  cal_, day
	loop
	noteunsel
	return
#global

 カレンダー上で、予定(アプリケーションのユーザが入力したデータ)が存在する日をマーク(太字化)する処理です。

  *_class_modulesパート


 ラベル名の"class"は俺用語で、「データとそれを扱う手続きをひとまとめにしたもののひな形」程度の意味です。今から思うとモジュール変数を直訳したmodule variablesでも良かったかもしれません。

  スケジュール入力ウィンドウ モジュール


*_class_modules ; このプログラム専用なので外部の命令や定数に依存しています
/*
*  日別スケジュールウィンドウ
 */
#module win_sche _win, _entries, _year, _month, _day, _filepath

 今回のサンプルアプリケーションでのみ使われる、ユーザが予定を入力するウィンドウを表すモジュール変数を定義しています。

初期化命令


/* ウィンドウ作成 */
#modinit var app_, int year_, int month_, int day_
	_year  = year_
	_month  = month_
	_day  = day_
	_filepath  = DATADIR@ + "\\"
	_filepath  += strf( "%04d", _year ) + strf( "%02d", _month ) + strf( "%02d", _day ) + ".txt"
	mes  "datafilepath: " + _filepath

	set_up_schedule_window@  app_, _win
	set_up_listbox@  lbox, _entries
	load@win_sche  thismod
	gtk_container_add@  _win, lbox
	gtk_window_set_title@  _win, TITLE_WIN_SCHE@ + _year + "/" + _month + "/" + _day
	gtk_widget_show_all@  _win
	return


load@win_sche


/* 予定データ読み込み */
#modfunc load@win_sche
	exist  _filepath
	if strsize = EXIST_NOTEXIST@ {
		buf  = ""
	}
	else {
		load_note@  buf, _filepath
	}
	if buf = "" : return

	notesel  buf
	repeat 24
		noteget  linestr, cnt
		linestr  = u( linestr )	; 文字コードをutf-8に
		if strlen( linestr ) {
			gtk_entry_set_text@  _entries( cnt ), linestr
		}
	loop
	noteunsel
	return 


comp_date@win_sche


/* 日付確認(比較) */
#modcfunc comp_date@win_sche int year_, int month_, int day_
	if year_ ! _year : return FALSE@
	if month_ ! _month : return FALSE@
	if day_ ! _day : return FALSE@
	return TRUE@


equal@win_sche


/* 同じウィンドウか確認 */
#modcfunc equal@win_sche var win_
	if win_ = _win : return TRUE@
	return FALSE@


activate@win_sche


/* ウィンドウアクティブ化 */
#modfunc activate@win_sche
	gtk_window_present@  _win
	return


close@win_sche


/* プログラムからウィンドウを閉じる */
#modfunc close@win_sche
	gtk_window_close@  _win
	return


save@win_sche


/* 予定データ保存 */
#modfunc save@win_sche
	// 予定が書き込まれているかチェックして保存
	buf  = ""
	repeat 24
		gtk_entry_get_text@  _entries( cnt )
		ptr  = stat
		dupptr  text, ptr, 1, VARTYPE_STR@
		buf  += s( text ) + "\n"	; 文字コードをshift-jisに
	loop

	if strlen( buf ) = 48 {	; 予定なし
		exist  _filepath
		if strsize > EXIST_NOTEXIST@ {
			delete  _filepath
		}
	}
	else {
		save_note@  buf, _filepath
	}
	return
#global


  重要な変数リスト


	; 重要な変数リスト
	; 	_options( OPT_XPOS_ ) : (オプション引数)カレンダーを表示するデスクトップ座標(X)
	; 	_options( OPT_YPOS_ ) : (オプション引数)カレンダーを表示するデスクトップ座標(Y)
	; 	_options( OPT_SHOWDETAILS_ ) : (オプション引数)カレンダーに日付情報(details.txtの内容)を表示するかどうか
	; 	_options( OPT_DETAILWIDTH_ ) : (オプション引数)カレンダーの日付情報表示エリアサイズ(桁)
	; 	_options( OPT_DETAILHEIGHT_ ) : (オプション引数)カレンダーの日付情報表示エリアサイズ(行)
	; 	_app : GtkApplicationインスタンス
	; 	_cal : GtkCalendarインスタンス
	; 	_details : カレンダーの日付情報(details.txtの内容)
	; 	_file_list : 保存済みデータファイルのリスト(ノートパッド形式)
	; 	_wins_sche : 日別スケジュールウィンドウリスト(モジュール変数)


  *_mainパート


*_main
#ifdef _debug
	mes  "get args"
#endif
	getmainargs  argc, argv, env, sinfo	; argc, argvを取得。env, sinfoはこのプログラムでは使わない

#ifdef _debug
	mes  "init app"
#endif
	gtk_application_new  APPID, G_APPLICATION_FLAGS_NONE
	_app  = stat
	register_options  _app

#ifdef _debug
	mes  "register app signal handlers"
#endif
	newclbk3  cb_app_handlelocaloptions, 3, *on_app_handlelocaloptions, CLBKMODE_CDECL
	newclbk3  cb_app_startup, 2, *on_app_startup, 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

#ifdef _debug
	mes  "start app"
#endif
	g_application_run  _app, argc, argv
	status  = stat

#ifdef _debug
	mes  "exit " + status : stop
#endif
	g_object_unref  _app
	end status


  *_signal_handlersパート

今回のサンプルアプリケーションで使われるシグナルハンドラの定義です。

*on_app_handlelocaloptions


*_signal_handlers

*on_app_handlelocaloptions
#ifdef _debug
	mes  "signal: app - handle-local-options"
#endif
	clbkargprotect  args
	options_  = args( 1 )

	// --version
	g_variant_dict_contains  options_, OPT_VERSION
	if stat {
		mes NAME_APP + " version " + VERSION_APP
		return 0 ; exit
	}

	// --xpos
	_options( OPT_XPOS_ )  = 0
	g_variant_dict_lookup  options_, OPT_XPOS, "i", varptr( optarg )
	if stat {
		_options( OPT_XPOS_ )  = optarg
		mes OPT_XPOS + ": " + _options( OPT_XPOS_ )
	}
	// --ypos
	_options( OPT_YPOS_ )  = 0
	g_variant_dict_lookup  options_, OPT_YPOS, "i", varptr( optarg )
	if stat {
		_options( OPT_YPOS_ )  = optarg
		mes OPT_YPOS + ": " + _options( OPT_YPOS_ )
	}

	// --showdetails
	g_variant_dict_lookup  options_, OPT_SHOWDETAILS, "s", varptr( optarg )
	if stat {
		dupptr  text, optarg, 1, VARTYPE_STR
		if text = "no" | text = "n" {
			_options( OPT_SHOWDETAILS_ )  = FALSE
		}
		else {
			_options( OPT_SHOWDETAILS_ )  = TRUE
		}
	}
	else {
		_options( OPT_SHOWDETAILS_ )  = TRUE
	}
	mes OPT_SHOWDETAILS + ": " + _options( OPT_SHOWDETAILS_ )

	// --detailwidth
	_options( OPT_DETAILWIDTH_ )  = 0
	g_variant_dict_lookup  options_, OPT_DETAILWIDTH, "i", varptr( optarg )
	if stat {
		_options( OPT_DETAILWIDTH_ )  = optarg
		mes OPT_DETAILWIDTH + ": " + _options( OPT_DETAILWIDTH_ )
	}
	// --detailheight
	_options( OPT_DETAILHEIGHT_ )  = 0
	g_variant_dict_lookup  options_, OPT_DETAILHEIGHT, "i", varptr( optarg )
	if stat {
		_options( OPT_DETAILHEIGHT_ )  = optarg
		mes OPT_DETAILHEIGHT + ": " + _options( OPT_DETAILHEIGHT_ )
	}
	return -1 ; don't exit


*on_app_startup


*on_app_startup
#ifdef _debug
	mes  "signal: app - startup"
#endif
	clbkargprotect  args
	app_  = args( 0 )

	// GTK+のデフォルトGUIフォントを変更
	set_default_gui_font  "meiryo", 12

	// detail.txt読み込み
	_details  = ""
	exist  PATH_DETAILS
	if strsize > EXIST_NOTEXIST {
		load_note  _details, PATH_DETAILS
	}

	// データフォルダ確認
	if existdir( DATADIR ) : goto *@f
	mkdir  DATADIR
	mes  "mkdir: " + DATADIR
*@

	// データファイルリストを更新
	update_data_file_list  _file_list

	// カレンダーウィンドウ作成
	set_up_calendar_window  app_, win
	set_up_calendar  _cal, _options( OPT_SHOWDETAILS_ ), _options( OPT_DETAILWIDTH_ ), _options( OPT_DETAILHEIGHT_ )
	gtk_container_add  win, _cal

	// カレンダーのマークを更新
	mark_scheduled_days  _cal, _file_list

	// カレンダーウィンドウ表示
	gtk_window_move@  win, _options( OPT_XPOS_ ), _options( OPT_YPOS_ )
	gtk_widget_show_all  win
	return


*on_win_cal_deleteevent


*on_win_cal_deleteevent
#ifdef _debug
	mes  "signal: win_cal - delete-event"
#endif
	clbkargprotect  args

;	// 意思確認サンプル
;	dialog  "プログラムを終了しますか?", DLG_TYPE_STD_YESNO, "確認"
;	if stat = DLG_RESULT_NO {
;		return TRUE ; do not destroy window
;	}

	// すべてのスケジュールウィンドウを閉じる
	if vartype( _wins_sche ) = VARTYPE_MOD {
		foreach _wins_sche
			close@win_sche  _wins_sche( cnt )
		loop
	}
	return FALSE


*on_cal_dayselecteddoubleclick


*on_cal_dayselecteddoubleclick
#ifdef _debug
	mes  "signal: cal - day-selected-double-click"
#endif
	clbkargprotect  args
	cal_  = args( 0 )

	// ダブルクリックされた日付のスケジュールウィンドウが
	// ウィンドウリストになければ作成、あればアクティブ化
	gtk_calendar_get_date  cal_, varptr( year ), varptr( month ), varptr( day )
	month  ++

	flag  = FALSE
	if vartype( _wins_sche ) = VARTYPE_MOD {
		foreach _wins_sche
			if comp_date@win_sche( _wins_sche( cnt ), year, month, day ) {
				activate@win_sche  _wins_sche( cnt )
				flag  = TRUE
				break
			}
		loop
	}
	if flag = FALSE {
		newmod  _wins_sche, win_sche, _app, year, month, day
	}
	return


*on_cal_monthchanged


*on_cal_monthchanged
#ifdef _debug
	mes  "signal: cal - month-changed"
#endif
	clbkargprotect  args
	cal_  = args( 0 )

	// カレンダーのマークを更新
	mark_scheduled_days  cal_, _file_list
	return


*on_win_sche_deleteevent


*on_win_sche_deleteevent
#ifdef _debug
	mes  "signal: win_sche - delete-event"
#endif
	clbkargprotect  args
	win_  = args( 0 )

	// スケジュールウィンドウリスト更新
	foreach _wins_sche
		if equal@win_sche( _wins_sche( cnt ), win_ ) {	; 今回閉じるウィンドウを見つけたら
			save@win_sche  _wins_sche( cnt )	; 書き込まれた予定を保存
			delmod  _wins_sche( cnt )
			break
		}
	loop

	// データファイルリストを更新
	update_data_file_list  _file_list

	// カレンダーのマークを更新
	mark_scheduled_days  _cal, _file_list
	return FALSE


  *_other_callback_functionsパート

今回のサンプルアプリケーションで必要な、シグナルハンドラ以外のコールバック関数の定義です。

*cal_detailfunc


*_other_callback_functions

/*
*  日付に応じたdetail(detail.txtに記述されている内容)を返す
 */
*cal_detailfunc
;#ifdef _debug
;	mes  "cal_detailfunc"
;#endif
	clbkargprotect  args
	year_  = args( 1 )
	month_  = args( 2 ) + 1
	day_  = args( 3 )

	detail  = ""
	notesel  _details
	repeat notemax
		noteget  linestr, cnt
		if strlen( linestr ) < 10 : continue
	
		if year_ ! int( strmid( linestr, 0, 4 ) ) : continue
		if month_ ! int( strmid( linestr, 4, 2 ) ) : continue
		if day_ ! int( strmid( linestr, 6, 2 ) ) : continue
	
		getstr  detail, linestr, 9
		detail  = u( detail )
		break
	loop
	noteunsel

	if detail ! "" {
		g_strdup  detail
		return stat
	}
	return NULL


参考にしたページ

最終更新時間:2016年10月07日 02時50分40秒