[PR] 創価の正体を知るための情報ページ
- このページの目次
- アプリケーションの機能
- ソーススクリプトのダウンロード
- メインのスクリプトとその説明
- 参考にしたページ
アプリケーションの機能
カレンダーの日付をダブルクリックすると、その日のスケジュールを入力・閲覧するためのウィンドウが表示されます。入力したデータは、スケジュールウィンドウを閉じた時、もしくはアプリケーションを終了した(カレンダーウィンドウを閉じた)時に、ユーザのホームフォルダ内の".gtk3_daily_scheduler"フォルダに保存されます。
一応--versionオプションおよび--helpオプションに対応していますが、"hsp3cl"ランタイムでコンパイルした時のみ有効になります。
ソーススクリプトのダウンロード
gtk3_daily_scheduler_20160921.zip(259)
メインのスクリプトとその説明
名前が"_"で始まるラベルについて
これらのラベルはコーディング中の目印として置いたもので、スクリプトからは利用されていません。
冒頭コメント
/*
* 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秒
このページにリンクしているページ: HSP製サンプルGTKアプリケーション