タイトル【小池邦人のプログラミング日記】2000/8/10<Mac OS Xへの道 Carbon対応の実際(4)>カテゴリーCarbon/CF, 小池邦人のプログラミング日記
作成日2000/9/26 22:22:12作成者小池邦人
既存のソースコードをCarbon APIに対応させ、Mac OS X環境でも起動できるアプリを作るための工程のうち、今回は(6)のScrap Managerの書き換えの工程について解説します。

(6)Scrap Manager関連のAPIを変更

前回、CarbonLibでAPIが完全に書き換えられているManagerがふたつ存在すると話しました。そのうちのひとつがPrint Managerでしたが、もうひとつが、今回解説する「Scrap Manager」です。Scrap Managerは、編集メニューのカット(コピー)&ペーストを実行した時に、複数アプリケーション間で、指定タイプのデータをクリップボード経由で受け渡すために用いられます。Scrap ManagerもPrint Manager同様に、ToolBoxの中で変更されることがなかった古い古いManagerです。よって、Appleがこの機会に改造を決めたのは当然かもしれません。ただ、このManagerに定義されているAPIの数はそんなに多くはありませんので、変更による一般アプリケーションへの影響は最小限だと思われます。

Scrap Managerに関するヘッダーファイルは「Scrap.h」です。このヘッダーファイルには、Scrap Managerの新APIに関する詳しい解説がコメント行として追加されています。ひょっとするとCarbon SDKに含まれている「CarbonScrapMgr.pdf」よりも、こちらの内容の方が詳しいかもしれません(笑)。よって、これらの新APIを使用される前に、まずヘッダーファイルを一読されることをお薦めします。また、Carbon Scrap Managerにはデータの受け渡しに役に立つ若干の新機能も追加されています。

例えば、任意のデータタイプ(PICTとかTEXTとか)のデータハンドラを渡し、それをクリップボードに保存するルーチンは、旧APIを使うと以下のように記載できました。

short oldPutClipbord(Handle hd, OSType type)
{
  long  len;

  len=GetHandleSize( hd );
  ZeroScrap();
  HLock( hd );
  if( PutScrap( len,type,*hd ) )
  {
    HUnlock( hd );
    return( 1 );
  }
  HUnlock( hd );
  UnloadScrap();
  return( 0 );
}

これとまったく同じ機能を持ったルーチンをCaroboLibの新APIで記述すると、以下のようになります。これを見ると、新たに「ScrapRef」という識別子(構造体へのポインタ)が導入されたことが分かります。

short newPutClipbord(Handle hd, ScrapFlavorType type)
{
  ScrapRef      sref;
  Size        len;
  short        ret;

  HLock( hd );
  len=GetHandleSize( hd );
  ClearCurrentScrap();
  GetCurrentScrap( &sref );
  ret=PutScrapFlavor( sref,type,kScrapFlavorMaskNone,len,*hd ); 
  HUnlock( hd );
  return( ret );
}

次は、旧APIを利用したのクリップボードから指定タイプデータを抽出するルーチンです。Carbon Scrap Managerのドキュメントを読むと、Mac OS 8でCarbonアプリケーションを使う場合には、今まで通りLoadScrap()やUnloadScrap()を用いる必要があると記載されています。しかし残念ながら、この件については未確認のままです。

short oldGetClipbord(Handle *hd, OSType type)
{
  long len;

  if( *hd=NewHandle( 0L ) )
  {
    if( ! LoadScrap() )
    {
      if( GetScrap( *hd,type,&len ) > 0L )
      {
        UnloadScrap();
        return( 0 );
      }
    }
    DisposeHandle( *hd );
  }
  return( 1 );
}

以下が、新APIを使った同じ機能のルーチンです。とりあえずMac OS 9.04上で動作させている分には、まったく問題ないようです。指定タイプのデータを読み込む前に、その容量(サイズ)をチェックしなければいけないところが旧APIと異なります。また、GetScrapFlavorData()に渡すデータ読み込み場所(バッファ)もハンドラではなくポインタとなっていますので注意してください。

short newGetClipbord(Handle *hd, ScrapFlavorType type)
{
  Size    len,size;
  ScrapRef  sref;

  GetCurrentScrap( &sref );
  GetScrapFlavorSize( sref,type,&size );
  if( size )
  {
    if( *hd=NewHandle( size ) )
    {
HLock( *hd );
      if( ! GetScrapFlavorData( sref,type,&len,**hd ) )
      {
        HUnlock( *hd );
        return( 0 );
      }
      DisposeHandle( *hd );
    }
  }
  return( 1 );
}

次回は(7)以降の工程についてお話しする予定です。Mac OS Xに対応したメニュー構築の話しです。
関連リンクオッティモ