以下に、本願の開示するポインタ位置補正方法、ポインタ位置補正プログラムおよびサーバ装置の実施例を図面に基づいて詳細に説明する。なお、実施例では、ポインタをマウス操作に伴い移動するカーソルとして説明する。また、実施例によりこの発明が限定されるものではない。
[シンクライアントシステムに含まれる各装置の構成]
図1は、実施例1に係るシンクライアントシステムに含まれる各装置の構成を示す機能ブロック図である。図1に示すシンクライアントシステム9は、クライアント装置1が表示するデスクトップ画面をリモートでサーバ装置2に制御させるものである。つまり、シンクライアントシステム9は、実際にはサーバ装置2が実行した処理結果等をクライアント装置1に表示させつつも、あたかもクライアント装置1が主体となって処理を実行したかのように振る舞う。
図1に示すように、シンクライアントシステム9は、クライアント装置1と、サーバ装置2とを有する。なお、図1の例では、1つのサーバ装置2に対し、1つのクライアント装置1を接続する場合を図示したが、任意の数のクライアント装置1を接続できる。
クライアント装置1およびサーバ装置2は、ネットワーク3を介して相互に通信可能に接続される。かかるネットワークには、有線または無線を問わず、インターネット、LAN(Local Area Network)やVPN(Virtual Private Network)等の任意の種類の通信網を採用できる。なお、サーバ装置2およびクライアント装置1間の通信プロトコルには、一例として、VNCにおける画面転送方式を採用する。すなわち、サーバ装置2のデスクトップ画面の内容をビットマップやJPEG等の画像でクライアントへ転送し、転送した画像をクライアント装置1のデスクトップ画面へ表示させる。
サーバ装置2は、クライアント装置1に表示させる画面をリモートで制御するサービスを提供するコンピュータである。クライアント装置1は、サーバ装置2によるリモート画面制御サービスの提供を受ける側のコンピュータである。かかるクライアント装置1の一例としては、パーソナルコンピュータ等固定端末のほか、携帯電話機、PHS(Personal Handyphone System)やPDA(Personal Digital Assistant)等の移動体端末を適用することもできる。
[クライアント装置の構成]
クライアント装置1は、OS(Operating System)10と、入力イベント処理部11と、画面描画部12とを有する。OS10は、マウスやキーボードからの入力および画面への出力を含む入出力機能等を提供し、クライアント装置1の全体を管理する。かかるOS10の一例としては、Windows(登録商標)であるが、UNIX(登録商標)等の別のOSであっても良い。入力イベント処理部11は、マウスやキーボードの操作により発生する入力イベントを処理する。さらに、入力イベント処理部11は、入力イベント取得部111と、入力イベント送信部112と、カーソル描画部113とを有する。また、画面描画部12は、サーバ装置2から受信した、カーソル位置を補正する情報(カーソル位置補正情報)に応じてカーソル位置を補正したりサーバ装置2から受信した画面情報に応じて画面を描画したりする。さらに、画面描画部12は、カーソル位置補正情報受信部121と、カーソル位置補正部122と、画面情報受信部123と、画像展開処理部124と、画面情報描画部125とを有する。
入力イベント取得部111は、クライアント装置1に接続されたキーボードやマウス等の入出力デバイスから入力イベントを取得する。入力イベントは、例えばマウスの移動操作によりカーソルを移動させるイベントを指す。入力イベントの一例として、「MOUSE_MOVE マウスのX座標、マウスのY座標、ホイールの移動量」がある。「MOUSE_MOVE」は、マウスの操作内容であり、ここではマウスの移動操作を示す。マウスのX座標およびマウスのY座標は、それぞれマウスの移動先のX座標の位置およびY座標の位置を示す。ホイールの移動量は、移動にホイールを用いた場合の移動量を示す。具体的な一例として、マウスのX座標が800、マウスのY座標が600、ホイールの移動量が0である「MOUSE_MOVE 800、600、0」がある。
また、入力イベント取得部111は、取得した入力イベントについて、後述する入力イベント送信部112によりサーバ装置2へ送信させるとともに、後述するカーソル描画部113によりイベント処理後の位置にマウスカーソルを描画させる。入力イベント送信部112は、入力イベント取得部111によって取得された入力イベントをサーバ装置2へ送信する。
カーソル描画部113は、クライアント装置1のデスクトップ画面へマウスカーソルを再描画する。例えば、カーソル描画部113は、入力イベント取得部111によって取得された入力イベントに含まれるマウスカーソルの移動先の位置を抽出する。そして、カーソル描画部113は、自装置のデスクトップ画面の、抽出したマウスカーソルの位置に当該マウスカーソルを描画する。すなわち、入力イベント処理部11は、ローカルエコー方式のように、発生した入力イベントをサーバ装置2へ送信するとともに、発生した入力イベントに対応するマウスカーソルを自装置で再描画する。
また、カーソル描画部113は、後述するカーソル位置補正部122からマウスカーソルの補正位置を取得し、自装置のデスクトップ画面の、取得したマウスカーソルの補正位置に当該マウスカーソルを描画する。
カーソル位置補正情報受信部121は、カーソル位置補正情報をサーバ装置2から受信する。ここで、カーソル位置補正情報とは、サーバ装置2によって補正されるカーソルの位置情報である。つまり、サーバ装置2では、クライアント装置1から送信された入力イベントを処理した結果、処理後のマウスカーソルの位置がOSによって自動的に変更される場合がある。例えば、OSの操作によっては、自動的に特定のボタンに移動するように設定されているような場合がある。かかる場合に、カーソル位置補正情報受信部121は、カーソル位置補正情報をサーバ装置2から受信し、受信したカーソル位置補正情報を用いてカーソル位置を補正させてサーバ装置2のカーソル位置と対応させる。
カーソル位置補正部122は、カーソル位置補正情報受信部121によって受信されたカーソル位置補正情報からマウスカーソルの補正位置を抽出する。また、カーソル位置補正部122は、カーソル描画部113によって、抽出したマウスカーソルの補正位置に再描画させる。
画面情報受信部123は、サーバ装置2から圧縮後の画面表示データを受信する。画像展開処理部124は、画面情報受信部123によって受信された圧縮後の画面表示データを展開する。画面情報描画部125は、画像展開処理部124によって展開された画面表示データを用いて、画面内容を再描画する。なお、実施例では、マウスカーソル以外の画像処理は、画面転送方式に従うため、簡単に記載するものとする。
[サーバ装置の構成]
サーバ装置2は、OS20と、入力イベント履歴保持部21と、入力イベント処理部22と、カーソル位置補正部23と、画面情報転送部24とを有する。OS20は、入力イベント等のイベントの処理機能等を提供し、サーバ装置2の全体を管理する。かかるOS20の一例としては、Windows(登録商標)であるが、UNIX(登録商標)等の別のOSであっても良い。入力イベント履歴保持部21は、クライアント装置1から受信した入力イベントのイベント情報をイベント履歴としてキューに保持する。
ここで、入力イベント履歴保持部21のデータ構造について、図2を参照して説明する。図2は、入力イベント履歴保持部のデータ構造の一例を示す図である。図2に示すように、入力イベント履歴保持部21は、入力イベント毎にX座標21aとY座標21bとを対応付けて、入力イベントの履歴として保持する。X座標21aは、入力イベントに含まれる移動先のX座標の位置である。Y座標21bは、入力イベントに含まれる移動先のY座標の位置である。入力イベントの履歴は、クライアント装置1からサーバ装置2へ入力イベントが送信された順に保持される。一例として、一段目に最も古い入力イベントの履歴として、X座標が「797」、Y座標が「603」が保持されている。四段目に最も新しい入力イベントの履歴として、X座標が「800」、Y座標が「600」が保持されている。
図1に戻って、入力イベント処理部22は、クライアント装置1から入力イベントを受信し、受信した入力イベントを処理する。さらに、入力イベント処理部22は、入力イベント受信部221と、入力イベント保存部222と、入力イベント実行部223とを有する。カーソル位置補正部23は、入力イベント履歴保持部21を用いてクライアント装置1のカーソル位置を補正する。さらに、カーソル位置補正部23は、カーソル位置変更チェック部231と、カーソル位置履歴チェック部232と、カーソル位置補正情報送信部233とを有する。画面情報転送部24は、画面情報をクライアント装置1に転送する。さらに、画面情報転送部24は、画面情報取得部241と、画面更新判定部242と、画像圧縮処理部243と、画面情報送信部244とを有する。
入力イベント受信部221は、クライアント装置1から送信された入力イベントを受信する。入力イベント保存部222は、入力イベント受信部221によって受信された入力イベントを入力イベントの履歴として入力イベント履歴保持部21に保存する。
入力イベント実行部223は、入力イベント受信部221によって受信された入力イベントを実行する。例えば、入力イベント実行部223は、入力イベント受信部221によって受信された入力イベントをOS20へ受け渡して処理させる。
カーソル位置変更チェック部231は、入力イベント実行部223によって入力イベントが実行された結果、実行前後でカーソルの位置に変化があったか否かを判定する。例えば、カーソル位置変更チェック部231は、OS20に入力イベントを処理させた結果、OS20から処理に対応したマウスカーソルの位置を取得する。そして、カーソル位置変更チェック部231は、取得したマウスカーソルの位置が入力イベントを処理させる前のマウスカーソルの位置と一致しているか否かを判定する。なお、カーソル位置変更チェック部231は、1フレームの画面表示データの更新の都度、例えば後述する画面更新判定部242を実施後にチェックするようにする。
カーソル位置履歴チェック部232は、実行前後でカーソルの位置に変化があったとカーソル位置変更チェック部231によって判定された場合、変化があったカーソルの位置が入力イベント履歴保持部21に保持されているかどうかをチェックする。例えば、カーソル位置履歴チェック部232は、変化があったマウスカーソルの位置が入力イベント履歴保持部21の入力イベントの履歴として保持されているいずれかの座標位置と一致しているか否かを判定する。
カーソル位置履歴チェック部232は、変化があったマウスカーソルの位置が入力イベント履歴保持部21に保持されていると判定した場合、保持されていると判定した入力イベントの履歴および当該履歴以前の履歴を削除する。すなわち、カーソル位置履歴チェック部232は、OS20によって処理された結果のマウスカーソルの位置がOS20によって自動的に変更されていないので、処理された入力イベントの履歴以前の履歴を削除する。一方、カーソル位置履歴チェック部232は、変化があったマウスカーソルの位置が入力イベント履歴保持部21に保持されていないと判定した場合、変化があったマウスカーソルの位置をカーソル位置補正情報送信部233に通知する。すなわち、カーソル位置履歴チェック部232は、OS20によって処理された結果であるマウスカーソルの位置がOS20によって自動的に変更されたと判断し、変更されたマウスカーソルの位置をカーソル位置補正情報送信部233に通知する。
カーソル位置補正情報送信部233は、カーソル位置履歴チェック部232によって通知されたカーソルの位置を含むカーソル位置補正情報をクライアント装置1に送信する。これによって、OS20によって自動的に変更されたマウスカーソルの位置をクライアント装置1に補正させることができる。
画面情報取得部241は、OS20を介して画面表示データを取得する。画面更新判定部242は、画面情報取得部241によって、前回取得した画面表示データと今回取得した画面表示データとを比較し、画面表示データに更新があったか否かを判定する。画像圧縮処理部243は、画面更新判定部242によって画面表示データに更新があったと判定された場合、更新があった領域の画面表示データを圧縮する。画面情報送信部244は、画像圧縮処理部243によって圧縮された圧縮後の画面表示データをクライアント装置1に送信する。
[カーソル位置補正の具体例]
次に、カーソル位置補正の具体例について、図3を参照して説明する。図3は、実施例1に係るカーソル位置補正の具体例を説明する図である。
図3に示すように、クライアント装置1では、入力イベント取得部111が、クライアント装置1に接続されたマウスから入力イベントを取得する(ステップS1)。ここでは、入力イベントは、マウスの移動操作によりマウスの移動先が(x2、y2)となるイベントであるものとする。
入力イベント取得部111は、取得した入力イベントを入力イベント送信部112およびカーソル描画部113に引き渡す。そして、入力イベント送信部112は、引き渡された入力イベントをサーバ装置2に送信し、カーソル描画部113は、引き渡された入力イベントを、OS10を介してデスクトップ画面に描画する(ステップS2)。ここでは、カーソル描画部113は、デスクトップ画面のP2にカーソルを描画する。
サーバ装置2では、入力イベント受信部221が、クライアント装置1から送信された入力イベントを受信する。そして、入力イベント保存部222が、入力イベント受信部221によって受信された入力イベントをイベント履歴として保持する。ここでは、入力イベント保存部222は、入力イベントに含まれる移動先の座標P2をイベント履歴として保持する。加えて、入力イベント実行部223が、入力イベント受信部221によって受信された入力イベントをOS20に処理させる(ステップS3)。
そして、カーソル位置変更チェック部231は、OS20に処理させた結果であるマウスカーソルの座標を取得する(ステップS4)。そして、カーソル位置変更チェック部231は、取得したマウスカーソルの座標P2が処理前のマウスカーソルの座標と一致していない、すなわちマウスカーソルが移動したと判定する。そして、カーソル位置履歴チェック部232は、処理後のマウスカーソルの座標P2が入力イベント履歴として保持されているか否かを判定する(ステップS5)。ここでは、処理後のマウスカーソルの座標P2が入力イベント履歴として保持されているので、座標P2以前の履歴を削除する(ステップS6)。このように例えばマウスの移動先が座標P2となる入力イベントの場合には、処理後のマウスカーソルの座標P2がOS20によって自動的に変更されていないので、クライアント装置1に対して座標の補正をしないで、処理を終了することとなる。この結果、クライアント装置1およびサーバ装置2のそれぞれのマウスカーソルの座標は、P2に描画されている。
次に、マウスの移動先が座標P3(x3、y3)となる入力イベントの場合について説明する。クライアント装置1では、入力イベント取得部111は、マウスから取得した入力イベントを入力イベント送信部112およびカーソル描画部113に引き渡す。そして、入力イベント送信部112は、引き渡された入力イベントをサーバ装置2に送信し、カーソル描画部113は、引き渡された入力イベントを、OS10を介してデスクトップ画面に描画する(ステップS2)。ここでは、カーソル描画部113は、デスクトップ画面のP3にカーソルを描画する。
サーバ装置2では、入力イベント受信部221が、クライアント装置1から送信された入力イベントを受信する。そして、入力イベント保存部222が、入力イベント受信部221によって受信された入力イベントをイベント履歴として保持する。ここでは、入力イベント保存部222は、入力イベントに含まれる移動先の座標P3をイベント履歴として保持する。加えて、入力イベント実行部223が、入力イベント受信部221によって受信された入力イベントをOS20に処理させる(ステップS3)。
そして、カーソル位置変更チェック部231は、OS20に処理させた後のマウスカーソルの座標を取得する(ステップS4)。ここでは、OS20によってマウスカーソルの位置が自動的にP3からP4(x4、y4)に変更したものとする。すると、カーソル位置変更チェック部231は、取得したマウスカーソルの座標P4が処理前のマウスカーソルの座標P2と一致していないと判定する。そして、カーソル位置履歴チェック部232は、処理後のマウスカーソルの座標P4が入力イベント履歴として保持されているか否かを判定する(ステップS5)。ここでは、処理後のマウスカーソルの座標P4がOS20によって入力イベントに含まれる移動先の座標P3から自動的に変更されたので、座標P4は入力イベント履歴として保持されていない。そこで、カーソル位置履歴チェック部232は、変更されたマウスカーソルの座標P4をカーソル位置補正情報送信部233に通知させる(ステップS7)。
クライアント装置1では、カーソル位置補正情報受信部121が、変更されたマウスカーソルの座標P4を受信する。そして、カーソル位置補正部122は、カーソル描画部113によって、変更されたマウスカーソルの座標P4にマウスカーソルを再描画させる。このように、サーバ装置2がクライアント装置1から送信された入力イベントを処理した結果、処理後のマウスカーソルの座標がOS20によって自動的に変更されても、変更された座標をクライアント装置1に対応させることができる。
[クライアント装置における入力イベント処理の手順]
次に、クライアント装置1における入力イベント処理の手順について、図4を参照して説明する。図4は、実施例1に係るクライアント装置における入力イベント処理の手順を示すフローチャートである。
まず、入力イベント取得部111は、未処理の入力イベントが存在するか否かを判定する(ステップS11)。未処理の入力イベントが存在しないと判定した場合(ステップS11;No)、入力イベント取得部111は、未処理の入力イベントが存在すると判定するまで、判定処理を繰り返す。
一方、未処理の入力イベントが存在すると判定した場合(ステップS11;Yes)、入力イベント取得部111は、入力イベントを取得する(ステップS12)。そして、カーソル描画部113は、入力イベント取得部111によって取得された入力イベントに基づいて、自装置のデスクトップ画面へマウスカーソルを再描画する(ステップS13)。例えば、カーソル描画部113は、入力イベントに含まれる移動先のマウスカーソルの位置を抽出し、抽出したマウスカーソルの位置に当該マウスカーソルを再描画する。
そして、入力イベント送信部112は、入力イベント取得部111によって取得された入力イベントをサーバ装置2へ送信する(ステップS14)。そして、入力イベント処理部11は、次のイベントが発生するのを待つべく、ステップS11に移行する。
[クライアント装置における画面描画処理の手順]
次に、クライアント装置1における画面描画処理の手順について、図5を参照して説明する。図5は、実施例1に係るクライアント装置における画面描画処理の手順を示すフローチャートである。
まず、画面描画部12は、サーバ装置2から画面転送方式に関するデータを受信したか否かを判定する(ステップS21)。画面転送方式に関するデータを受信していないと判定した場合(ステップS21;No)、画面描画部12は、画面転送方式に関するデータを受信するまで、判定処理を繰り返す。
画面転送方式に関するデータを受信したと判定した場合(ステップS21;Yes)、カーソル位置補正情報受信部121がカーソル位置補正情報を受信したか否かを判定する(ステップS22)。カーソル位置補正情報を受信したと判定した場合(ステップS22;Yes)、カーソル位置補正情報受信部121は、カーソル位置補正情報を受信する(ステップS23)。
続いて、カーソル位置補正部122は、受信したカーソル位置補正情報から補正位置を抽出し、抽出した補正位置にマウスカーソルの位置を補正する(ステップS24)。そして、カーソル描画部113は、補正された位置にマウスカーソルを再描画する(ステップS25)。そして、画面描画部12は、次の画面転送方式に関するデータを待つべく、ステップS21に移行する。
ステップS22において、カーソル位置補正情報を受信しなかったと判定した場合(ステップS22;No)、画面情報受信部123は、画面情報を受信したか否かを判定する(ステップS26)。画面情報を受信したと判定した場合(ステップS26;Yes)、画面情報受信部123は、圧縮後の画面表示データを受信する(ステップS27)。
続いて、画像展開処理部124は、圧縮後の画面表示データを展開する(ステップS28)。そして、画面情報描画部125は、展開して得られた画面表示データを使用してデスクトップ画面を再描画する(ステップS29)。そして、画面描画部12は、次の画面転送方式に関するデータを待つべく、ステップS21に移行する。
ステップS26において、画面情報を受信しなかったと判定した場合(ステップS26;No)、画面情報受信部123は、画面転送方式とは無関係のデータを受信したので、ここでは何もしない(ステップS30)。そして、画面描画部12は、次の画面転送方式に関するデータを待つべく、ステップS21に移行する。
[サーバ装置における入力イベント処理の手順]
次に、サーバ装置2における入力イベント処理の手順について、図6を参照して説明する。図6は、実施例1に係るサーバ装置における入力イベント処理の手順を示すフローチャートである。
まず、サーバ装置2の入力イベント受信部221は、クライアント装置1から入力イベントを受信したか否かを判定する(ステップS31)。入力イベントを受信していないと判定した場合(ステップS31;No)、入力イベント受信部221は、入力イベントを受信するまで、判定処理を繰り返す。
一方、入力イベントを受信したと判定した場合(ステップS31;Yes)、入力イベント受信部221は、入力イベントを受信する(ステップS32)。そして、入力イベント保存部222は、受信した入力イベントを、入力イベントの履歴として入力イベント履歴保持部21へ保存する(ステップS33)。
続いて、入力イベント実行部223は、入力イベントをOS20へ受け渡してOS20に処理させる(ステップS34)。そして、入力イベント処理部22は、次のイベントを受信するのを待つべく、ステップS31に移行する。
[サーバ装置におけるカーソル位置補正処理の手順]
次に、サーバ装置2におけるカーソル位置補正処理の手順について、図7を参照して説明する。図7は、実施例1に係るサーバ装置におけるカーソル位置補正処理の手順を示すフローチャートである。
カーソル位置変更チェック部231は、所定の時間経過したか否かを判定する(ステップS41)。所定の時間経過していないと判定した場合(ステップS41;No)、カーソル位置変更チェック部231は、所定の時間が経過するまで、判定処理を繰り返す。
一方、所定の時間経過したと判定した場合(ステップS41;Yes)、カーソル位置変更チェック部231は、マウスカーソルが移動したかどうかをチェックする(ステップS42)。例えば、カーソル位置変更チェック部231は、OS20に入力イベントを処理させた結果、OS20から処理に対応したマウスカーソルの位置を取得する。そして、カーソル位置変更チェック部231は、取得したマウスカーソルの位置が入力イベントを処理させる前のマウスカーソルの位置と一致しているか否かを判定する。ここで、所定の時間とは、例えば1フレームの画面表示データの更新時間を示し、一例として33msである。
そして、マウスカーソルが移動していないと判定した場合(ステップS42;No)、カーソル位置補正部23は、カーソル位置補正処理を終了し、画面情報転送処理に移行する。一方、マウスカーソルが移動したと判定した場合(ステップS42;Yes)、カーソル位置履歴チェック部232は、移動後のマウスカーソルの位置に対応する入力イベントが存在するか否かを判定する(ステップS43)。例えば、カーソル位置履歴チェック部232は、変化があったマウスカーソルの位置が入力イベント履歴保持部21の入力イベントの履歴として保持されているいずれかの座標位置と一致しているか否かを判定する。
そして、対応する入力イベントが存在すると判定した場合(ステップS43;Yes)、カーソル位置履歴チェック部232は、対応した入力イベントの履歴以前の履歴を削除する(ステップS44)。そして、カーソル位置補正部23は、カーソル位置補正処理を終了し、画面情報転送処理に移行する。
一方、対応する入力イベントが存在しないと判定した場合(ステップS43;No)、カーソル位置履歴チェック部232は、カーソルの位置がOS20によって自動的に変更されたと判断する。そして、カーソル位置履歴チェック部232は、カーソル位置補正情報送信部233にカーソル位置補正情報をクライアント装置1へ送信させる(ステップS45)。例えば、カーソル位置補正情報送信部233は、変更されたカーソルの位置を含むカーソル位置補正情報をクライアント装置1へ送信する。そして、カーソル位置補正部23は、カーソル位置補正処理を終了し、画面情報転送処理に移行する。
[サーバ装置における画面情報転送処理の手順]
次に、サーバ装置2における画面情報転送処理の手順について、図8を参照して説明する。図8は、実施例1に係るサーバ装置における画面情報転送処理の手順を示すフローチャートである。
画面情報取得部241は、OS20を介して画面表示データを取得する(ステップS51)。そして、画面更新判定部242は、取得した画面表示データと前回に取得した画面表示データとを比較して、画面更新があったか否かを判定する(ステップS52)。画面更新がなかったと判定した場合(ステップS52;No)、画面情報転送部24は、カーソル位置補正処理に移行すべく、ステップS41に遷移する。
一方、画面更新があったと判定した場合(ステップS52;Yes)、画像圧縮処理部243は、更新があった領域の画面表示データを圧縮する(ステップS53)。そして、画面情報送信部244は、圧縮済みの画面表示データをクライアント装置1へ送信する(ステップS54)。そして、画面情報転送部24は、カーソル位置補正処理に移行すべく、ステップS41に遷移する。
[実施例1の効果]
上記実施例1によれば、シンクライアントシステム9のサーバ装置2は、クライアント装置1から受信した、マウスカーソルの移動を伴う入力イベントについて、移動後のカーソルの位置を含むイベント情報を入力イベント履歴保持部21に保存する。そして、サーバ装置2は、入力イベントに基づいて処理した結果、処理前後でカーソルの位置に変化があったとき、変化があったカーソルの位置が入力イベント履歴保持部21に保持されているいずれかのカーソルの位置と一致しているか否かを判定する。そして、サーバ装置2は、判定の結果、変化があったカーソルの位置が入力イベント履歴保持部21に保持されているいずれかのカーソルの位置とも一致していない場合に、変化があったカーソルの位置をクライアント装置1に通知する。かかる構成によれば、サーバ装置2は、クライアント装置1から受信した入力イベントに基づく処理により処理前後で変化があったカーソルの位置が処理によって自動的に移動してしまう場合であっても、移動後のカーソルの位置をクライアント装置1に対応させることができる。
また、上記実施例1によれば、サーバ装置2が、判定の結果、変化があったカーソルの位置が入力イベント履歴保持部21に保持されているいずれかのカーソルの位置と一致した場合に、一致したカーソルの位置に係るイベント以前のイベント情報を削除する。かかる構成によれば、サーバ装置2は、入力イベントに関する次回の処理で、入力イベント履歴保持部21に保持されているカーソルの位置との比較回数を減らすことができるので、処理効率を上げることができる。
ところで、実施例1に係るサーバ装置2では、入力イベントの処理前後で変化があったマウスカーソルの位置が入力イベント履歴保持部21に保持されていると判定した場合、保持されていると判定した入力イベントの履歴以前の履歴を削除する場合を説明した。しかしながら、サーバ装置2は、変化があったマウスカーソルの位置が入力イベント履歴保持部21に保持されていると判定した場合、履歴を削除する前に保持されているキューの長さが長い場合には画面転送方式の処理間隔を調整するようにしても良い。
つまり、サーバ装置2では、画面転送方式における処理負荷が高くなる場合がある。かかる場合には、サーバ装置2は、クライアント装置1から送信された入力イベントの処理時間が長くなり、入力イベント履歴保持部21に保持される入力イベントのキュー長が長くなることがある。このため、サーバ装置2は、キュー長が閾値より大きい場合には画面転送方式の処理間隔を調整して、処理負荷を低減するようにしても良い。
そこで、実施例2では、入力イベント履歴保持部21に保持される入力イベントのキュー長が閾値より大きい場合には画面転送方式の処理間隔を調整するサーバ装置2について説明する。
[シンクライアントシステムに含まれる各装置の構成]
図9は、実施例2に係るシンクライアントシステムに含まれる各装置の構成を示す機能ブロック図である。なお、図1に示すシンクライアントシステム9と同一の構成については同一符号を示すことで、その重複する構成および動作の説明については省略する。実施例1と実施例2とが異なるところは、サーバ装置2Aのカーソル位置補正部23に入力イベント履歴保持数チェック部301を追加した点にある。
カーソル位置履歴チェック部232は、入力イベントの実行前後でカーソルの位置に変化があったカーソルの位置が入力イベント履歴保持部21に保持されているかどうかをチェックする。
入力イベント履歴保持数チェック部301は、変化があったマウスカーソルの位置が入力イベント履歴保持部21に保持されている場合、入力イベント履歴保持部21に保持されている入力イベントのキュー長が閾値以上であるか否かを判定する。例えば、入力イベント履歴保持数チェック部301は、入力イベント履歴保持部21に保持されている入力イベントの履歴の中で変化があったマウスカーソルの位置と一致した座標位置に関する入力イベント以前の入力イベントの数を数える。また、入力イベント履歴保持数チェック部301は、数えた入力イベントの数が閾値よりも大きいか否かを判定する。そして、入力イベント履歴保持数チェック部301は、数えた入力イベントの数が閾値よりも大きいと判定した場合には、処理負荷が高いと判断し、画面転送方式の処理間隔を現在の処理間隔より大きくする。一方、入力イベント履歴保持数チェック部301は、数えた入力イベントの数が閾値以下であると判定した場合には、処理負荷が低いと判断し、画面転送方式の処理間隔を現在の処理間隔より小さくするか、現在の処理間隔のままにする。そして、入力イベント履歴保持数チェック部301は、一致した座標位置に関する入力イベントの履歴以前の履歴を削除する。
なお、入力イベントの数と比較する閾値は、例えば3であるが、CPUの処理性能に応じて変更すれば良く、処理負荷が高くなると判定される値であれば良い。また、画面転送方式の処理間隔とは、画面の更新間隔(更新頻度)を指す。すなわち、カーソル位置変更チェック部231が、マウスカーソルが移動したか否かをチェックする時間間隔である所定の時間と一致する。つまり、画面転送方式の処理間隔が大きくなれば、所定の時間も大きくなり、画面転送方式の処理間隔が小さくなれば、所定の時間も小さくなる。
[カーソル位置補正の具体例]
次に、カーソル位置補正の具体例について、図10を参照して説明する。図10は、実施例2に係るカーソル位置補正の具体例を説明する図である。
図10に示すように、クライアント装置1Aでは、入力イベント取得部111が、クライアント装置1に接続されたマウスから入力イベントを取得する(ステップS1)。ここでは、入力イベントは、マウスの移動操作によりマウスの移動先が時系列に(x1、y1)、(x2、y2)および(x3、y3)と移動する3つのイベントとする。
入力イベント取得部111は、各入力イベントを時系列に取得し、取得した都度、取得した入力イベントを入力イベント送信部112およびカーソル描画部113に引き渡す。そして、入力イベント送信部112は、引き渡された各入力イベントをサーバ装置2Aに送信し、カーソル描画部113は、引き渡された各入力イベントを、OS10を介してデスクトップ画面に描画する(ステップS2)。ここでは、カーソル描画部113は、デスクトップ画面のP1にカーソルを描画した後、引き続きP2およびP3にカーソルを描画する。
サーバ装置2Aでは、入力イベント受信部221が、クライアント装置1Aから送信された各入力イベントを時系列に受信する。そして、入力イベント保存部222が、入力イベント受信部221によって受信された各入力イベントをイベント履歴として保持する。ここでは、入力イベント保存部222は、各入力イベントに含まれる移動先の座標P1、P2およびP3をイベント履歴として保持する。加えて、入力イベント実行部223が、入力イベント受信部221によって受信された各入力イベントをOS20に処理させる(ステップS3)。
そして、カーソル位置変更チェック部231は、OS20に処理させた結果であるマウスカーソルの座標を取得する(ステップS4)。そして、カーソル位置変更チェック部231は、取得したマウスカーソルの座標P1が処理前のマウスカーソルの座標と一致していない、すなわちマウスカーソルが移動したと判定する。そして、カーソル位置履歴チェック部232は、処理後のマウスカーソルの座標P1が入力イベント履歴として保持されているか否かを判定する。ここでは、処理後のマウスカーソルの座標P1が入力イベント履歴として保持されていると判定される。そこで、入力イベント履歴保持数チェック部301は、入力イベント履歴の中で対応する入力イベント以前のキュー長をチェックし、キュー長が閾値よりも大きいか否かを判定する(ステップS5A)。ここでは、P1に対応する入力イベント以前の入力イベント(P1、Px、Py、Pzに対応)が4個あるので、キュー長が4となる。閾値を3とした場合、キュー長(4)が閾値(3)よりも大きいと判定される。
そして、入力イベント履歴保持数チェック部301は、キュー長が閾値よりも大きいと判定したので、処理負荷が高いと判断し、画面転送方式の処理間隔を大きくする。そして、入力イベント履歴保持数チェック部301は、処理後のマウスカーソルの座標P1に関する入力イベントの履歴以前の履歴を削除する(ステップS6)。ここでは、P1、Px、Py、Pzに関する入力イベントの履歴が削除される。そして、引き続き、画面情報転送部24の処理が実行される。このように、サーバ装置2Aは、入力イベント履歴のキュー長が長い場合には処理負荷が高いと判断し、画面転送方式の処理間隔を大きくするようにして処理負荷を低減することで、操作性を向上させることができる。
[サーバ装置におけるカーソル位置補正処理の手順]
次に、サーバ装置2Aにおけるカーソル位置補正処理の手順について、図11を参照して説明する。図11は、実施例2に係るサーバ装置におけるカーソル位置補正処理の手順を示すフローチャートである。なお、図7に示す実施例1に係るサーバ装置におけるカーソル位置補正処理と同一の処理については同一符号を示す。
カーソル位置変更チェック部231は、所定の時間経過したか否かを判定する(ステップS41)。所定の時間経過していないと判定した場合(ステップS41;No)、カーソル位置変更チェック部231は、所定の時間が経過するまで、判定処理を繰り返す。
一方、所定の時間経過したと判定した場合(ステップS41;Yes)、カーソル位置変更チェック部231は、マウスカーソルが移動したかどうかをチェックする(ステップS42)。例えば、カーソル位置変更チェック部231は、OS20に入力イベントを処理させた結果、OS20から処理に対応したマウスカーソルの位置を取得する。そして、カーソル位置変更チェック部231は、取得したマウスカーソルの位置が入力イベントを処理させる前のマウスカーソルの位置と一致しているか否かを判定する(ステップS42)。ここで、所定の時間とは、例えば1フレームの画面表示データの更新時間を示す。
そして、マウスカーソルが移動していないと判定した場合(ステップS42;No)、カーソル位置補正部23は、カーソル位置補正処理を終了し、画面情報転送処理に移行する。一方、マウスカーソルが移動したと判定した場合(ステップS42;Yes)、カーソル位置履歴チェック部232は、移動後のマウスカーソルの位置に対応する入力イベントが存在するか否かを判定する(ステップS43)。例えば、カーソル位置履歴チェック部232は、変化があったマウスカーソルの位置が入力イベント履歴保持部21の入力イベントの履歴として保持されているいずれかの座標位置と一致しているか否かを判定する。
そして、対応する入力イベントが存在すると判定した場合(ステップS43;Yes)、入力イベント履歴保持数チェック部301は、対応する入力イベント以前の入力イベントの数(キュー長)を数える(ステップS401)。例えば、入力イベント履歴保持数チェック部301は、入力イベント履歴保持部21に保持されている入力イベントの履歴の中で変化があったマウスカーソルの位置と一致した座標位置に関する入力イベント以前の入力イベントの数を数える。
そして、入力イベント履歴保持数チェック部301は、キュー長が閾値よりも大きいか否かを判定する(ステップS402)。キュー長が閾値よりも大きいと判定した場合(ステップS402;Yes)、入力イベント履歴保持数チェック部301は、処理負荷が高いと判断し、画面転送方式の処理間隔を大きくする(ステップS403)。
一方、キュー長が閾値以下であると判定した場合(ステップS402;No)、入力イベント履歴保持数チェック部301は、処理負荷が低いと判断し、画面転送方式の処理間隔を小さくする(ステップS404)。そして、入力イベント履歴保持数チェック部301は、対応した入力イベントの履歴以前の履歴を削除する(ステップS44)。そして、カーソル位置補正部23は、カーソル位置補正処理を終了し、画面情報転送処理に移行する。
ステップS43に戻って、対応する入力イベントが存在しないと判定した場合(ステップS43;No)、カーソル位置履歴チェック部232は、カーソルの位置がOS20によって自動的に変更されたと判断する。そして、カーソル位置履歴チェック部232は、カーソル位置補正情報送信部233にカーソル位置補正情報をクライアント装置1Aへ送信させる(ステップS45)。例えば、カーソル位置補正情報送信部233は、変更されたカーソルの位置を含むカーソル位置補正情報をクライアント装置1Aへ送信する。そして、カーソル位置補正部23は、カーソル位置補正処理を終了し、画面情報転送処理に移行する。
[実施例2の効果]
上記実施例2によれば、シンクライアントシステム9のサーバ装置2Aは、クライアント装置1Aから受信した、マウスカーソルの移動を伴う入力イベントについて、移動後のカーソルの位置を含むイベント情報を入力イベント履歴保持部21に保存する。そして、サーバ装置2Aは、入力イベントに基づいて処理した結果、処理前後でカーソルの位置に変化があったとき、変化があったカーソルの位置が入力イベント履歴保持部21に保持されているいずれかのカーソルの位置と一致しているか否かを判定する。そして、サーバ装置2Aは、判定の結果、変化があったカーソルの位置が入力イベント履歴保持部21に保持されているいずれかのカーソルの位置と一致した場合に、一致したカーソルの位置に係るイベント以前のイベントの数が閾値より大きいか否かを判定する。そして、サーバ装置2Aは、一致したカーソルの位置に係るイベント以前のイベントの数が閾値より大きいと判定した場合、画面転送方式の処理間隔を現在の処理間隔より大きくする。かかる構成によれば、サーバ装置2Aは、入力イベント履歴保持部21に保持されている該当するイベントの数が閾値より大きい場合には、カーソルの位置の移動を伴う入力イベント処理の間隔が長くなっているので、自装置の処理負荷が高いと想定される。このため、サーバ装置2は、画面転送方式の処理間隔を大きくすることで、処理負荷を低減することができる。この結果、サーバ装置2Aは、シンクライアントシステム9の操作性を向上させることができる。
ところで、実施例1に係るサーバ装置2では、入力イベントの処理でマウスカーソルが自動的に移動した場合、自動的に移動したマウスカーソルの位置をクライアント装置1に送信する場合を説明した。しかしながら、サーバ装置2は、これに限定されず、マウスカーソルが自動的に移動した場合、自動的に移動したマウスカーソルの位置と形状とをクライアント装置1に送信するようにしても良い。これは、マウスカーソルの位置が自動的に移動した場合に、移動後の位置によってはマウスカーソルの形状も変化する場合があるためである。
そこで、実施例3では、マウスカーソルが自動的に移動した場合、自動的に移動したマウスカーソルの位置と形状とをクライアント装置1に送信するサーバ装置2について説明する。
[シンクライアントシステムに含まれる各装置の構成]
図12は、実施例3に係るシンクライアントシステムに含まれる各装置の構成を示す機能ブロック図である。なお、図1に示すシンクライアントシステム9と同一の構成については同一符号を示すことで、その重複する構成および動作の説明については省略する。実施例1と実施例3とが異なるところは、サーバ装置2Bのカーソル位置補正部23にカーソル形状チェック部401およびカーソル形状補正情報送信部402を追加した点にある。また、実施例1と実施例3とが異なるところは、クライアント装置1Bの画面描画部12にカーソル形状補正情報受信部403およびカーソル形状補正部404を追加した点にある。
カーソル位置履歴チェック部232は、入力イベントの実行前後でカーソルの位置に変化があったカーソルの位置が入力イベント履歴保持部21に保持されているかどうかをチェックする。
カーソル形状チェック部401は、変化があったマウスカーソルの位置が入力イベント履歴保持部21に保持されていない場合、さらにマウスカーソルの形状が変化したか否かをチェックする。例えば、カーソル形状チェック部401は、OS20を用いて、マウスカーソルの形状が変化したか否かを判定する。そして、カーソル形状チェック部401は、マウスカーソルの形状が変化した場合、変化後のマウスカーソルの形状をカーソル形状補正情報送信部402に通知する。すなわち、カーソル形状チェック部401は、OS20によって自動的に変更されたマウスカーソルの位置に伴い形状も変化した場合に、変化した形状をカーソル形状補正情報送信部402に通知する。
カーソル形状補正情報送信部402は、カーソル形状チェック部401によって通知されたカーソルの形状を含むカーソル形状補正情報をクライアント装置1Bに送信する。これによって、サーバ装置2Bは、OS20によって自動的に変更されたマウスカーソルの位置に伴い変化したマウスカーソルの形状をクライアント装置1Bに補正させることができる。
カーソル形状補正情報受信部403は、カーソル形状情報をサーバ装置2Bから受信する。ここで、カーソル形状補正情報とは、サーバ装置2Bによって補正されるカーソルの形状情報である。つまり、サーバ装置2Bでは、クライアント装置1Bから送信された入力イベントを処理した結果、処理後のマウスカーソルの位置および形状がOS20によって自動的に変更される場合がある。かかる場合に、カーソル形状補正情報受信部403は、カーソル形状補正情報をサーバ装置2Bから受信し、受信したカーソル形状補正情報を用いてカーソルの形状を補正させてサーバ装置2Bのカーソルの形状と対応させる。
カーソル形状補正部404は、カーソル形状補正情報受信部403によって受信されたカーソル形状補正情報からマウスカーソルの補正形状を抽出する。また、カーソル形状補正部404は、カーソル描画部113に、抽出した補正形状のマウスカーソルを再描画させる。
[カーソル位置補正の具体例]
次に、カーソル位置補正の具体例について、図13を参照して説明する。図13は、実施例3に係るカーソル位置補正の具体例を説明する図である。なお、図13では、サーバ装置2Bは、マウスの移動操作によりマウスの表示位置が移動する入力イベントをクライアント装置1Bから受信する。そして、入力イベントの中でP1およびP2に移動先が移動する各入力イベントについて、処理後のカーソルの位置がOS20によって自動的に移動しない例とする。さらに、入力イベントの中でP2からP3に移動先が移動する入力イベントについて、処理後のカーソルの位置がOS20によってP3からP4に自動的に移動するとともにカーソルの形状も矢印形状から三角形状に変化する例とする。以降では、P2からP3に移動先が移動する入力イベントの場合について説明する。
図13に示すように、クライアント装置1Bでは、入力イベント取得部111が、クライアント装置1Bに接続されたマウスから入力イベントを取得する(ステップS1)。ここでは、入力イベント取得部111は、マウスの移動操作によりマウスの移動先が(x3、y3)となる入力イベントを取得する。
入力イベント取得部111は、取得した入力イベントを入力イベント送信部112およびカーソル描画部113に引き渡す。そして、入力イベント送信部112は、引き渡された入力イベントをサーバ装置2Bに送信し、カーソル描画部113は、引き渡された入力イベントを、OS10を介してデスクトップ画面に描画する(ステップS2)。ここでは、カーソル描画部113は、デスクトップ画面のP3にカーソルを描画する。
サーバ装置2Bでは、入力イベント受信部221が、クライアント装置1Bから送信された入力イベントを受信する。そして、入力イベント保存部222が、入力イベント受信部221によって受信された入力イベントをイベント履歴として保持する。ここでは、入力イベント保存部222は、入力イベントに含まれる移動先の座標P3をイベント履歴として保持する。加えて、入力イベント実行部223が、入力イベント受信部221によって受信された入力イベントをOS20に処理させる(ステップS3)。
そして、カーソル位置変更チェック部231は、OS20に処理させた後のマウスカーソルの座標を取得する(ステップS4)。ここでは、OS20によってマウスカーソルの位置が自動的にP3からP4(x4、y4)に変更する。すると、カーソル位置変更チェック部231は、変更された座標P4が処理前のマウスカーソルの座標P2と一致していないと判定する。そこで、カーソル位置履歴チェック部232は、処理後のマウスカーソルの座標P4が入力イベント履歴として保持されているか否かを判定する(ステップS5)。ここでは、処理後のマウスカーソルの座標P4がOS20によって座標P3から自動的に変更されたので、入力イベント履歴として保持されていない。そこで、カーソル位置履歴チェック部232は、変更されたマウスカーソルの座標P4をカーソル位置補正情報送信部233に通知させる(ステップS7)。
さらに、カーソル形状チェック部401は、マウスカーソルの形状が変化したか否かを、OS20を用いて判定する。ここでは、処理後のマウスカーソルの形状が矢印形状から三角形状に変化している。そこで、カーソル形状チェック部401は、変化したマウスカーソルの三角形状をカーソル形状補正情報送信部402に通知させる(ステップS8)。
クライアント装置1Bでは、カーソル位置補正情報受信部121が、変更されたマウスカーソルの座標P4を受信する。そして、カーソル位置補正部122は、カーソル描画部113によって、変更されたマウスカーソルの座標P4にマウスカーソルを再描画させる。続いて、カーソル形状補正情報受信部403が、変化したマウスカーソルの形状を受信する。そして、カーソル形状補正部404は、カーソル描画部113によって、変化したマウスカーソルを再描画させる。
このように、サーバ装置2Bがクライアント装置1Bから送信された入力イベントを処理した結果、処理後のマウスカーソルの形状が変化した場合であっても、変化したマウスカーソルの形状をクライアント装置1Bに対応させることができる。
[クライアント装置における画面描画処理の手順]
次に、クライアント装置1Bにおける画面描画処理の手順について、図14を参照して説明する。図14は、実施例3に係るクライアント装置における画面描画処理の手順を示すフローチャートである。なお、図5に示す実施例1に係るサーバ装置における画面描画処理と同一の処理については同一符号を示す。
まず、画面描画部12は、サーバ装置2から画面転送方式に関するデータを受信したか否かを判定する(ステップS21)。画面転送方式に関するデータを受信していないと判定した場合(ステップS21;No)、画面描画部12は、画面転送方式に関するデータを受信するまで、判定処理を繰り返す。
画面転送方式に関するデータを受信したと判定した場合(ステップS21;Yes)、カーソル位置補正情報受信部121がカーソル位置補正情報を受信したか否かを判定する(ステップS22)。カーソル位置補正情報を受信したと判定した場合(ステップS22;Yes)、カーソル位置補正情報受信部121は、カーソル位置補正情報を受信する(ステップS23)。
続いて、カーソル位置補正部122は、受信したカーソル位置補正情報から補正位置を抽出し、抽出した補正位置にマウスカーソルの位置を補正する(ステップS24)。そして、カーソル描画部113は、補正された位置にマウスカーソルを再描画する(ステップS25)。そして、画面描画部12は、次の画面転送方式に関するデータを待つべく、ステップS21に移行する。
ステップS22において、カーソル位置補正情報を受信しなかったと判定した場合(ステップS22;No)、カーソル形状補正情報受信部403がカーソル形状補正情報を受信したか否かを判定する(ステップS61)。カーソル形状補正情報を受信したと判定した場合(ステップS61;Yes)、カーソル形状補正情報受信部403は、カーソル形状補正情報を受信する(ステップS62)。
続いて、カーソル形状補正部404は、受信したカーソル形状補正情報から補正形状を抽出し、抽出した補正形状にマウスカーソルの形状を補正する(ステップS63)。そして、画面描画部12は、次の画面転送方式に関するデータを待つべく、ステップS21に移行する。
ステップS61において、カーソル形状補正情報を受信しなかったと判定した場合(ステップS61;No)、画面情報受信部123は、画面情報を受信したか否かを判定する(ステップS26)。画面情報を受信したと判定した場合(ステップS26;Yes)、画面情報受信部123は、圧縮後の画面表示データを受信する(ステップS27)。
続いて、画像展開処理部124は、圧縮後の画面表示データを展開する(ステップS28)。そして、画面情報描画部125は、展開して得られた画面表示データを使用してデスクトップ画面を再描画する(ステップS29)。そして、画面描画部12は、次の画面転送方式に関するデータを待つべく、ステップS21に移行する。
ステップS26において、画面情報を受信しなかったと判定した場合(ステップS26;No)、画面情報受信部123は、画面転送方式とは無関係のデータを受信したので、ここでは何もしない(ステップS30)。そして、画面描画部12は、次の画面転送方式に関するデータを待つべく、ステップS21に移行する。
[サーバ装置におけるカーソル位置補正処理の手順]
次に、サーバ装置2Bにおけるカーソル位置補正処理の手順について、図15を参照して説明する。図15は、実施例3に係るサーバ装置におけるカーソル位置補正処理の手順を示すフローチャートである。なお、図7に示す実施例1に係るサーバ装置におけるカーソル位置補正処理と同一の処理については同一符号を示す。
カーソル位置変更チェック部231は、所定の時間経過したか否かを判定する(ステップS41)。所定の時間経過していないと判定した場合(ステップS41;No)、カーソル位置変更チェック部231は、所定の時間が経過するまで、判定処理を繰り返す。
一方、所定の時間経過したと判定した場合(ステップS41;Yes)、カーソル位置変更チェック部231は、マウスカーソルが移動したかどうかをチェックする(ステップS42)。例えば、カーソル位置変更チェック部231は、OS20に入力イベントを処理させた結果、OS20から処理に対応したマウスカーソルの位置を取得する。そして、カーソル位置変更チェック部231は、取得したマウスカーソルの位置が入力イベントを処理させる前のマウスカーソルの位置と一致しているか否かを判定する。ここで、所定の時間とは、例えば1フレームの画面表示データの更新時間を示す。
そして、マウスカーソルが移動していないと判定した場合(ステップS42;No)、カーソル位置補正部23は、カーソル位置補正処理を終了し、画面情報転送処理に移行する。一方、マウスカーソルが移動したと判定した場合(ステップS42;Yes)、カーソル位置履歴チェック部232は、移動後のマウスカーソルの位置に対応する入力イベントが存在するか否かを判定する(ステップS43)。例えば、カーソル位置履歴チェック部232は、変化があったマウスカーソルの位置が入力イベント履歴保持部21の入力イベントの履歴として保持されているいずれかの座標位置と一致しているか否かを判定する。
そして、対応する入力イベントが存在すると判定した場合(ステップS43;Yes)、カーソル位置履歴チェック部232は、対応した入力イベントの履歴以前の履歴を削除する(ステップS44)。そして、カーソル位置補正部23は、カーソル位置補正処理を終了し、画面情報転送処理に移行する。
一方、対応する入力イベントが存在しないと判定した場合(ステップS43;No)、カーソル位置履歴チェック部232は、カーソルの位置がOS20によって自動的に変更されたと判断する。そして、カーソル位置履歴チェック部232は、カーソル位置補正情報送信部233にカーソル位置補正情報をクライアント装置1へ送信させる(ステップS45)。例えば、カーソル位置補正情報送信部233は、変更されたカーソルの位置を含むカーソル位置補正情報をクライアント装置1へ送信する。
続いて、カーソル形状チェック部401は、マウスカーソルの形状が変化したか否かを判定する。マウスカーソルの形状が変化していないと判定した場合(ステップS71;No)、カーソル形状チェック部401は、カーソル位置補正処理を終了し、画面情報転送処理に移行する。
一方、マウスカーソルの形状が変化したと判定した場合(ステップS71;Yes)、カーソル形状補正情報送信部402は、カーソル形状補正情報送信部402にカーソル形状補正情報をクライアント装置1Bへ送信させる(ステップS72)。例えば、カーソル形状補正情報送信部402は、変化後のカーソルの形状を含むカーソル形状補正情報をクライアント装置1Bへ送信する。そして、カーソル位置補正部23は、カーソル位置補正処理を終了し、画面情報転送処理に移行する。
[実施例3の効果]
上記実施例3によれば、シンクライアントシステム9のサーバ装置2Bは、マウスカーソルの移動を伴う入力イベントをクライアント装置1Bから受信する。そして、サーバ装置2Bは、受信した入力イベントについて移動後のカーソルの位置を含むイベント情報を入力イベント履歴保持部21に保存する。そして、サーバ装置2Bは、入力イベントに基づいて処理した結果、処理前後でカーソルの位置に変化があったとき、変化があったカーソルの位置が入力イベント履歴保持部21に保持されているいずれかのカーソルの位置と一致しているか否かを判定する。そして、サーバ装置2Bは、判定の結果、変化があったカーソルの位置が入力イベント履歴保持部21に保持されているいずれかのカーソルの位置とも一致していない場合に、変化があったカーソルの位置をクライアント装置1Bに通知する。さらに、サーバ装置2Bは、入力イベントに基づいて処理した結果、処理前後でカーソルの形状に変化があったとき、変化があったカーソルの形状をクライアント装置1Bに通知する。かかる構成によれば、サーバ装置2Bは、クライアント装置1Bから受信した入力イベントに基づく処理により処理前後でカーソルの形状に変化があった場合であっても、変化後のカーソルの形状をクライアント装置1Bに対応させることができる。
ところで、実施例1に係るサーバ装置2では、入力イベントの処理でマウスカーソルが自動的に移動した場合、自動的に移動したマウスカーソルの位置をクライアント装置1に補正する場合を説明した。しかしながら、サーバ装置2では、マウスカーソルの移動領域が制限される場合がある。かかる場合に、クライアント装置1では、ローカルエコー方式で描画するマウスカーソルの位置がサーバ装置2で移動が制限された領域内であると、サーバ装置2から補正される位置を再描画すると、移動軌跡が不自然になる。
このローカルエコー方式における問題について、図16を参照して説明する。図16は、ローカルエコー方式における問題を説明する図である。図16に示すように、サーバ装置2Cのデスクトップ画面の領域G1について、マウスカーソルの移動が制限されている。すなわち、サーバ装置2Cのデスクトップ画面では、制限領域G1以外の領域G2について、マウスカーソルの移動が許可されている。このような状況下で、クライアント装置1C側では、制限領域G1に対応する領域G1´方向に移動する入力イベントが繰り返し発生するとする。すると、サーバ装置2C側は、クライアント装置1C側で発生した入力イベントを受信する都度、制限領域G1と許可領域G2との境界にカーソル位置を補正することになり、補正したカーソル位置をクライアント装置1Cに送信することになる。そうすると、クライアント装置1C側では、入力イベントが発生した時点でローカルエコーによりカーソルを一旦描画しても、サーバ装置2Cから送信される、補正されたカーソル位置を再描画するので、マウスカーソルの移動軌跡が不自然となってしまう。図16の例では、サーバ装置2C側では、マウスカーソルの移動軌跡が制限領域G1と許可領域G2との境界のX軸方向(横方向)のみとなっている。一方、クライアント装置1C側では、マウスカーソルの移動軌跡が上下方向にぎざぎざとなり、不自然な軌跡となっている。
そこで、実施例4では、サーバ装置2Cでマウスカーソルの移動領域が制限される場合であっても、クライアント装置1Cのマウスカーソルの移動軌跡が不自然になることを防止するサーバ装置2Cについて説明する。
[シンクライアントシステムに含まれる各装置の構成]
図17は、実施例4に係るシンクライアントシステムに含まれる各装置の構成を示す機能ブロック図である。なお、図1に示すシンクライアントシステム9と同一の構成については同一符号を示すことで、その重複する構成および動作の説明については省略する。実施例1と実施例4とが異なるところは、サーバ装置2Cのカーソル位置補正部23にカーソル移動方向判定部501およびカーソル移動方向通知部502を追加した点にある。また、実施例1と実施例4とが異なるところは、クライアント装置1Cの入力イベント処理部11にカーソル移動方向限定処理部50を追加し、カーソル移動方向限定処理部50にカーソル移動方向受信部503を追加した点にある。さらに、実施例1と実施例4とが異なるところは、クライアント装置1の入力イベント処理部11にカーソル移動方向限定部504を追加した点にある。
カーソル位置変更チェック部231は、入力イベント実行部223によって入力イベントが実行された結果、実行前後でカーソルの位置に変化があったか否かを判定する。
カーソル移動方向判定部501は、実行前後でカーソルの位置に変化があった場合に、マウスカーソルの移動方向を判定する。カーソル移動方向判定部501は、マウスカーソルの移動方向がX軸方向のみに移動したと判定した場合、X軸方向をカーソル移動の限定方向と決定する。また、カーソル移動方向判定部501は、マウスカーソルの移動方向がY軸方向のみに移動したと判定した場合、Y軸方向をカーソル移動の限定方向と決定する。
カーソル移動方向通知部502は、カーソル移動方向判定部501によって決定されたカーソル移動の限定方向をクライアント装置1Cに通知する。
カーソル位置履歴チェック部232は、実行前後で変化があったカーソルの位置が入力イベント履歴保持部21に保持されているかどうかをチェックする。ここで、カーソル位置履歴チェック部232は、カーソル移動の限定方向が決定されている場合には、決定された限定方向のみでチェックする。例えば、カーソル位置履歴チェック部232は、カーソル移動の限定方向がX軸方向である場合、変化があったマウスカーソルのX軸の座標が入力イベント履歴保持部21のいずれかのX軸の座標と一致しているか否かを判定する。
カーソル位置履歴チェック部232は、変化があったカーソルの位置が入力イベント履歴保持部21に保持されていると判定した場合、保持されていると判定した入力イベントの履歴以前の履歴を削除する。一方、カーソル位置履歴チェック部232は、変化があったマウスカーソルの位置が入力イベント履歴保持部21に保持されていないと判定した場合、変化があったマウスカーソルの位置をカーソル位置補正情報送信部233に通知する。
カーソル移動方向受信部503は、カーソル移動の限定方向をサーバ装置2Cから受信する。カーソル移動方向限定部504は、自装置側でのマウスカーソルの移動方向を、カーソル移動方向受信部503によって受信されたカーソル移動の限定方向に限定する。
[カーソル位置補正の具体例]
次に、カーソル位置補正の具体例について、図18を参照して説明する。図18は、実施例4に係るカーソル位置補正の具体例を説明する図である。なお、サーバ装置2Cのデスクトップ画面において、マウスカーソルの移動可能な領域が、Y軸の座標位置「100」以上(ここでは下方向)の場合とする。すなわち、図18の例では、クライアント装置1Cのデスクトップ画面において、マウスカーソルがY軸の座標位置「100」未満(ここでは上方向)に移動すると、Y軸の座標位置「100」に補正されるものとする。
図18に示すように、クライアント装置1Cは、マウスの移動先を図示しないP1´(205、95)とした入力イベントを取得したとき、ローカルエコーを行った後に、サーバ装置2CによりY軸の値が補正された補正位置P1(205、100)に再描画する。
次に、入力イベント取得部111は、マウスの移動先をP2(210、100)とした入力イベントを取得する(ステップS1)。入力イベント取得部111は、取得した入力イベントを入力イベント送信部112およびカーソル移動方向限定部504に引き渡す。そして、カーソル移動方向限定部504は、マウスカーソルの移動方向が限定されている場合は、引き渡された入力イベントについてマウスカーソルの移動方向を限定する。そして、カーソル描画部113は直前の座標から限定された移動方向のみに移動させた座標でローカルエコーを行う。一方、カーソル移動方向限定部504は、マウスカーソルの移動方向が限定されていない場合は、カーソル描画部113を介して入力イベントの座標にカーソルを描画する。それと同時に、入力イベント送信部112は、引き渡された入力イベントをそのままサーバ装置2Cに送信する(ステップS2C)。ここでは、マウスカーソルの移動方向が限定されていないので、カーソル描画部113は、P2(210、100)の位置にそのままカーソルを描画する。
サーバ装置2では、入力イベント受信部221が、クライアント装置1Cから送信された入力イベントを受信する。そして、入力イベント保存部222が、入力イベント受信部221によって受信された入力イベントをイベント履歴として保持する。ここでは、入力イベント保存部222は、入力イベントに含まれる移動先の座標P2をイベント履歴として保持する。加えて、入力イベント実行部223が、入力イベント受信部221によって受信された入力イベントをOS20に処理させる(ステップS3)。
そして、カーソル位置変更チェック部231は、OS20に処理させた結果であるマウスカーソルの座標を取得する(ステップS4)。そして、カーソル移動方向判定部501は、取得したマウスカーソルの座標が処理前のマウスカーソルの座標と一致していない、すなわちマウスカーソルが移動したので、マウスカーソル移動の限定方向を決定する(ステップS5C)。ここでは、カーソル移動方向判定部501は、前回の座標が(205、100)、今回の座標が(210、100)であるのでX軸方向をカーソル移動の限定方向と決定する。そこで、カーソル移動方向判定部501は、カーソル移動方向通知部502を介して、カーソル移動の限定方向(X軸)をクライアント装置1Cに通知する(ステップS6C)。
そして、カーソル位置履歴チェック部232は、処理後のマウスカーソルの座標P2が入力イベント履歴として保持されているか否かを、決定されたカーソル移動の限定方向を用いて判定する(ステップS7C)。ここでは、決定されたカーソル移動の限定方向がX軸方向であるので、処理後のマウスカーソルの座標P2のうちX軸の座標値「210」が入力イベント履歴として保持されているので、座標P2以前の履歴を削除する(ステップS8C)。このようにマウスの移動先が座標P2となる入力イベントの場合には、処理後のマウスカーソルの座標P2がOS20によって自動的に変更されていないので、クライアント装置1Cに対して座標の補正をしないで、処理を終了することとなる。なお、カーソル位置履歴チェック部232は、処理後のマウスカーソルの座標のうちカーソル移動の限定方向の座標値が入力イベント履歴として保持されていない場合、処理後のマウスカーソルの座標をクライアント装置1Cに送信する(ステップS9C)。
クライアント装置1Cでは、入力イベント取得部111は、次の入力イベントを取得する(ステップS1)。ここでは、マウスの移動先が、例えばP3´(215、95)となる入力イベントを取得するものとする。入力イベント取得部111は、取得した入力イベントを入力イベント送信部112およびカーソル移動方向限定部504に引き渡す。そして、カーソル移動方向限定部504は、マウスカーソルの移動方向がX軸方向に限定されているので、引き渡された入力イベントについてマウスカーソルの移動方向であるX軸方向を限定する。そして、カーソル描画部113は直前の座標P2から限定されたX軸方向のみに移動させた座標P3(215、100)でローカルエコーを行う。それと同時に、入力イベント送信部112は、引き渡された入力イベントをそのままサーバ装置2Cに送信する(ステップS2C)。
以降、サーバ装置2Cおよびクライアント装置1Cでは、クライアント装置1C側で発生した入力イベントについて、引き続き処理が行われる。このようにして、サーバ装置2C側でマウスカーソルの移動領域が制限された場合であっても、サーバ装置2Cは、クライアント装置1Cのマウスカーソルの移動軌跡が不自然になることを防止できる。
[クライアント装置における入力イベント処理の手順]
次に、クライアント装置1Cにおける入力イベント処理の手順について、図19を参照して説明する。図19は、実施例4に係るクライアント装置における入力イベント処理の手順を示すフローチャートである。なお、図4に示す実施例1に係るクライアント装置における入力イベント処理と同一の処理については同一符号を示す。
まず、入力イベント取得部111は、未処理の入力イベントが存在するか否かを判定する(ステップS11)。未処理の入力イベントが存在しないと判定した場合(ステップS11;No)、入力イベント取得部111は、未処理の入力イベントが存在すると判定するまで、判定処理を繰り返す。一方、未処理の入力イベントが存在すると判定した場合(ステップS11;Yes)、入力イベント取得部111は、入力イベントを取得する(ステップS12)。
続いて、カーソル移動方向限定部504は、マウスカーソルの移動方向を限定しているか否かを判定する(ステップS81)。マウスカーソルの移動方向を限定していると判定した場合(ステップS81;Yes)、カーソル移動方向限定部504は、限定中の移動方向と入力イベントからマウスカーソルの座標を算出する(ステップS82)。一方、マウスカーソルの移動方向を限定していないと判定した場合(ステップS81;No)、カーソル移動方向限定部504は、入力イベントからマウスカーソルの座標を抽出する(ステップS83)。
そして、カーソル描画部113は、算出または抽出したマウスカーソルの座標に基づいて、自装置のデスクトップ画面へマウスカーソルを再描画する(ステップS13)。
そして、入力イベント送信部112は、入力イベント取得部111によって取得された入力イベントをそのままサーバ装置2へ送信する(ステップS14)。そして、入力イベント処理部11は、次のイベントが発生するのを待つべく、ステップS11に移行する。
[クライアント装置におけるカーソル移動方向限定処理の手順]
次に、クライアント装置1Cにおけるカーソル移動方向限定処理の手順について、図20を参照して説明する。図20は、実施例4に係るクライアント装置におけるカーソル移動方向限定処理の手順を示すフローチャートである。
まず、カーソル移動方向受信部503は、カーソル移動方向に関する通知をサーバ装置2Cから受信したか否かを判定する(ステップS91)。カーソル移動方向に関する通知を受信していないと判定した場合(ステップS91;No)、カーソル移動方向受信部503は、当該通知を受信するまで、判定処理を繰り返す。
一方、カーソル移動方向に関する通知を受信したと判定した場合(ステップS91;Yes)、カーソル移動方向受信部503は、マウスカーソルの移動方向に関する通知を受信する(ステップS92)。
ここで、カーソル移動方向受信部503が、マウスカーソル移動の限定方向に関する通知を受信したか否かを判定する(ステップS93)。マウスカーソル移動の限定方向通知を受信したと判定した場合(ステップS93;Yes)、カーソル移動方向限定部504は、クライアント側でのマウスカーソルの移動方向を限定するように制御する(ステップS94)。そして、カーソル移動方向限定処理部50は、次のカーソル移動方向に関する通知を待つべく、ステップS91に移行する。
一方、マウスカーソル移動の限定方向に関する通知を受信していないと判定した場合(ステップS93;No)、カーソル移動方向受信部503は、マウスカーソル移動の限定解除通知を受信したか否かを判定する(ステップS95)。マウスカーソル移動の限定解除通知を受信していないと判定した場合(ステップS95;No)、カーソル移動方向限定処理部50は、次のカーソル移動方向に関する通知を待つべく、ステップS91に移行する。
一方、マウスカーソル移動の限定解除通知を受信したと判定した場合(ステップS95;Yes)、カーソル移動方向限定部504は、クライアント側でのマウスカーソルの移動方向を限定しないように制御する(ステップS96)。そして、カーソル移動方向限定処理部50は、次のカーソル移動方向に関する通知を待つべく、ステップS91に移行する。
[サーバ装置におけるカーソル位置補正処理の手順]
次に、サーバ装置2Cにおけるカーソル位置補正処理の手順について、図21を参照して説明する。図21は、実施例4に係るサーバ装置におけるカーソル位置補正処理の手順を示すフローチャートである。なお、図7に示す実施例1に係るサーバ装置におけるカーソル位置補正処理と同一の処理については同一符号を示す。
カーソル位置変更チェック部231は、所定の時間経過したか否かを判定する(ステップS41)。所定の時間経過していないと判定した場合(ステップS41;No)、カーソル位置変更チェック部231は、所定の時間が経過するまで、判定処理を繰り返す。
一方、所定の時間経過したと判定した場合(ステップS41;Yes)、カーソル位置変更チェック部231は、マウスカーソルが移動したかどうかをチェックする(ステップS42)。
そして、マウスカーソルが移動していないと判定した場合(ステップS42;No)、カーソル位置補正部23は、カーソル位置補正処理を終了し、画面情報転送処理に移行する。一方、マウスカーソルが移動したと判定した場合(ステップS42;Yes)、カーソル移動方向判定部501は、マウスカーソルが移動した方向を判定する(ステップS101)。ここで、カーソル移動方向判定部501は、マウスカーソルがX軸方向のみに移動したか否かを判定する(ステップS102)。
マウスカーソルがX軸方向のみに移動したと判定した場合(ステップS102;Yes)、カーソル移動方向判定部501は、1回以上マウスカーソル移動の限定方向(X軸方向)を通知済みであるか否かを判定する(ステップS103)。1回以上通知済みであると判定した場合(ステップS103;Yes)、カーソル移動方向判定部501は、通知は不要と判断し、ステップS110に移行する。一方、1回以上通知済みでないと判定した場合(ステップS103;No)、カーソル移動方向通知部502は、X軸方向をカーソル移動の限定方向としてクライアント装置1Cへ通知し(ステップS104)、ステップS110に移行する。
一方、マウスカーソルがX軸方向のみに移動していないと判定した場合(ステップS102;No)、カーソル移動方向判定部501は、マウスカーソルがY軸方向のみに移動したか否かを判定する(ステップS105)。
マウスカーソルがY軸方向のみに移動したと判定した場合(ステップS105;Yes)、カーソル移動方向判定部501は、1回以上マウスカーソル移動の限定方向(Y軸方向)を通知済みであるか否かを判定する(ステップS106)。1回以上通知済みであると判定した場合(ステップS106;Yes)、カーソル移動方向判定部501は、通知は不要と判断し、ステップS110に移行する。一方、1回以上通知済みでないと判定した場合(ステップS106;No)、カーソル移動方向通知部502は、Y軸方向をカーソル移動の限定方向としてクライアント装置1Cへ通知し(ステップS107)、ステップS110に移行する。
一方、マウスカーソルがY軸方向のみに移動していないと判定した場合(ステップS105;No)、カーソル移動方向判定部501は、マウスカーソルの移動方向の限定解除を通知したか否かを判定する(ステップS108)。マウスカーソルの移動方向の限定解除を通知したと判定した場合(ステップS108;Yes)、カーソル移動方向判定部501は、通知は不要と判断し、ステップS110に移行する。一方、マウスカーソルの移動方向の限定解除を通知していないと判定した場合(ステップS108;No)、カーソル移動方向通知部502は、カーソル移動の限定解除をクライアント装置1Cへ通知し(ステップS109)、ステップS110に移行する。
カーソル位置履歴チェック部232は、移動後のマウスカーソルの位置に対応する入力イベントが存在するか否かを判定する(ステップS110)。例えば、カーソル位置履歴チェック部232は、変化があったマウスカーソルの位置が入力イベント履歴保持部21の入力イベントの履歴として保持されているいずれかの座標位置と一致しているか否かを判定する。このとき、カーソル位置履歴チェック部232は、カーソル移動方向が限定中である場合には、限定されている座標軸方向の座標値のみをチェックすれば良い。
そして、対応する入力イベントが存在すると判定した場合(ステップS110;Yes)、カーソル位置履歴チェック部232は、対応した入力イベントの履歴以前の履歴を削除する(ステップS44)。そして、カーソル位置補正部23は、カーソル位置補正処理を終了し、画面情報転送処理に移行する。
一方、対応する入力イベントが存在しないと判定した場合(ステップS110;No)、カーソル位置履歴チェック部232は、カーソルの位置がOS20によって自動的に変更されたと判断する。そして、カーソル位置履歴チェック部232は、カーソル位置補正情報送信部233にカーソル位置補正情報をクライアント装置1Cへ送信させる(ステップS45)。そして、カーソル位置補正部23は、カーソル位置補正処理を終了し、画面情報転送処理に移行する。
[実施例4の効果]
上記実施例4によれば、シンクライアントシステム9のサーバ装置2Cは、入力イベントに基づいて処理した結果、処理前後でカーソルの位置に変化があったとき、処理前後のカーソルの位置が1つの軸方向のみに変化があったか否かを判定する。そして、サーバ装置2Cは、1つの軸方向のみに変化があったと判定した場合、変化があった軸方向について変化があったカーソルの位置が入力イベント履歴保持部21に保持されているいずれかのカーソルの位置と一致しているか否かを判定する。かかる構成によれば、サーバ装置2Cは、入力イベント履歴保持部21に保持されているカーソルの位置との比較に変化があった軸方向についてのカーソルの位置を用いることにより比較処理のコストを低減することができる。
また、サーバ装置2Cは、1つの軸方向のみに変化があったと判定した場合、変化があった軸方向にカーソルの移動を限定する旨をクライアント装置1Cに通知する。かかる構成によれば、サーバ装置2Cは、仮にカーソルの移動領域が制限されている場合であっても、クライアント装置1Cにおけるカーソルの移動軌跡を自然な動きとなるように制御できる。
[プログラムなど]
なお、実施例1〜4では、入力イベントの処理前後でカーソルの位置がOS20によって自動的に変更された場合について説明した。しかしながら、これに限定されず、OS20に代えてドライバとしても良いし、アプリケーションソフトとしても良く、入力イベントの処理前後でカーソルの位置が自動的に変更されるソフトウェアまたはハードウェアであれば良い。
また、サーバ装置2は、既知のパーソナルコンピュータ、ワークステーションなどの情報処理装置に、上記した入力イベント処理部22と、カーソル位置補正部23と、画面情報転送部24等の各機能を搭載することによって実現することができる。また、クライアント装置1は、既知のパーソナルコンピュータ、ワークステーションなどの情報処理装置に、上記した入力イベント処理部11と、画面描画部12等の各機能を搭載することによって実現することができる。
また、図示した各装置の各構成要素は、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的態様は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、カーソル位置変更チェック部231とカーソル位置履歴チェック部232とを1個の部として統合しても良い。一方、カーソル位置履歴チェック部232を、カーソルの位置が履歴に保持されているか否かを判定するする判定部と、保持されている場合に履歴を削除する削除部等とに分散しても良い。また、入力イベント履歴保持部21等の記憶部をサーバ装置2の外部装置としてネットワーク経由で接続するようにしても良い。
また、上記実施例で説明した各種の処理は、あらかじめ用意されたプログラムをパーソナルコンピュータやワークステーションなどのコンピュータで実行することによって実現することができる。そこで、以下では、図1に示したサーバ装置2と同様の機能を実現するカーソル位置補正プログラムを実行するコンピュータの一例を説明する。図22は、カーソル位置補正プログラムを実行するコンピュータの一例を示す図である。
図22に示すように、コンピュータ200は、各種演算処理を実行するCPU201と、ユーザからのデータの入力を受け付ける入力装置202と、ディスプレイ203を有する。また、コンピュータ200は、記憶媒体からプログラム等を読取る読み取り装置204と、ネットワークを介して他のコンピュータとの間でデータの授受を行うインタフェース装置205とを有する。また、コンピュータ200は、各種情報を一時記憶するRAM206と、ハードディスク装置207を有する。そして、各装置201〜207は、バス208に接続される。
ハードディスク装置207は、カーソル位置補正プログラム207a、カーソル位置補正関連情報207bを記憶する。CPU201は、カーソル位置補正プログラム207aを読み出して、RAM206に展開する。カーソル位置補正プログラム207aは、カーソル位置補正プロセス206aとして機能する。
例えば、カーソル位置補正プロセス206aは、入力イベント処理部22、カーソル位置補正部23および画面情報転送部24に対応する。カーソル位置補正関連情報207bは、入力イベント履歴保持部21に対応する。
なお、カーソル位置補正プログラム207aについては、必ずしも最初からハードディスク装置207に記憶させておかなくても良い。例えば、コンピュータ200に挿入されるフレキシブルディスク(FD)、CD−ROM、DVDディスク、光磁気ディスク、ICカードなどの「可搬用の物理媒体」に当該プログラムを記憶させておく。そして、コンピュータ200がこれらからカーソル位置補正プログラム207aを読み出して実行するようにしても良い。