例 D–1 は、アプリケーションのための Ttdt_contract_cb コールバックの典型的なアルゴリズムの例です。このアプリケーションは、Pause 要求、 Resume 要求、 Quit 要求を処理しますが、ツールキットには X11 関連の要求しか処理させません。
この例にあるコールバックは、contract パラメータがゼロ以外の値を持っている場合に処理します。したがって、ttdt_message_accept に渡される Ttdt_contract_cb コールバックとして使用することもできます。
Tt_message myContractCB(
Tt_message msg,
void *clientdata,
Tt_message contract
)
{
char *opString = tt_message_op( msg );
Tttk_op op = tttk_string_op( opString );
tt_free( opString );
int silent = 0;
int force = 0;
Boolean cancel = False;
Boolean sensitive = True;
char *status, command;
switch (op) {
case TTDT_QUIT:
tt_message_arg_ival( msg, 0, &silent );
tt_message_arg_ival( msg, 1, &force );
if (contract == 0) {
/* Quit entire application */
cancel = ! myQuitWholeApp( silent, force );
} else {
/* Quit just the specified request being worked on */
cancel = ! myCancelThisRequest(contract, silent, force);
}
if (cancel) {
/* User canceled Quit; fail the Quit request */
tttk_message_fail( msg, TT_DESKTOP_ECANCELED, 0, 1 );
} else {
tt_message_reply( msg );
tttk_message_destroy( msg );
}
return 0;
case TTDT_PAUSE:
sensitive = False;
case TTDT_RESUME:
if (contract == 0) {
int already = 1;
if (XtIsSensitive( myTopShell ) != sensitive) {
already = 0;
XtSetSensitive( myTopShell, sensitive );
}
if (already) {
tt_message_status_set(msg,TT_DESKTOP_EALREADY);
}
} else {
if (XtIsSensitive( thisShell ) == sensitive) {
tt_message_status_set(msg,TT_DESKTOP_EALREADY);
} else {
XtSetSensitive( thisShell, sensitive );
}
tt_message_reply( msg );
tttk_message_destroy( msg );
return 0;
case TTDT_GET_STATUS:
if (contract == 0) {
status = "Message about status of entire app";
} else {
status = "Message about status of this request";
}
tt_message_arg_val_set( msg, 0, status );
tt_message_reply( msg );
tttk_message_destroy( msg );
return 0;
case TTDT_DO_COMMAND:
if (! haveExtensionLanguage) {
tttk_message_fail( msg, TT_DESKTOP_ENOTSUP, 0, 1 );
return 0;
}
command = tt_message_arg_val( msg, 0 );
result = myEval( command );
tt_free( command );
tt_message_status_set( msg, result );
if (tt_is_err( result )) {
tttk_message_fail( msg, result, 0, 1 );
} else {
tt_message_reply( msg );
tttk_message_destroy( msg );
}
return 0;
}
/* Unrecognized message; do not consume it */
return msg;
}