共通デスクトップ環境 ToolTalk メッセージの概要

Ttdt_contract_cb の例

例 D-1 は、アプリケーションのための Ttdt_contract_cb コールバックの典型的なアルゴリズムの例です。このアプリケーションは、Pause 要求、 Resume 要求、 Quit 要求を処理しますが、ツールキットには X11 関連の要求しか処理させません。


注 -

この例にあるコールバックは、contract パラメータがゼロ以外の値を持っている場合に処理します。したがって、ttdt_message_accept に渡される Ttdt_contract_cb コールバックとして使用することもできます。



例 D-1 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; 
}