Skip to main content

aviutl2_sys/
plugin2.rs

1#![allow(non_snake_case, non_camel_case_types, non_upper_case_globals)]
2
3use crate::common::LPCWSTR;
4use crate::{
5    filter2::FILTER_PLUGIN_TABLE, input2::INPUT_PLUGIN_TABLE, module2::SCRIPT_MODULE_TABLE,
6    output2::OUTPUT_PLUGIN_TABLE,
7};
8use std::ffi::c_void;
9use std::os::raw::c_char;
10
11pub use windows_sys::Win32::Foundation::{HINSTANCE, HWND};
12
13pub type LPCSTR = *const c_char;
14
15/// オブジェクトハンドル
16pub type OBJECT_HANDLE = *mut c_void;
17
18/// レイヤー・フレーム情報構造体
19/// フレーム番号、レイヤー番号が0からの番号になります ※UI表示と異なります
20#[repr(C)]
21pub struct OBJECT_LAYER_FRAME {
22    /// レイヤー番号
23    pub layer: i32,
24    /// 開始フレーム番号
25    pub start: i32,
26    /// 終了フレーム番号
27    pub end: i32,
28}
29
30/// メディア情報構造体
31#[repr(C)]
32pub struct MEDIA_INFO {
33    /// Videoトラック数 ※0ならVideo無し
34    pub video_track_num: i32,
35    /// Audioトラック数 ※0ならAudio無し
36    pub audio_track_num: i32,
37    /// 総時間 ※静止画の場合は0
38    pub total_time: f64,
39    /// 解像度
40    pub width: i32,
41    /// 解像度
42    pub height: i32,
43}
44
45/// モジュール情報構造体
46#[repr(C)]
47pub struct MODULE_INFO {
48    pub r#type: i32,
49    pub name: LPCWSTR,
50    pub information: LPCWSTR,
51}
52
53impl MODULE_INFO {
54    /// フィルタスクリプト
55    pub const TYPE_SCRIPT_FILTER: i32 = 1;
56    /// オブジェクトスクリプト
57    pub const TYPE_SCRIPT_OBJECT: i32 = 2;
58    /// カメラスクリプト
59    pub const TYPE_SCRIPT_CAMERA: i32 = 3;
60    /// トラックバースクリプト
61    pub const TYPE_SCRIPT_TRACK: i32 = 4;
62    /// スクリプトモジュール
63    pub const TYPE_SCRIPT_MODULE: i32 = 5;
64    /// 入力プラグイン
65    pub const TYPE_PLUGIN_INPUT: i32 = 6;
66    /// 出力プラグイン
67    pub const TYPE_PLUGIN_OUTPUT: i32 = 7;
68    /// フィルタプラグイン
69    pub const TYPE_PLUGIN_FILTER: i32 = 8;
70    /// 汎用プラグイン
71    pub const TYPE_PLUGIN_COMMON: i32 = 9;
72}
73
74/// 編集情報構造体
75/// フレーム番号、レイヤー番号が0からの番号になります ※UI表示と異なります
76#[repr(C)]
77pub struct EDIT_INFO {
78    /// シーンの解像度
79    pub width: i32,
80    /// シーンの解像度
81    pub height: i32,
82    /// シーンのフレームレート
83    pub rate: i32,
84    /// シーンのフレームレート
85    pub scale: i32,
86    /// シーンのサンプリングレート
87    pub sample_rate: i32,
88    /// 現在のカーソルのフレーム番号
89    pub frame: i32,
90    /// 現在の選択レイヤー番号
91    pub layer: i32,
92    /// オブジェクトが存在する最大のフレーム番号
93    pub frame_max: i32,
94    /// オブジェクトが存在する最大のレイヤー番号
95    pub layer_max: i32,
96    /// レイヤー編集で表示されているフレームの開始番号
97    pub display_frame_start: i32,
98    /// レイヤー編集で表示されているレイヤーの開始番号
99    pub display_layer_start: i32,
100    /// レイヤー編集で表示されているフレーム数 ※厳密ではないです
101    pub display_frame_num: i32,
102    /// レイヤー編集で表示されているレイヤー数 ※厳密ではないです
103    pub display_layer_num: i32,
104    /// フレーム範囲選択の開始フレーム番号 ※未選択の場合は-1
105    pub select_range_start: i32,
106    /// フレーム範囲選択の終了フレーム番号 ※未選択の場合は-1
107    pub select_range_end: i32,
108    /// グリッド(BPM)のテンポ
109    pub grid_bpm_tempo: f32,
110    /// グリッド(BPM)の拍子
111    pub grid_bpm_beat: i32,
112    /// グリッド(BPM)の基準時間
113    pub grid_bpm_offset: f32,
114    /// シーンのID
115    pub scene_id: i32,
116}
117
118/// 編集セクション構造体
119/// メニュー選択やプロジェクト編集のコールバック関数内で利用出来ます
120/// フレーム番号、レイヤー番号が0からの番号になります ※UI表示と異なります
121#[repr(C)]
122pub struct EDIT_SECTION {
123    /// 編集情報
124    pub info: *mut EDIT_INFO,
125
126    /// 指定の位置にオブジェクトエイリアスを作成します
127    /// alias : オブジェクトエイリアスデータ(UTF-8)へのポインタ
128    ///      オブジェクトエイリアスファイルと同じフォーマットになります
129    /// layer : 作成するレイヤー番号
130    /// frame : 作成するフレーム番号
131    /// length : オブジェクトのフレーム数 ※エイリアスデータにフレーム情報がある場合はフレーム情報から長さが設定されます
132    ///      フレーム数に0を指定した場合は長さや追加位置が自動調整されます
133    /// 戻り値 : 作成したオブジェクトのハンドル (失敗した場合はnullptrを返却)
134    ///      既に存在するオブジェクトに重なったり、エイリアスデータが不正な場合に失敗します
135    ///      複数オブジェクトのエイリアスデータの場合は先頭のオブジェクトのハンドルが返却されます ※オブジェクトは全て作成されます
136    pub create_object_from_alias:
137        unsafe extern "C" fn(alias: LPCSTR, layer: i32, frame: i32, length: i32) -> OBJECT_HANDLE,
138
139    /// 指定のフレーム番号以降にあるオブジェクトを検索します
140    /// layer : 検索対象のレイヤー番号
141    /// frame : 検索を開始するフレーム番号
142    /// 戻り値 : 検索したオブジェクトのハンドル (見つからない場合はnullptrを返却)
143    pub find_object: unsafe extern "C" fn(layer: i32, frame: i32) -> OBJECT_HANDLE,
144
145    /// オブジェクトに対象エフェクトが何個存在するかを取得します
146    /// object : オブジェクトのハンドル
147    /// effect : 対象のエフェクト名 (エイリアスファイルのeffect.nameの値)
148    /// 戻り値 : 対象エフェクトの数 ※存在しない場合は0
149    pub count_object_effect: unsafe extern "C" fn(object: OBJECT_HANDLE, effect: LPCWSTR) -> i32,
150
151    /// オブジェクトのレイヤー・フレーム情報を取得します
152    /// object : オブジェクトのハンドル
153    /// 戻り値 : オブジェクトのレイヤー・フレーム情報
154    pub get_object_layer_frame: unsafe extern "C" fn(object: OBJECT_HANDLE) -> OBJECT_LAYER_FRAME,
155
156    /// オブジェクトのエイリアスデータを取得します
157    /// object : オブジェクトのハンドル
158    /// 戻り値 : オブジェクトエイリアスデータ(UTF-8)へのポインタ (取得出来ない場合はnullptrを返却)
159    ///      オブジェクトエイリアスファイルと同じフォーマットになります
160    ///      ※次に文字列返却の関数を使うかコールバック処理の終了まで有効
161    pub get_object_alias: unsafe extern "C" fn(object: OBJECT_HANDLE) -> LPCSTR,
162
163    /// オブジェクトの設定項目の値を文字列で取得します
164    /// object : オブジェクトのハンドル
165    /// effect : 対象のエフェクト名 (エイリアスファイルのeffect.nameの値)
166    ///          同じエフェクトが複数ある場合は":n"のサフィックスでインデックス指定出来ます (nは0からの番号)
167    ///          get_object_item_value(object, L"ぼかし:1", L"範囲"); // 2個目のぼかしを対象とする
168    /// item  : 対象の設定項目の名称 (エイリアスファイルのキーの名称)
169    /// 戻り値 : 取得した設定値(UTF8)へのポインタ (取得出来ない場合はnullptrを返却)
170    ///      エイリアスファイルの設定値と同じフォーマットになります
171    ///      ※次に文字列返却の関数を使うかコールバック処理の終了まで有効
172    pub get_object_item_value:
173        unsafe extern "C" fn(object: OBJECT_HANDLE, effect: LPCWSTR, item: LPCWSTR) -> LPCSTR,
174
175    /// オブジェクトの設定項目の値を文字列で設定します
176    /// object : オブジェクトのハンドル
177    /// effect : 対象のエフェクト名 (エイリアスファイルのeffect.nameの値)
178    ///          同じエフェクトが複数ある場合は":n"のサフィックスでインデックス指定出来ます (nは0からの番号)
179    ///          set_object_item_value(object, L"ぼかし:1", L"範囲", "1"); // 2個目のぼかしを対象とする
180    /// item  : 対象の設定項目の名称 (エイリアスファイルのキーの名称)
181    /// value : 設定値(UTF8)
182    ///      エイリアスファイルの設定値と同じフォーマットになります
183    /// 戻り値 : 設定出来た場合はtrue (対象が見つからない場合は失敗します)
184    pub set_object_item_value: unsafe extern "C" fn(
185        object: OBJECT_HANDLE,
186        effect: LPCWSTR,
187        item: LPCWSTR,
188        value: LPCSTR,
189    ) -> bool,
190
191    /// オブジェクトを移動します
192    /// object : オブジェクトのハンドル
193    /// layer : 移動先のレイヤー番号
194    /// frame : 移動先のフレーム番号
195    /// 戻り値 : 移動した場合はtrue (移動先にオブジェクトが存在する場合は失敗します)
196    pub move_object: unsafe extern "C" fn(object: OBJECT_HANDLE, layer: i32, frame: i32) -> bool,
197
198    /// オブジェクトを削除します
199    /// object : オブジェクトのハンドル
200    pub delete_object: unsafe extern "C" fn(object: OBJECT_HANDLE),
201
202    /// オブジェクト設定ウィンドウで選択されているオブジェクトのハンドルを取得します
203    /// 戻り値 : オブジェクトのハンドル (未選択の場合はnullptrを返却)
204    pub get_focus_object: unsafe extern "C" fn() -> OBJECT_HANDLE,
205
206    /// オブジェクト設定ウィンドウで選択するオブジェクトを設定します (コールバック処理の終了時に設定されます)
207    /// object : オブジェクトのハンドル
208    pub set_focus_object: unsafe extern "C" fn(object: OBJECT_HANDLE),
209
210    /// プロジェクトファイルのポインタを取得します
211    /// EDIT_HANDLE : 編集ハンドル
212    /// 戻り値 : プロジェクトファイル構造体へのポインタ ※コールバック処理の終了まで有効
213    pub get_project_file: unsafe extern "C" fn(edit: *mut EDIT_HANDLE) -> *mut PROJECT_FILE,
214
215    /// 選択中オブジェクトのハンドルを取得します
216    /// index : 選択中オブジェクトのインデックス(0〜)
217    /// 戻り値 : 指定インデックスのオブジェクトのハンドル (インデックスが範囲外の場合はnullptrを返却)
218    pub get_selected_object: unsafe extern "C" fn(index: i32) -> OBJECT_HANDLE,
219
220    /// 選択中オブジェクトの数を取得します
221    /// 戻り値 : 選択中オブジェクトの数
222    pub get_selected_object_num: unsafe extern "C" fn() -> i32,
223
224    /// マウス座標のレイヤー・フレーム位置を取得します
225    /// 最後のマウス移動のウィンドウメッセージの座標から計算します
226    /// layer : レイヤー番号の格納先
227    /// frame : フレーム番号の格納先
228    /// 戻り値 : マウス座標がレイヤー編集上の場合はtrue
229    pub get_mouse_layer_frame: unsafe extern "C" fn(layer: *mut i32, frame: *mut i32) -> bool,
230
231    /// 指定のスクリーン座標のレイヤー・フレーム位置を取得します
232    /// x,y   : 対象のスクリーン座標
233    /// layer : レイヤー番号の格納先
234    /// frame : フレーム番号の格納先
235    /// 戻り値 : スクリーン座標がレイヤー編集上の場合はtrue
236    pub pos_to_layer_frame:
237        unsafe extern "C" fn(x: i32, y: i32, layer: *mut i32, frame: *mut i32) -> bool,
238
239    /// 指定のメディアファイルがサポートされているかを確認します
240    /// file   : メディアファイルのパス
241    /// strict : trueの場合は実際に読み込めるかを確認します
242    ///      falseの場合は拡張子が対応しているかを確認します
243    /// 戻り値 : サポートされている場合はtrue
244    pub is_support_media_file: unsafe extern "C" fn(file: LPCWSTR, strict: bool) -> bool,
245
246    /// 指定のメディアファイルの情報を取得します ※動画、音声、画像ファイル以外では取得出来ません
247    /// file : メディアファイルのパス
248    /// info : メディア情報の格納先へのポインタ
249    /// info_size : メディア情報の格納先のサイズ ※MEDIA_INFOと異なる場合はサイズ分のみ取得されます
250    /// 戻り値 : 取得出来た場合はtrue
251    pub get_media_info:
252        unsafe extern "C" fn(file: LPCWSTR, info: *mut MEDIA_INFO, info_size: i32) -> bool,
253
254    /// 指定の位置にメディアファイルからオブジェクトを作成します
255    /// file  : メディアファイルのパス
256    /// layer : 作成するレイヤー番号
257    /// frame : 作成するフレーム番号
258    /// length : オブジェクトのフレーム数
259    ///      フレーム数に0を指定した場合は長さや追加位置が自動調整されます
260    /// 戻り値 : 作成したオブジェクトのハンドル (失敗した場合はnullptrを返却)
261    ///      既に存在するオブジェクトに重なったり、メディアファイルに対応していない場合は失敗します
262    pub create_object_from_media_file:
263        unsafe extern "C" fn(file: LPCWSTR, layer: i32, frame: i32, length: i32) -> OBJECT_HANDLE,
264
265    /// 指定の位置にオブジェクトを作成します
266    /// effect : エフェクト名 (エイリアスファイルのeffect.nameの値)
267    /// layer : 作成するレイヤー番号
268    /// frame : 作成するフレーム番号
269    /// length : オブジェクトのフレーム数
270    ///      フレーム数に0を指定した場合は長さや追加位置が自動調整されます
271    /// 戻り値 : 作成したオブジェクトのハンドル (失敗した場合はnullptrを返却)
272    ///      既に存在するオブジェクトに重なったり、指定エフェクトに対応していない場合は失敗します
273    pub create_object:
274        unsafe extern "C" fn(effect: LPCWSTR, layer: i32, frame: i32, length: i32) -> OBJECT_HANDLE,
275
276    /// 現在のレイヤー・フレーム位置を設定します ※設定出来る範囲に調整されます
277    /// layer : レイヤー番号
278    /// frame : フレーム番号
279    pub set_cursor_layer_frame: unsafe extern "C" fn(layer: i32, frame: i32),
280
281    /// レイヤー編集のレイヤー・フレームの表示開始位置を設定します ※設定出来る範囲に調整されます
282    /// layer : 表示開始レイヤー番号
283    /// frame : 表示開始フレーム番号
284    pub set_display_layer_frame: unsafe extern "C" fn(layer: i32, frame: i32),
285
286    /// フレーム範囲選択を設定します ※設定出来る範囲に調整されます
287    /// start,end : 開始終了フレーム番号
288    ///      開始終了フレームの両方に-1を指定すると選択を解除します
289    pub set_select_range: unsafe extern "C" fn(start: i32, end: i32),
290
291    /// グリッド(BPM)を設定します
292    /// tempo : テンポ
293    /// beat  : 拍子
294    /// offset : 基準時間
295    pub set_grid_bpm: unsafe extern "C" fn(tempo: f32, beat: i32, offset: f32),
296
297    /// オブジェクト名を取得します
298    /// object : オブジェクトのハンドル
299    /// 戻り値 : オブジェクト名へのポインタ (標準の名前の場合はnullptrを返却)
300    ///      ※オブジェクトの編集をするかコールバック処理の終了まで有効
301    pub get_object_name: unsafe extern "C" fn(object: OBJECT_HANDLE) -> LPCWSTR,
302
303    /// オブジェクト名を設定します
304    /// object : オブジェクトのハンドル
305    /// name : オブジェクト名 (nullptrか空文字を指定すると標準の名前になります)
306    pub set_object_name: unsafe extern "C" fn(object: OBJECT_HANDLE, name: LPCWSTR),
307}
308
309/// 編集ハンドル構造体
310#[repr(C)]
311pub struct EDIT_HANDLE {
312    /// プロジェクトデータの編集をする為のコールバック関数(func_proc_edit)を呼び出します
313    /// 編集情報を排他制御する為にコールバック関数内で編集処理をする形になります
314    /// コールバック関数内で編集したオブジェクトは纏めてUndoに登録されます
315    /// コールバック関数はメインスレッドから呼ばれます
316    /// func_proc_edit : 編集処理のコールバック関数
317    /// 戻り値   : trueなら成功
318    ///        編集が出来ない場合(出力中等)に失敗します
319    pub call_edit_section:
320        unsafe extern "C" fn(func_proc_edit: unsafe extern "C" fn(edit: *mut EDIT_SECTION)) -> bool,
321
322    /// call_edit_section()に引数paramを渡せるようにした関数です
323    pub call_edit_section_param: unsafe extern "C" fn(
324        param: *mut c_void,
325        func_proc_edit: unsafe extern "C" fn(param: *mut c_void, edit: *mut EDIT_SECTION),
326    ) -> bool,
327
328    /// 編集情報を取得します
329    /// 既に編集処理中(EDIT_SECTIONが引数のコールバック関数内等)の場合は利用出来ません ※デッドロックします
330    /// info : 編集情報の格納先へのポインタ
331    /// info_size : 編集情報の格納先のサイズ ※EDIT_INFOと異なる場合はサイズ分のみ取得されます
332    pub get_edit_info: unsafe extern "C" fn(info: *mut EDIT_INFO, info_size: i32),
333
334    /// ホストアプリケーションを再起動します
335    pub restart_host_app: unsafe extern "C" fn(),
336
337    /// エフェクト名の一覧をコールバック関数(func_proc_enum_effect)で取得します
338    /// param : 任意のユーザーデータのポインタ
339    /// func_proc_enum_effect : エフェクト名の取得処理のコールバック関数
340    pub enum_effect_name: unsafe extern "C" fn(
341        param: *mut c_void,
342        func_proc_enum_effect: unsafe extern "C" fn(
343            param: *mut c_void,
344            name: LPCWSTR,
345            r#type: i32,
346            flag: i32,
347        ),
348    ),
349
350    /// モジュール情報の一覧をコールバック関数(func_proc_enum_module)で取得します
351    /// param : 任意のユーザーデータのポインタ
352    /// func_proc_enum_module : モジュール情報の取得処理のコールバック関数
353    pub enum_module_info: unsafe extern "C" fn(
354        param: *mut c_void,
355        func_proc_enum_module: unsafe extern "C" fn(param: *mut c_void, info: *mut MODULE_INFO),
356    ),
357}
358
359impl EDIT_HANDLE {
360    /// エフェクト種別:フィルタ効果 ※今後追加される可能性があります
361    pub const EFFECT_TYPE_FILTER: i32 = 1;
362    /// エフェクト種別:メディア入力 ※今後追加される可能性があります
363    pub const EFFECT_TYPE_INPUT: i32 = 2;
364    /// エフェクト種別:シーンチェンジ ※今後追加される可能性があります
365    pub const EFFECT_TYPE_TRANSITION: i32 = 3;
366    /// エフェクトフラグ:画像をサポート ※今後追加される可能性があります
367    pub const EFFECT_FLAG_VIDEO: i32 = 1;
368    /// エフェクトフラグ:音声をサポート ※今後追加される可能性があります
369    pub const EFFECT_FLAG_AUDIO: i32 = 2;
370    /// エフェクトフラグ:フィルタオブジェクトをサポート ※今後追加される可能性があります
371    pub const EFFECT_FLAG_FILTER: i32 = 4;
372}
373
374/// プロジェクトファイル構造体
375/// プロジェクトファイルのロード、セーブ時のコールバック関数内で利用出来ます
376/// プロジェクトの保存データはプラグイン毎のデータ領域になります
377#[repr(C)]
378pub struct PROJECT_FILE {
379    /// プロジェクトに保存されている文字列(UTF-8)を取得します
380    /// key  : キー名(UTF-8)
381    /// 戻り値 : 取得した文字列へのポインタ (未設定の場合はnullptr)
382    pub get_param_string: unsafe extern "C" fn(key: LPCSTR) -> LPCSTR,
383    /// プロジェクトに文字列(UTF-8)を保存します
384    /// key  : キー名(UTF-8)
385    /// value : 保存する文字列(UTF-8)
386    pub set_param_string: unsafe extern "C" fn(key: LPCSTR, value: LPCSTR),
387    /// プロジェクトに保存されているバイナリデータを取得します
388    /// key  : キー名(UTF-8)
389    /// data  : 取得するデータの格納先へのポインタ
390    /// size  : 取得するデータのサイズ (保存されているサイズと異なる場合は失敗します)
391    /// 戻り値 : 正しく取得出来た場合はtrue
392    pub get_param_binary: unsafe extern "C" fn(key: LPCSTR, data: *mut c_void, size: i32) -> bool,
393    /// プロジェクトにバイナリデータを保存します
394    /// key  : キー名(UTF-8)
395    /// data  : 保存するデータへのポインタ
396    /// size  : 保存するデータのサイズ (4096バイト以下)
397    pub set_param_binary: unsafe extern "C" fn(key: LPCSTR, data: *mut c_void, size: i32),
398    /// プロジェクトに保存されているデータを全て削除します
399    pub clear_params: unsafe extern "C" fn(),
400
401    /// プロジェクトファイルのパスを取得します
402    /// 戻り値 : プロジェクトファイルパスへのポインタ (ファイルパスは未設定の場合があります)
403    ///      ※コールバック処理の終了まで有効
404    pub get_project_file_path: unsafe extern "C" fn() -> LPCWSTR,
405}
406
407/// ホストアプリケーション構造体
408#[repr(C)]
409pub struct HOST_APP_TABLE {
410    /// プラグインの情報を設定する
411    /// information : プラグインの情報
412    pub set_plugin_information: unsafe extern "C" fn(information: LPCWSTR),
413
414    /// 入力プラグインを登録する
415    /// input_plugin_table : 入力プラグイン構造体
416    pub register_input_plugin: unsafe extern "C" fn(input_plugin_table: *mut INPUT_PLUGIN_TABLE),
417    /// 出力プラグインを登録する
418    /// output_plugin_table : 出力プラグイン構造体
419    pub register_output_plugin: unsafe extern "C" fn(output_plugin_table: *mut OUTPUT_PLUGIN_TABLE),
420    /// フィルタプラグインを登録する
421    /// filter_plugin_table : フィルタプラグイン構造体
422    pub register_filter_plugin: unsafe extern "C" fn(filter_plugin_table: *mut FILTER_PLUGIN_TABLE),
423    /// スクリプトモジュールを登録する
424    /// script_module_table : スクリプトモジュール構造体
425    pub register_script_module: unsafe extern "C" fn(script_module_table: *mut SCRIPT_MODULE_TABLE),
426
427    /// インポートメニューを登録する
428    /// name    : インポートメニューの名称
429    /// func_proc_import : インポートメニュー選択時のコールバック関数
430    pub register_import_menu: unsafe extern "C" fn(
431        name: LPCWSTR,
432        func_proc_import: unsafe extern "C" fn(*mut EDIT_SECTION),
433    ),
434    /// エクスポートメニューを登録する
435    /// name    : エクスポートメニューの名称
436    /// func_proc_export : エクスポートメニュー選択時のコールバック関数
437    pub register_export_menu: unsafe extern "C" fn(
438        name: LPCWSTR,
439        func_proc_export: unsafe extern "C" fn(*mut EDIT_SECTION),
440    ),
441
442    /// ウィンドウクライアントを登録する
443    /// name  : ウィンドウの名称
444    /// hwnd  : ウィンドウハンドル
445    /// ウィンドウにはWS_CHILDが追加され親ウィンドウが設定されます ※WS_POPUPは削除されます
446    pub register_window_client: unsafe extern "C" fn(name: LPCWSTR, hwnd: HWND),
447
448    /// プロジェクトデータ編集用のハンドルを取得します
449    /// 戻り値 : 編集ハンドル
450    pub create_edit_handle: unsafe extern "C" fn() -> *mut EDIT_HANDLE,
451
452    /// プロジェクトファイルをロードした直後に呼ばれる関数を登録する ※プロジェクトの初期化時にも呼ばれます
453    /// func_project_load : プロジェクトファイルのロード時のコールバック関数
454    pub register_project_load_handler:
455        unsafe extern "C" fn(func_project_load: unsafe extern "C" fn(*mut PROJECT_FILE)),
456    /// プロジェクトファイルをセーブする直前に呼ばれる関数を登録する
457    /// func_project_save : プロジェクトファイルのセーブ時のコールバック関数
458    pub register_project_save_handler:
459        unsafe extern "C" fn(func_project_save: unsafe extern "C" fn(*mut PROJECT_FILE)),
460
461    /// レイヤーメニューを登録する (レイヤー編集でオブジェクト未選択時の右クリックメニューに追加されます)
462    /// name : レイヤーメニューの名称
463    /// func_proc_layer_menu : レイヤーメニュー選択時のコールバック関数
464    pub register_layer_menu: unsafe extern "C" fn(
465        name: LPCWSTR,
466        func_proc_layer_menu: unsafe extern "C" fn(*mut EDIT_SECTION),
467    ),
468
469    /// オブジェクトメニューを登録する (レイヤー編集でオブジェクト選択時の右クリックメニューに追加されます)
470    /// name : オブジェクトメニューの名称
471    /// func_proc_object_menu : オブジェクトメニュー選択時のコールバック関数
472    pub register_object_menu: unsafe extern "C" fn(
473        name: LPCWSTR,
474        func_proc_object_menu: unsafe extern "C" fn(*mut EDIT_SECTION),
475    ),
476
477    /// 設定メニューを登録する
478    /// 設定メニューの登録後にウィンドウクライアントを登録するとシステムメニューに「設定」が追加されます
479    /// name : 設定メニューの名称
480    /// func_config : 設定メニュー選択時のコールバック関数
481    pub register_config_menu:
482        unsafe extern "C" fn(name: LPCWSTR, func_config: unsafe extern "C" fn(HWND, HINSTANCE)),
483
484    /// 編集メニューを登録する
485    /// name : 編集メニューの名称 ※名称に'\'を入れると表示を階層に出来ます
486    /// func_proc_edit_menu : 編集メニュー選択時のコールバック関数
487    pub register_edit_menu: unsafe extern "C" fn(
488        name: LPCWSTR,
489        func_proc_edit_menu: unsafe extern "C" fn(*mut EDIT_SECTION),
490    ),
491
492    /// キャッシュを破棄の操作時に呼ばれる関数を登録する
493    /// func_proc_clear_cache : キャッシュの破棄時のコールバック関数
494    pub register_clear_cache_handler:
495        unsafe extern "C" fn(func_proc_clear_cache: unsafe extern "C" fn(*mut EDIT_SECTION)),
496
497    /// シーンを変更した直後に呼ばれる関数を登録する ※シーンの設定情報が更新された時にも呼ばれます
498    /// func_proc_change_scene : シーン変更時のコールバック関数
499    pub register_change_scene_handler:
500        unsafe extern "C" fn(func_proc_change_scene: unsafe extern "C" fn(*mut EDIT_SECTION)),
501}