歡迎您光臨本站 註冊首頁

使用 Ghosd 和 Synergy 增強多屏幕用戶界面

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  
不同於傳統的單屏幕設置,多屏幕顯示系統要求特別考慮用戶界面(UI)。本文提供了專用於跨多個顯示屏獲得和更改輸入焦點的工具和代碼。

對工作環境作出少量修改可以提高生產力,其效果和添加額外的監視器一樣顯著。開源的 Synergy 包提供了一種優秀的方法,可以在無需購買額外硬體的情況下鏈接多個顯示器。

不同於傳統的單屏幕設置,多屏幕顯示系統要求特別考慮用戶界面。本文提供了專用於跨多個顯示屏獲得和更改輸入焦點的工具和代碼。通過使用 Ghosd 顯示和 Synergy 調試級輸出增強現有的 X Window System 焦點信息,多屏幕用戶甚至可以精確地知道輸入焦點在 4200x3150 像素或更大的像素。

要求

安全注意事項

本文介紹的代碼和技術演示了如何創建屏幕警報。這是為在私有網路中運行的計算機設計的。它不能用於直接公開給 Internet 的計算機中,Internet 中的惡意程序可能會嘗試在計算機中執行任意代碼。

硬體

Synergy 設計用於跨各種硬體和軟體工作。建議使用速度較快的網路,對於製作動畫或大量使用阿爾法混合(alpha-blended)Ghosd 視覺效果尤其如此。

軟體

雖然各種操作系統都支持 Synergy 的基本功能,但是本文將在 Linux® 伺服器上使用 Ghosd 來提供增強的屏幕顯示(on-screen display,OSD)。按照 Synergy 的定義,伺服器是帶有主鍵盤和滑鼠或共享鍵盤和滑鼠、主屏幕並運行 Synergy 伺服器軟體的計算機。所有其他計算機是 Synergy 客戶機並運行 Synergy 客戶機軟體。下面是繼續學習本文所需的內容:

Synergy
Synergy 允許在配有不同操作系統、擁有各自顯示屏而沒有特殊硬體的多個計算機之間共享單個滑鼠和鍵盤。
X Window System
需要在 Synergy 伺服器和客戶機中運行 Linux® 或兼容的 X Window System 伺服器才能得到本文所述的結果。由於運行 Linux 或 UNIX® 的大多數台式機都安裝了 X Window System,因此可以放心地假定它已經安裝在 Linux 或 UNIX 計算機中。
Pango
Pango 是設置文本布局並呈現文本的庫。
GLib library
Pango 依賴於 GLib 庫 的 V2.x 系列,可以從 GTK+ Project 獲得。
Cairo
Cairo 是支持多個輸出設備的 2-D 圖形庫。
Ghosd
Ghosd 是一個使用一種很吸引人的方式在屏幕中刷新信息的庫。
Perl
Perl 是一種穩定的跨平台編程語言。

Ubuntu 用戶可以使用以下命令安裝上面的大部分軟體:sudo apt-get install libgtk2.0-dev libpango1.0-dev libcairo2-dev perl synergy。





一般方法

考慮圖 1 中所示的六屏幕 Synergy 設置。此圖像顯示了下面所示的代碼最終生成的焦點內和焦點外指示器。如果離開多屏幕設置幾分鐘,則會發現很難記住游標所在的位置及位於哪個屏幕中。圖 1 在獲得焦點的屏幕中顯示一系列綠色正方形,並在其他顯示屏中顯示逐漸淡出的紅框。繼續閱讀本文,了解如何從焦點跟蹤指示器開始生成這種視覺效果。


圖 1. 六屏幕顯示設置






構建焦點內顯示效果

查閱在 下載 小節中找到的文件以獲得 Ghosd 源代碼歸檔。將 Ghosd 源代碼下載到打算用作 Synergy 伺服器的計算機中。用命令 bzip2 -d ghosd-0.0.1.tar.bz2 -c | tar -xvf - 解壓縮 Ghosd 代碼歸檔。運行普通的 ./configure; make && make install 命令以構建 Ghosd 源代碼和示例文件。如果構建並安裝成功,則已經準備好創建第一個焦點顯示效果,指示焦點的一系列綠框。

焦點內顯示效果

切換到 examples/ 目錄並使用命令 mv animation.c original.animation.c 重命名 animation.c 文件。創建名為 animation.c 的新文件並在其中放入清單 1 所示的代碼。


清單 1. animation.c 頭文件,round_rect 函數
// animation.c - modified ghosd example for Synergy focus designation  // borrows heavily from the ghosd animation.c example file  #include <stdio.h>  #include <sys/time.h>  #include <sys/poll.h>  #include <time.h>  #include <cairo/cairo.h>  #include <ghosd/ghosd.h>    #define RADIUS 20  int sizeX   = 1024;  int sizeY   = 768;  int mode    = 0;    // 0 is alpha blended red border box, 1 is green boxes    typedef struct {    cairo_surface_t* foot;    float alpha;  } RenderData;    static void  round_rect(cairo_t *cr, int x, int y, int w, int h, int r) {    cairo_move_to(cr, x+r, y);    cairo_line_to(cr, x+w-r, y); /* top edge */    cairo_curve_to(cr, x+w, y, x+w, y, x+w, y+r);    cairo_line_to(cr, x+w, y+h-r); /* right edge */    cairo_curve_to(cr, x+w, y+h, x+w, y+h, x+w-r, y+h);    cairo_line_to(cr, x+r, y+h); /* bottom edge */    cairo_curve_to(cr, x, y+h, x, y+h, x, y+h-r);    cairo_line_to(cr, x, y+r); /* left edge */    cairo_curve_to(cr, x, y, x, y, x+r, y);    cairo_close_path(cr);  }  

在 include 語句和變數聲明后,round_rect 函數被定義為從 Ghosd examples/animation.c 文件中借用 verbatim。round_rect 函數將在焦點內和焦點外顯示效果中提供高亮顯示。接下來,添加如下所示的 renderFocus 函數。


