標籤:spice協議 spice
1 輸入通道定義
SPICE輸入通道主要控制滑鼠和鍵盤的操作
1.1伺服器---》用戶端
enum { SPICE_MSG_INPUTS_INIT = 101, SPICE_MSG_INPUTS_KEY_MODIFIERS, SPICE_MSG_INPUTS_MOUSE_MOTION_ACK = 111, SPICE_MSG_END_INPUTS};
1.2用戶端---》伺服器
enum { SPICE_MSGC_INPUTS_KEY_DOWN = 101, SPICE_MSGC_INPUTS_KEY_UP, SPICE_MSGC_INPUTS_KEY_MODIFIERS, SPICE_MSGC_INPUTS_KEY_SCANCODE, SPICE_MSGC_INPUTS_MOUSE_MOTION = 111, SPICE_MSGC_INPUTS_MOUSE_POSITION, SPICE_MSGC_INPUTS_MOUSE_PRESS, SPICE_MSGC_INPUTS_MOUSE_RELEASE, SPICE_MSGC_END_INPUTS};
1.3Keyboard 訊息
SPICE協議支援發送鍵盤事件和同步鍵盤指示燈功能。用戶端發送鍵盤事件SPICE_MSGC_INPUTS_KEY_UP、SPICE_MSGC_INPUTS_KEY_DOWN訊息。索引值使用PC AT碼錶示。鍵盤指示燈同步是通過用戶端發送SPICE_MSGC_INPUTS_KEY_MODIFIERS或者伺服器端發送SPICE_MSG_INPUTS_KEY_MODIFIERS訊息。這些訊息中儲存了鍵盤指示燈的狀態。伺服器同樣可以使用SPICE_MSG_INPUTS_INIT訊息發送鍵盤的修改。這個訊息必須是第一個接收到的訊息,後續不應該再發送。
1.3.1 鍵盤指示燈宏
typedef enumSpiceKeyboardModifierFlags { SPICE_KEYBOARD_MODIFIER_FLAGS_SCROLL_LOCK =(1 << 0), SPICE_KEYBOARD_MODIFIER_FLAGS_NUM_LOCK = (1<< 1), SPICE_KEYBOARD_MODIFIER_FLAGS_CAPS_LOCK =(1 << 2), SPICE_KEYBOARD_MODIFIER_FLAGS_MASK = 0x7} SpiceKeyboardModifierFlags;
1.3.2 用戶端---》伺服器宏
enum { SPICE_MSGC_INPUTS_KEY_DOWN = 101, SPICE_MSGC_INPUTS_KEY_UP, SPICE_MSGC_INPUTS_KEY_MODIFIERS, SPICE_MSGC_INPUTS_KEY_SCANCODE, SPICE_MSGC_INPUTS_MOUSE_MOTION = 111, SPICE_MSGC_INPUTS_MOUSE_POSITION, SPICE_MSGC_INPUTS_MOUSE_PRESS, SPICE_MSGC_INPUTS_MOUSE_RELEASE, SPICE_MSGC_END_INPUTS};
1.3.3 伺服器---》用戶端宏
enum { SPICE_MSG_INPUTS_INIT = 101, SPICE_MSG_INPUTS_KEY_MODIFIERS, SPICE_MSG_INPUTS_MOUSE_MOTION_ACK = 111, SPICE_MSG_END_INPUTS};
1.3.4 鍵盤事件相關結構體
typedef structSpiceMsgcKeyDown { uint32_t code;}SpiceMsgcKeyDown; typedef structSpiceMsgcKeyUp { uint32_t code;}SpiceMsgcKeyUp; typedef structSpiceMsgcKeyModifiers { uint32_t modifiers;}SpiceMsgcKeyModifiers;
1.4滑鼠訊息
SPICE 支援滑鼠操作的兩種模式:伺服器和用戶端模式。(更多的參見3.4章節)在伺服器模式下,用戶端發送滑鼠運動訊息(SPICE_MSGC_INPUTS_MOUSE_MOTION),用戶端模式下,發送位置訊息(SPICE_MSGC_INPUTS_MOUSE_POSITION)。位置訊息儲存客戶滑鼠的顯示位置和顯示通道的ID(在RedLinkMess.channel_id)。為了防止滑鼠運動、位置時間發送頻繁,用戶端在收到每個SPICE_MSG_INPUTS_KEY_MODIFIERS訊息後會回應SPICE_MSG_INPUTS_MOUSE_MOTION_ACK。這種機制允許用戶端跟隨伺服器的資訊和改變事件的推送策略。滑鼠按鍵事件使用SPICE_MSGC_INPUTS_MOUSE_PRESS和SPICE_MSGC_INPUTS_MOUSE_RELEASE訊息發送給伺服器。
1.4.1 滑鼠按鍵ID
typedef enumSpiceMouseButton { SPICE_MOUSE_BUTTON_INVALID, SPICE_MOUSE_BUTTON_LEFT, SPICE_MOUSE_BUTTON_MIDDLE, SPICE_MOUSE_BUTTON_RIGHT, SPICE_MOUSE_BUTTON_UP, SPICE_MOUSE_BUTTON_DOWN, SPICE_MOUSE_BUTTON_ENUM_END}SpiceMouseButton;
1.4.2 按鍵掩碼
typedef enumSpiceMouseButtonMask { SPICE_MOUSE_BUTTON_MASK_LEFT = (1 <<0), SPICE_MOUSE_BUTTON_MASK_MIDDLE = (1<< 1), SPICE_MOUSE_BUTTON_MASK_RIGHT = (1 <<2), SPICE_MOUSE_BUTTON_MASK_MASK = 0x7}SpiceMouseButtonMask;
1.4.3 SpiceMsgcMouseMotion
typedef structSpiceMsgcMouseMotion { int32_t dx; //滑鼠移動到的X像素點 int32_t dy; //滑鼠移動道德Y像素點 uint32_t buttons_state;//滑鼠操作的掩碼。}SpiceMsgcMouseMotion;
1.4.4SpiceMsgcMousePosition
typedef structSpiceMsgcMousePosition { uint32_t x; //X 座標位置 uint32_t y;//Y 座標位置 uint32_t buttons_state; //滑鼠操作的掩碼 uint8_t display_id;//用戶端滑鼠顯示的ID}SpiceMsgcMousePosition;
1.4.5SpiceMsgcMousePress
typedef structSpiceMsgcMousePress { int32_t button; //滑鼠按鍵的ID號 int32_t buttons_state; //滑鼠操作的掩碼}SpiceMsgcMousePress;
1.4.6SpiceMsgcMouseRelease
typedef structSpiceMsgcMouseRelease { int32_t button;//滑鼠按鍵的ID號 int32_t buttons_state; //滑鼠操作的掩碼}SpiceMsgcMouseRelease;
Spice協議----輸入通道定義