清單 2. renderFocus 函數
static void  renderFocus(Ghosd *ghosd, cairo_t *cr, void* data) {    RenderData *rdata = data;      // draw three squares to indicate focus    cairo_set_line_width( cr, 20);    cairo_set_source_rgba(cr, 0, 1, 0, rdata->alpha);    cairo_new_path(cr);    round_rect(cr, 10, 10, 380, 380, RADIUS);    cairo_stroke(cr);      cairo_set_source_rgba(cr, 0, 1, 0, rdata->alpha);    cairo_new_path(cr);    round_rect(cr, 40, 40, 320, 320, RADIUS);    cairo_stroke(cr);      cairo_set_source_rgba(cr, 0, 1, 0, rdata->alpha);    cairo_new_path(cr);    round_rect(cr, 70, 70, 260, 260, RADIUS);    cairo_stroke(cr);      cairo_set_source_surface(cr, rdata->foot, 0,0);  }//renderFocus  

當顯示屏獲得焦點時,renderFocus 函數將在可用呈現平面中繪製三個連續縮小的圓矩形區域。清單 3 顯示了主程序邏輯並調用 renderFocus 函數。


清單 3. animation.c 主邏輯
int main(int argc, char* argv[]) {    Ghosd *ghosd;    RenderData data = {0};    struct timeval tv_nextupdate;    const int STEP = 50;    float dalpha = 0.10;      if( argc == 4 )    {      sizeX = atoi( argv[1] );      sizeY = atoi( argv[2] );      mode  = atoi( argv[3] );      }      ghosd = ghosd_new();      if( mode == 0 )    {      // create a small canvas and draw the green focus boxes      data.foot = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 400,400);      data.alpha = 1;      ghosd_set_position(ghosd, (sizeX/2)-200, (sizeY/2)-200, 400, 400);      ghosd_set_render(ghosd, renderFocus, &data);      ghosd_render(ghosd);      ghosd_show(ghosd);      ghosd_main_iterations(ghosd);      }//if focus mode      // ghosd_flash is not ideal for this example, so fade out quickly and exit    for (;;)     {      gettimeofday(&tv_nextupdate, NULL);      tv_nextupdate.tv_usec += STEP*1000;        ghosd_main_until(ghosd, &tv_nextupdate);        data.alpha -= dalpha;      if (data.alpha <= 0.3) { return(0); }        ghosd_render(ghosd);    }//for each step fade out    }//main  

再次大量借用 Ghosd examples/animation.c 文件的內容,主循環將創建一個 400x400 阿爾法混合平面區域。無論解析度是多少,此平面都會被定位到屏幕中心,並且將 renderFocus 函數指定為在每次呈現時調用。

雖然 ghosd_flash 為淡入淡出文本提供了有用介面,但是簡單的淡出效果更加適合這個顯示效果。因此,for 循環將在每次呈現時減少阿爾法混合量,以在程序退出前創建有效的淡出效果。

要構建此文件,請先執行 ./animation 1400 1050 0,然後再執行 make 命令。假定屏幕解析度為 1400x1050,您應當在屏幕中心看到一系列綠框。

從 Synergy 輸出中提取焦點信息

完成顯示效果后,應該在屏幕中顯示它,同時當前焦點放到 Synergy 配置中。Synergy 使得此過程相對簡單,因為它提供了非常適合這項任務的各種調試級輸出。

創建以清單 4 內容為開頭的名為 processSynergy.pl 的文件。


清單 4. processSynergy.pl 變數,主循環
#!/usr/bin/perl -w  # processSynergy.pl - read Synergys DEBUG2 events  use strict;  my %disp = ();       # record display geometries, focus states  my $delay = 5;       # time in seconds  my $inTimeout = 0;   # timeout mode switcher  my $osdOn     = 0;   # on screen display switcher  my $lastTime = time; # monitor last activity    while( my $line = <STDIN> )  {    $line =~ s/"//g;      if( $line =~ /404: received client / )    {      # client connection geometry recording an initial setup      my @parts = split " ", $line;      my $name = $parts[4];        $disp{$name}{mode} = 1;      $disp{$name}{X} = (split "x", $parts[7])[0];      $disp{$name}{Y} = (split "x", $parts[7])[1];        print "$name geometry $parts[7]\n";  

在聲明變數(大多數將在稍後進行焦點超時檢查時使用)后,程序將進入一個循環,對 STDIN 偵聽 Synergy 事件。第一條 if 語句將處理客戶機連接消息並把各個顯示信息添加到 %disp hash 中。清單 5 將偵聽 “焦點切換” 消息。


清單 5. 焦點切換檢查
  }elsif( $line =~ / switch from / )    {      # track changes of focus between clients      my $name = (split " ", $line)[6];        $disp{$name}{mode} = 0;        # set all other displays to inactive      map{ $disp{
不同於傳統的單屏幕設置,多屏幕顯示系統要求特別考慮用戶界面(UI)。本文提供了專用於跨多個顯示屏獲得和更改輸入焦點的工具和代碼。

對工作環境作出少量修改可以提高生產力,其效果和添加額外的監視器一樣顯著。開源的 Synergy 包提供了一種優秀的方法,可以在無需購買額外硬體的情況下鏈接多個顯示器。

不同於傳統的單屏幕設置,多屏幕顯示系統要求特別考慮用戶界面。本文提供了專用於跨多個顯示屏獲得和更改輸入焦點的工具和代碼。通過使用 Ghosd 顯示和 Synergy 調試級輸出增強現有的 X Window System 焦點信息,多屏幕用戶甚至可以精確地知道輸入焦點在 4200x3150 像素或更大的像素。

要求

安全注意事項

本文介紹的代碼和技術演示了如何創建屏幕警報。這是為在私有網路中運行的計算機設計的。它不能用於直接公開給 Internet 的計算機中,Internet 中的惡意程序可能會嘗試在計算機中執行任意代碼。

硬體

Synergy 設計用於跨各種硬體和軟體工作。建議使用速度較快的網路,對於製作動畫或大量使用阿爾法混合(alpha-blended)Ghosd 視覺效果尤其如此。

軟體

雖然各種操作系統都支持 Synergy 的基本功能,但是本文將在 Linux® 伺服器上使用 Ghosd 來提供增強的屏幕顯示(on-screen display,OSD)。按照 Synergy 的定義,伺服器是帶有主鍵盤和滑鼠或共享鍵盤和滑鼠、主屏幕並運行 Synergy 伺服器軟體的計算機。所有其他計算機是 Synergy 客戶機並運行 Synergy 客戶機軟體。下面是繼續學習本文所需的內容:

Synergy
Synergy 允許在配有不同操作系統、擁有各自顯示屏而沒有特殊硬體的多個計算機之間共享單個滑鼠和鍵盤。
X Window System
需要在 Synergy 伺服器和客戶機中運行 Linux® 或兼容的 X Window System 伺服器才能得到本文所述的結果。由於運行 Linux 或 UNIX® 的大多數台式機都安裝了 X Window System,因此可以放心地假定它已經安裝在 Linux 或 UNIX 計算機中。
Pango
Pango 是設置文本布局並呈現文本的庫。
GLib library
Pango 依賴於 GLib 庫 的 V2.x 系列,可以從 GTK+ Project 獲得。
Cairo
Cairo 是支持多個輸出設備的 2-D 圖形庫。
Ghosd
Ghosd 是一個使用一種很吸引人的方式在屏幕中刷新信息的庫。
Perl
Perl 是一種穩定的跨平台編程語言。

Ubuntu 用戶可以使用以下命令安裝上面的大部分軟體:sudo apt-get install libgtk2.0-dev libpango1.0-dev libcairo2-dev perl synergy。





一般方法

考慮圖 1 中所示的六屏幕 Synergy 設置。此圖像顯示了下面所示的代碼最終生成的焦點內和焦點外指示器。如果離開多屏幕設置幾分鐘,則會發現很難記住游標所在的位置及位於哪個屏幕中。圖 1 在獲得焦點的屏幕中顯示一系列綠色正方形,並在其他顯示屏中顯示逐漸淡出的紅框。繼續閱讀本文,了解如何從焦點跟蹤指示器開始生成這種視覺效果。


圖 1. 六屏幕顯示設置






構建焦點內顯示效果

查閱在 下載 小節中找到的文件以獲得 Ghosd 源代碼歸檔。將 Ghosd 源代碼下載到打算用作 Synergy 伺服器的計算機中。用命令 bzip2 -d ghosd-0.0.1.tar.bz2 -c | tar -xvf - 解壓縮 Ghosd 代碼歸檔。運行普通的 ./configure; make && make install 命令以構建 Ghosd 源代碼和示例文件。如果構建並安裝成功,則已經準備好創建第一個焦點顯示效果,指示焦點的一系列綠框。

焦點內顯示效果

切換到 examples/ 目錄並使用命令 mv animation.c original.animation.c 重命名 animation.c 文件。創建名為 animation.c 的新文件並在其中放入清單 1 所示的代碼。


清單 1. animation.c 頭文件,round_rect 函數
// animation.c - modified ghosd example for Synergy focus designation  // borrows heavily from the ghosd animation.c example file  #include <stdio.h>  #include <sys/time.h>  #include <sys/poll.h>  #include <time.h>  #include <cairo/cairo.h>  #include <ghosd/ghosd.h>    #define RADIUS 20  int sizeX   = 1024;  int sizeY   = 768;  int mode    = 0;    // 0 is alpha blended red border box, 1 is green boxes    typedef struct {    cairo_surface_t* foot;    float alpha;  } RenderData;    static void  round_rect(cairo_t *cr, int x, int y, int w, int h, int r) {    cairo_move_to(cr, x+r, y);    cairo_line_to(cr, x+w-r, y); /* top edge */    cairo_curve_to(cr, x+w, y, x+w, y, x+w, y+r);    cairo_line_to(cr, x+w, y+h-r); /* right edge */    cairo_curve_to(cr, x+w, y+h, x+w, y+h, x+w-r, y+h);    cairo_line_to(cr, x+r, y+h); /* bottom edge */    cairo_curve_to(cr, x, y+h, x, y+h, x, y+h-r);    cairo_line_to(cr, x, y+r); /* left edge */    cairo_curve_to(cr, x, y, x, y, x+r, y);    cairo_close_path(cr);  }  

在 include 語句和變數聲明后,round_rect 函數被定義為從 Ghosd examples/animation.c 文件中借用 verbatim。round_rect 函數將在焦點內和焦點外顯示效果中提供高亮顯示。接下來,添加如下所示的 renderFocus 函數。


清單 2. renderFocus 函數
static void  renderFocus(Ghosd *ghosd, cairo_t *cr, void* data) {    RenderData *rdata = data;      // draw three squares to indicate focus    cairo_set_line_width( cr, 20);    cairo_set_source_rgba(cr, 0, 1, 0, rdata->alpha);    cairo_new_path(cr);    round_rect(cr, 10, 10, 380, 380, RADIUS);    cairo_stroke(cr);      cairo_set_source_rgba(cr, 0, 1, 0, rdata->alpha);    cairo_new_path(cr);    round_rect(cr, 40, 40, 320, 320, RADIUS);    cairo_stroke(cr);      cairo_set_source_rgba(cr, 0, 1, 0, rdata->alpha);    cairo_new_path(cr);    round_rect(cr, 70, 70, 260, 260, RADIUS);    cairo_stroke(cr);      cairo_set_source_surface(cr, rdata->foot, 0,0);  }//renderFocus  

當顯示屏獲得焦點時,renderFocus 函數將在可用呈現平面中繪製三個連續縮小的圓矩形區域。清單 3 顯示了主程序邏輯並調用 renderFocus 函數。


清單 3. animation.c 主邏輯
int main(int argc, char* argv[]) {    Ghosd *ghosd;    RenderData data = {0};    struct timeval tv_nextupdate;    const int STEP = 50;    float dalpha = 0.10;      if( argc == 4 )    {      sizeX = atoi( argv[1] );      sizeY = atoi( argv[2] );      mode  = atoi( argv[3] );      }      ghosd = ghosd_new();      if( mode == 0 )    {      // create a small canvas and draw the green focus boxes      data.foot = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 400,400);      data.alpha = 1;      ghosd_set_position(ghosd, (sizeX/2)-200, (sizeY/2)-200, 400, 400);      ghosd_set_render(ghosd, renderFocus, &data);      ghosd_render(ghosd);      ghosd_show(ghosd);      ghosd_main_iterations(ghosd);      }//if focus mode      // ghosd_flash is not ideal for this example, so fade out quickly and exit    for (;;)     {      gettimeofday(&tv_nextupdate, NULL);      tv_nextupdate.tv_usec += STEP*1000;        ghosd_main_until(ghosd, &tv_nextupdate);        data.alpha -= dalpha;      if (data.alpha <= 0.3) { return(0); }        ghosd_render(ghosd);    }//for each step fade out    }//main  

再次大量借用 Ghosd examples/animation.c 文件的內容,主循環將創建一個 400x400 阿爾法混合平面區域。無論解析度是多少,此平面都會被定位到屏幕中心,並且將 renderFocus 函數指定為在每次呈現時調用。

雖然 ghosd_flash 為淡入淡出文本提供了有用介面,但是簡單的淡出效果更加適合這個顯示效果。因此,for 循環將在每次呈現時減少阿爾法混合量,以在程序退出前創建有效的淡出效果。

要構建此文件,請先執行 ./animation 1400 1050 0,然後再執行 make 命令。假定屏幕解析度為 1400x1050,您應當在屏幕中心看到一系列綠框。

從 Synergy 輸出中提取焦點信息

完成顯示效果后,應該在屏幕中顯示它,同時當前焦點放到 Synergy 配置中。Synergy 使得此過程相對簡單,因為它提供了非常適合這項任務的各種調試級輸出。

創建以清單 4 內容為開頭的名為 processSynergy.pl 的文件。


清單 4. processSynergy.pl 變數,主循環
#!/usr/bin/perl -w  # processSynergy.pl - read Synergys DEBUG2 events  use strict;  my %disp = ();       # record display geometries, focus states  my $delay = 5;       # time in seconds  my $inTimeout = 0;   # timeout mode switcher  my $osdOn     = 0;   # on screen display switcher  my $lastTime = time; # monitor last activity    while( my $line = <STDIN> )  {    $line =~ s/"//g;      if( $line =~ /404: received client / )    {      # client connection geometry recording an initial setup      my @parts = split " ", $line;      my $name = $parts[4];        $disp{$name}{mode} = 1;      $disp{$name}{X} = (split "x", $parts[7])[0];      $disp{$name}{Y} = (split "x", $parts[7])[1];        print "$name geometry $parts[7]\n";  

在聲明變數(大多數將在稍後進行焦點超時檢查時使用)后,程序將進入一個循環,對 STDIN 偵聽 Synergy 事件。第一條 if 語句將處理客戶機連接消息並把各個顯示信息添加到 %disp hash 中。清單 5 將偵聽 “焦點切換” 消息。


清單 5. 焦點切換檢查
___FCKpd___4

在 Synergy 跟蹤顯示之間的焦點更改時,processSynergy.pl 程序將讀取消息。在所有顯示屏中更新包含信息的數據結構后(會在稍後的焦點超時檢查中使用),將用連接客戶機時記錄的解析度值調用動畫程序。

要創建焦點跟蹤指示器,請在設為 Synergy 伺服器的計算機中運行以下命令:synergys -f -c configFile --debug DEBUG2 2>&1 | perl processSynergy.pl。您可能必須連接到每個客戶機,併發出 xhost + SynergyServer,其中 “SynergySever” 是運行動畫程序的計算機的名稱。

在各個窗口中到處移動滑鼠,查看跨越顯示屏跟蹤的焦點指示器和淡出效果。





構建超時焦點多屏幕指示器

創建非焦點的顯示效果

指示非焦點的一種簡單而有效的方法是在阿爾法混合的屏幕快照周圍放置一個紅框。查看圖 1 獲得示例效果。要創建與多屏幕焦點指示器結合使用的非焦點顯示效果,請把清單 6 中所示的代碼添加到 animation.c 的第 57 行中。


清單 6. renderBox 函數
static void  renderBox(Ghosd *ghosd, cairo_t *cr, void* data) {    RenderData *rdata = data;      // draw a red box around a alpha blended center    cairo_set_source_rgba(cr, 0, 0, 0, 0.5);    cairo_new_path(cr);    round_rect(cr, 0,0, sizeX,sizeY, RADIUS);    cairo_fill(cr);        cairo_set_line_width( cr, 10);      cairo_set_source_rgba(cr, 1, 0, 0, 1.0);    cairo_new_path(cr);    round_rect(cr, 0,0, sizeX, sizeY, RADIUS);    cairo_stroke(cr);      cairo_set_source_surface(cr, rdata-<foot, 0,0 );    }//renderBox  

Ghosd examples/animation.c 文件再次發揮作用,renderBox 函數將繪製全屏幕阿爾法混合正方形,後接圍繞圖像的紅色邊框。要正確調用此函數,請在第 106 行插入清單 7 中所示的代碼。


清單 7. 紅框邏輯分支
  }else    {      // create a full screen box, and draw the red box with faded center      data.foot = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, sizeX, sizeY);      data.alpha = 1;      ghosd_set_position(ghosd, 0, 0, sizeX, sizeY );      ghosd_set_render(ghosd, renderBox, &data);      ghosd_render(ghosd);      ghosd_show(ghosd);      ghosd_main_iterations(ghosd);  

這些特殊顯示效果將一直存在,直至被 processSynergy.pl 程序終止。在第 117 行中,把如下所示的代碼:


清單 8. 先前的 render 循環
  for (;;)     {      gettimeofday(&tv_nextupdate, NULL);      tv_nextupdate.tv_usec += STEP*1000;        ghosd_main_until(ghosd, &tv_nextupdate);        data.alpha -= dalpha;      if (data.alpha <= 0.3) { return(0); }        ghosd_render(ghosd);    }//for each step fade out    

更改為:


清單 9. 新 render 循環
  for (;;)     {      ghosd_main_until(ghosd, &tv_nextupdate);      ghosd_render(ghosd);    }//continuous render until program killed  

要構建此文件,請執行 make 命令,後接:./animation 1400 1050 1。假定屏幕解析度為 1400x1050,您應當會看到一個顏色變淡的屏幕,四周圍繞了一個紅色框。按 Ctrl+c 組合鍵退出此種顯示效果。

針對焦點超時檢查修改 processSynergy.pl

要跟蹤哪個屏幕擁有焦點以及輸入何時停止,請對 processSynergy.pl 做出如下所述的修改。首先刪除 47-49 行並替換為清單 10 中的代碼。


清單 10. 動作、關鍵檢查邏輯分支;心跳邏輯分支
    }elsif( $line =~ / MotionNotify / || $line =~ / KeyPress / ||            $line =~ /event: Buton/ )    {      # reset time on keyboard and mouse events      $lastTime = time;  $inTimeout = 0;      }elsif( $line =~ / writef\(CALV\)/ )    {      # check for timeouts at each hearbeat      next unless ( (time - $lastTime) > $delay && $inTimeout == 0);        $inTimeout = 1;      $osdOn =1;        for my $key ( keys %disp )      {        my $res = "export DISPLAY=$key:0; ";        $res .= "./animation $disp{$key}{X} $disp{$key}{Y} $disp{$key}{mode} &";        system($res);      }#for each display name        print "timer exceeded\n";      }#if client  

在被第一個 elsif 分支處理時,每個新滑鼠或鍵盤事件都將重設 lastTime 變數。第二個 elsif 分支將查找由客戶機發送到伺服器的 CALV “心跳”。如果自發生上一個動作后已經過了特定秒數,效果將顯示在各自相應的屏幕中。在第 71 行添加清單 11 中所示的代碼以完成 processSynergy.pl 修改。


清單 11. 在活動中處理 destroy 動畫
  if( $inTimeout == 0 && $osdOn == 1)    {      # destroy on screen display process      system("ps -aef | grep animation | perl -lnae '`kill -9 \$F[1]`'");      $osdOn = 0;      print "terminate osd\n";    }#if on screen display is visible  

注意,這種方法依賴於來自至少一台客戶機的 CALV 心跳連接。如果網路變得不可用或者 CALV 消息沒有顯示,焦點指示器可能不會正確顯示。





用法

要使用這個完成的超時焦點指示器,請在設為 Synergy 伺服器的計算機中運行以下命令:synergys -f -c configFile --debug DEBUG2 2>&1 | perl processSynergy.pl。

如果未顯示效果,則可能必須再次連接到每台客戶機併發出 xhost + SynergyServer。在經過 “延遲” 秒數(在本例中為 5 秒)沒有鍵盤或滑鼠活動后,當前持有焦點的屏幕將顯示一組綠框,而非焦點屏幕將顯示阿爾法混合的紅邊框。





結束語

使用 Synergy 輸出監視代碼和 Ghosd 視覺效果可以跟蹤焦點,並在達到某個時間閾值后將顯示效果提供給當前焦點。現在當您返回到顯示屏旁邊時,可以省去在所有屏幕中查找游標的時間。

考慮把動畫添加到指示器中以獲得更加醒目的顯示(當心可用庫發生內存泄露)。鏈接終端會話與當前 Synergy 焦點信息以在當前查看的屏幕中提供遠程系統的顯示更新。如果可以考慮視覺效果,Ghosd 和 Synergy 調試信息可以幫助您顯示它。(責任編輯:A6)

}{mode} = 1 if(
不同於傳統的單屏幕設置,多屏幕顯示系統要求特別考慮用戶界面(UI)。本文提供了專用於跨多個顯示屏獲得和更改輸入焦點的工具和代碼。

對工作環境作出少量修改可以提高生產力,其效果和添加額外的監視器一樣顯著。開源的 Synergy 包提供了一種優秀的方法,可以在無需購買額外硬體的情況下鏈接多個顯示器。

不同於傳統的單屏幕設置,多屏幕顯示系統要求特別考慮用戶界面。本文提供了專用於跨多個顯示屏獲得和更改輸入焦點的工具和代碼。通過使用 Ghosd 顯示和 Synergy 調試級輸出增強現有的 X Window System 焦點信息,多屏幕用戶甚至可以精確地知道輸入焦點在 4200x3150 像素或更大的像素。

要求

安全注意事項

本文介紹的代碼和技術演示了如何創建屏幕警報。這是為在私有網路中運行的計算機設計的。它不能用於直接公開給 Internet 的計算機中,Internet 中的惡意程序可能會嘗試在計算機中執行任意代碼。

硬體

Synergy 設計用於跨各種硬體和軟體工作。建議使用速度較快的網路,對於製作動畫或大量使用阿爾法混合(alpha-blended)Ghosd 視覺效果尤其如此。

軟體

雖然各種操作系統都支持 Synergy 的基本功能,但是本文將在 Linux® 伺服器上使用 Ghosd 來提供增強的屏幕顯示(on-screen display,OSD)。按照 Synergy 的定義,伺服器是帶有主鍵盤和滑鼠或共享鍵盤和滑鼠、主屏幕並運行 Synergy 伺服器軟體的計算機。所有其他計算機是 Synergy 客戶機並運行 Synergy 客戶機軟體。下面是繼續學習本文所需的內容:

Synergy
Synergy 允許在配有不同操作系統、擁有各自顯示屏而沒有特殊硬體的多個計算機之間共享單個滑鼠和鍵盤。
X Window System
需要在 Synergy 伺服器和客戶機中運行 Linux® 或兼容的 X Window System 伺服器才能得到本文所述的結果。由於運行 Linux 或 UNIX® 的大多數台式機都安裝了 X Window System,因此可以放心地假定它已經安裝在 Linux 或 UNIX 計算機中。
Pango
Pango 是設置文本布局並呈現文本的庫。
GLib library
Pango 依賴於 GLib 庫 的 V2.x 系列,可以從 GTK+ Project 獲得。
Cairo
Cairo 是支持多個輸出設備的 2-D 圖形庫。
Ghosd
Ghosd 是一個使用一種很吸引人的方式在屏幕中刷新信息的庫。
Perl
Perl 是一種穩定的跨平台編程語言。

Ubuntu 用戶可以使用以下命令安裝上面的大部分軟體:sudo apt-get install libgtk2.0-dev libpango1.0-dev libcairo2-dev perl synergy。





一般方法

考慮圖 1 中所示的六屏幕 Synergy 設置。此圖像顯示了下面所示的代碼最終生成的焦點內和焦點外指示器。如果離開多屏幕設置幾分鐘,則會發現很難記住游標所在的位置及位於哪個屏幕中。圖 1 在獲得焦點的屏幕中顯示一系列綠色正方形,並在其他顯示屏中顯示逐漸淡出的紅框。繼續閱讀本文,了解如何從焦點跟蹤指示器開始生成這種視覺效果。


圖 1. 六屏幕顯示設置






構建焦點內顯示效果

查閱在 下載 小節中找到的文件以獲得 Ghosd 源代碼歸檔。將 Ghosd 源代碼下載到打算用作 Synergy 伺服器的計算機中。用命令 bzip2 -d ghosd-0.0.1.tar.bz2 -c | tar -xvf - 解壓縮 Ghosd 代碼歸檔。運行普通的 ./configure; make && make install 命令以構建 Ghosd 源代碼和示例文件。如果構建並安裝成功,則已經準備好創建第一個焦點顯示效果,指示焦點的一系列綠框。

焦點內顯示效果

切換到 examples/ 目錄並使用命令 mv animation.c original.animation.c 重命名 animation.c 文件。創建名為 animation.c 的新文件並在其中放入清單 1 所示的代碼。


清單 1. animation.c 頭文件,round_rect 函數
// animation.c - modified ghosd example for Synergy focus designation  // borrows heavily from the ghosd animation.c example file  #include <stdio.h>  #include <sys/time.h>  #include <sys/poll.h>  #include <time.h>  #include <cairo/cairo.h>  #include <ghosd/ghosd.h>    #define RADIUS 20  int sizeX   = 1024;  int sizeY   = 768;  int mode    = 0;    // 0 is alpha blended red border box, 1 is green boxes    typedef struct {    cairo_surface_t* foot;    float alpha;  } RenderData;    static void  round_rect(cairo_t *cr, int x, int y, int w, int h, int r) {    cairo_move_to(cr, x+r, y);    cairo_line_to(cr, x+w-r, y); /* top edge */    cairo_curve_to(cr, x+w, y, x+w, y, x+w, y+r);    cairo_line_to(cr, x+w, y+h-r); /* right edge */    cairo_curve_to(cr, x+w, y+h, x+w, y+h, x+w-r, y+h);    cairo_line_to(cr, x+r, y+h); /* bottom edge */    cairo_curve_to(cr, x, y+h, x, y+h, x, y+h-r);    cairo_line_to(cr, x, y+r); /* left edge */    cairo_curve_to(cr, x, y, x, y, x+r, y);    cairo_close_path(cr);  }  

在 include 語句和變數聲明后,round_rect 函數被定義為從 Ghosd examples/animation.c 文件中借用 verbatim。round_rect 函數將在焦點內和焦點外顯示效果中提供高亮顯示。接下來,添加如下所示的 renderFocus 函數。


清單 2. renderFocus 函數
static void  renderFocus(Ghosd *ghosd, cairo_t *cr, void* data) {    RenderData *rdata = data;      // draw three squares to indicate focus    cairo_set_line_width( cr, 20);    cairo_set_source_rgba(cr, 0, 1, 0, rdata->alpha);    cairo_new_path(cr);    round_rect(cr, 10, 10, 380, 380, RADIUS);    cairo_stroke(cr);      cairo_set_source_rgba(cr, 0, 1, 0, rdata->alpha);    cairo_new_path(cr);    round_rect(cr, 40, 40, 320, 320, RADIUS);    cairo_stroke(cr);      cairo_set_source_rgba(cr, 0, 1, 0, rdata->alpha);    cairo_new_path(cr);    round_rect(cr, 70, 70, 260, 260, RADIUS);    cairo_stroke(cr);      cairo_set_source_surface(cr, rdata->foot, 0,0);  }//renderFocus  

當顯示屏獲得焦點時,renderFocus 函數將在可用呈現平面中繪製三個連續縮小的圓矩形區域。清單 3 顯示了主程序邏輯並調用 renderFocus 函數。


清單 3. animation.c 主邏輯
int main(int argc, char* argv[]) {    Ghosd *ghosd;    RenderData data = {0};    struct timeval tv_nextupdate;    const int STEP = 50;    float dalpha = 0.10;      if( argc == 4 )    {      sizeX = atoi( argv[1] );      sizeY = atoi( argv[2] );      mode  = atoi( argv[3] );      }      ghosd = ghosd_new();      if( mode == 0 )    {      // create a small canvas and draw the green focus boxes      data.foot = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 400,400);      data.alpha = 1;      ghosd_set_position(ghosd, (sizeX/2)-200, (sizeY/2)-200, 400, 400);      ghosd_set_render(ghosd, renderFocus, &data);      ghosd_render(ghosd);      ghosd_show(ghosd);      ghosd_main_iterations(ghosd);      }//if focus mode      // ghosd_flash is not ideal for this example, so fade out quickly and exit    for (;;)     {      gettimeofday(&tv_nextupdate, NULL);      tv_nextupdate.tv_usec += STEP*1000;        ghosd_main_until(ghosd, &tv_nextupdate);        data.alpha -= dalpha;      if (data.alpha <= 0.3) { return(0); }        ghosd_render(ghosd);    }//for each step fade out    }//main  

再次大量借用 Ghosd examples/animation.c 文件的內容,主循環將創建一個 400x400 阿爾法混合平面區域。無論解析度是多少,此平面都會被定位到屏幕中心,並且將 renderFocus 函數指定為在每次呈現時調用。

雖然 ghosd_flash 為淡入淡出文本提供了有用介面,但是簡單的淡出效果更加適合這個顯示效果。因此,for 循環將在每次呈現時減少阿爾法混合量,以在程序退出前創建有效的淡出效果。

要構建此文件,請先執行 ./animation 1400 1050 0,然後再執行 make 命令。假定屏幕解析度為 1400x1050,您應當在屏幕中心看到一系列綠框。

從 Synergy 輸出中提取焦點信息

完成顯示效果后,應該在屏幕中顯示它,同時當前焦點放到 Synergy 配置中。Synergy 使得此過程相對簡單,因為它提供了非常適合這項任務的各種調試級輸出。

創建以清單 4 內容為開頭的名為 processSynergy.pl 的文件。


清單 4. processSynergy.pl 變數,主循環
#!/usr/bin/perl -w  # processSynergy.pl - read Synergys DEBUG2 events  use strict;  my %disp = ();       # record display geometries, focus states  my $delay = 5;       # time in seconds  my $inTimeout = 0;   # timeout mode switcher  my $osdOn     = 0;   # on screen display switcher  my $lastTime = time; # monitor last activity    while( my $line = <STDIN> )  {    $line =~ s/"//g;      if( $line =~ /404: received client / )    {      # client connection geometry recording an initial setup      my @parts = split " ", $line;      my $name = $parts[4];        $disp{$name}{mode} = 1;      $disp{$name}{X} = (split "x", $parts[7])[0];      $disp{$name}{Y} = (split "x", $parts[7])[1];        print "$name geometry $parts[7]\n";  

在聲明變數(大多數將在稍後進行焦點超時檢查時使用)后,程序將進入一個循環,對 STDIN 偵聽 Synergy 事件。第一條 if 語句將處理客戶機連接消息並把各個顯示信息添加到 %disp hash 中。清單 5 將偵聽 “焦點切換” 消息。


清單 5. 焦點切換檢查
___FCKpd___4

在 Synergy 跟蹤顯示之間的焦點更改時,processSynergy.pl 程序將讀取消息。在所有顯示屏中更新包含信息的數據結構后(會在稍後的焦點超時檢查中使用),將用連接客戶機時記錄的解析度值調用動畫程序。

要創建焦點跟蹤指示器,請在設為 Synergy 伺服器的計算機中運行以下命令:synergys -f -c configFile --debug DEBUG2 2>&1 | perl processSynergy.pl。您可能必須連接到每個客戶機,併發出 xhost + SynergyServer,其中 “SynergySever” 是運行動畫程序的計算機的名稱。

在各個窗口中到處移動滑鼠,查看跨越顯示屏跟蹤的焦點指示器和淡出效果。





構建超時焦點多屏幕指示器

創建非焦點的顯示效果

指示非焦點的一種簡單而有效的方法是在阿爾法混合的屏幕快照周圍放置一個紅框。查看圖 1 獲得示例效果。要創建與多屏幕焦點指示器結合使用的非焦點顯示效果,請把清單 6 中所示的代碼添加到 animation.c 的第 57 行中。


清單 6. renderBox 函數
___FCKpd___5

Ghosd examples/animation.c 文件再次發揮作用,renderBox 函數將繪製全屏幕阿爾法混合正方形,後接圍繞圖像的紅色邊框。要正確調用此函數,請在第 106 行插入清單 7 中所示的代碼。


清單 7. 紅框邏輯分支
___FCKpd___6

這些特殊顯示效果將一直存在,直至被 processSynergy.pl 程序終止。在第 117 行中,把如下所示的代碼:


清單 8. 先前的 render 循環
___FCKpd___7

更改為:


清單 9. 新 render 循環
___FCKpd___8

要構建此文件,請執行 make 命令,後接:./animation 1400 1050 1。假定屏幕解析度為 1400x1050,您應當會看到一個顏色變淡的屏幕,四周圍繞了一個紅色框。按 Ctrl+c 組合鍵退出此種顯示效果。

針對焦點超時檢查修改 processSynergy.pl

要跟蹤哪個屏幕擁有焦點以及輸入何時停止,請對 processSynergy.pl 做出如下所述的修改。首先刪除 47-49 行並替換為清單 10 中的代碼。


清單 10. 動作、關鍵檢查邏輯分支;心跳邏輯分支
___FCKpd___9

在被第一個 elsif 分支處理時,每個新滑鼠或鍵盤事件都將重設 lastTime 變數。第二個 elsif 分支將查找由客戶機發送到伺服器的 CALV “心跳”。如果自發生上一個動作后已經過了特定秒數,效果將顯示在各自相應的屏幕中。在第 71 行添加清單 11 中所示的代碼以完成 processSynergy.pl 修改。


清單 11. 在活動中處理 destroy 動畫
___FCKpd___10

注意,這種方法依賴於來自至少一台客戶機的 CALV 心跳連接。如果網路變得不可用或者 CALV 消息沒有顯示,焦點指示器可能不會正確顯示。





用法

要使用這個完成的超時焦點指示器,請在設為 Synergy 伺服器的計算機中運行以下命令:synergys -f -c configFile --debug DEBUG2 2>&1 | perl processSynergy.pl。

如果未顯示效果,則可能必須再次連接到每台客戶機併發出 xhost + SynergyServer。在經過 “延遲” 秒數(在本例中為 5 秒)沒有鍵盤或滑鼠活動后,當前持有焦點的屏幕將顯示一組綠框,而非焦點屏幕將顯示阿爾法混合的紅邊框。





結束語

使用 Synergy 輸出監視代碼和 Ghosd 視覺效果可以跟蹤焦點,並在達到某個時間閾值后將顯示效果提供給當前焦點。現在當您返回到顯示屏旁邊時,可以省去在所有屏幕中查找游標的時間。

考慮把動畫添加到指示器中以獲得更加醒目的顯示(當心可用庫發生內存泄露)。鏈接終端會話與當前 Synergy 焦點信息以在當前查看的屏幕中提供遠程系統的顯示更新。如果可以考慮視覺效果,Ghosd 和 Synergy 調試信息可以幫助您顯示它。(責任編輯:A6)

ne $name ) } keys %disp; $lastTime = time; $inTimeout = 0; print "switch to $name\n"; my $res = "export DISPLAY=$name:0; "; $res .= "./animation $disp{$name}{X} $disp{$name}{Y} $disp{$name}{mode} &"; system($res); }#if switch screen catch }#while line in

在 Synergy 跟蹤顯示之間的焦點更改時,processSynergy.pl 程序將讀取消息。在所有顯示屏中更新包含信息的數據結構后(會在稍後的焦點超時檢查中使用),將用連接客戶機時記錄的解析度值調用動畫程序。

要創建焦點跟蹤指示器,請在設為 Synergy 伺服器的計算機中運行以下命令:synergys -f -c configFile --debug DEBUG2 2>&1 | perl processSynergy.pl。您可能必須連接到每個客戶機,併發出 xhost + SynergyServer,其中 “SynergySever” 是運行動畫程序的計算機的名稱。

在各個窗口中到處移動滑鼠,查看跨越顯示屏跟蹤的焦點指示器和淡出效果。





構建超時焦點多屏幕指示器

創建非焦點的顯示效果

指示非焦點的一種簡單而有效的方法是在阿爾法混合的屏幕快照周圍放置一個紅框。查看圖 1 獲得示例效果。要創建與多屏幕焦點指示器結合使用的非焦點顯示效果,請把清單 6 中所示的代碼添加到 animation.c 的第 57 行中。


清單 6. renderBox 函數
___FCKpd___5

Ghosd examples/animation.c 文件再次發揮作用,renderBox 函數將繪製全屏幕阿爾法混合正方形,後接圍繞圖像的紅色邊框。要正確調用此函數,請在第 106 行插入清單 7 中所示的代碼。


清單 7. 紅框邏輯分支
___FCKpd___6

這些特殊顯示效果將一直存在,直至被 processSynergy.pl 程序終止。在第 117 行中,把如下所示的代碼:


清單 8. 先前的 render 循環
___FCKpd___7

更改為:


清單 9. 新 render 循環
___FCKpd___8

要構建此文件,請執行 make 命令,後接:./animation 1400 1050 1。假定屏幕解析度為 1400x1050,您應當會看到一個顏色變淡的屏幕,四周圍繞了一個紅色框。按 Ctrl+c 組合鍵退出此種顯示效果。

針對焦點超時檢查修改 processSynergy.pl

要跟蹤哪個屏幕擁有焦點以及輸入何時停止,請對 processSynergy.pl 做出如下所述的修改。首先刪除 47-49 行並替換為清單 10 中的代碼。


清單 10. 動作、關鍵檢查邏輯分支;心跳邏輯分支
___FCKpd___9

在被第一個 elsif 分支處理時,每個新滑鼠或鍵盤事件都將重設 lastTime 變數。第二個 elsif 分支將查找由客戶機發送到伺服器的 CALV “心跳”。如果自發生上一個動作后已經過了特定秒數,效果將顯示在各自相應的屏幕中。在第 71 行添加清單 11 中所示的代碼以完成 processSynergy.pl 修改。


清單 11. 在活動中處理 destroy 動畫
___FCKpd___10

注意,這種方法依賴於來自至少一台客戶機的 CALV 心跳連接。如果網路變得不可用或者 CALV 消息沒有顯示,焦點指示器可能不會正確顯示。





用法

要使用這個完成的超時焦點指示器,請在設為 Synergy 伺服器的計算機中運行以下命令:synergys -f -c configFile --debug DEBUG2 2>&1 | perl processSynergy.pl。

如果未顯示效果,則可能必須再次連接到每台客戶機併發出 xhost + SynergyServer。在經過 “延遲” 秒數(在本例中為 5 秒)沒有鍵盤或滑鼠活動后,當前持有焦點的屏幕將顯示一組綠框,而非焦點屏幕將顯示阿爾法混合的紅邊框。





結束語

使用 Synergy 輸出監視代碼和 Ghosd 視覺效果可以跟蹤焦點,並在達到某個時間閾值后將顯示效果提供給當前焦點。現在當您返回到顯示屏旁邊時,可以省去在所有屏幕中查找游標的時間。

考慮把動畫添加到指示器中以獲得更加醒目的顯示(當心可用庫發生內存泄露)。鏈接終端會話與當前 Synergy 焦點信息以在當前查看的屏幕中提供遠程系統的顯示更新。如果可以考慮視覺效果,Ghosd 和 Synergy 調試信息可以幫助您顯示它。(責任編輯:A6)



[火星人 ] 使用 Ghosd 和 Synergy 增強多屏幕用戶界面已經有807次圍觀

http://coctec.com/docs/linux/show-post-69088.html