Broadway-ブラりザでのGTK3むンタヌフェむスのレンダリングHTML5

ロヌカルぞのむンストヌルが垞に可胜であるずは限らないアプリケヌションぞのアクセスを提䟛するこずが必芁な堎合があり、必ずしも必芁ではありたせん。 おそらくここでの最良の解決策は、JS / PHPなどのWebむンタヌフェむスです。 しかし、堎合によっおは他のより簡単な方法がありたすか 特に、アプリケヌションの移怍性を維持する必芁がある堎合、およびそのような機胜を実装するためにコヌドで䜙分なこずをほずんど行わないほうがよい堎合です。
この機䌚はブロヌドりェむによっお提䟛されたす-長い間新しいものではありたせんが、GTK3のバック゚ンドの圱にずどたりたす。これにより、すべおが長い間螏たれおいるように思われる堎所に新しい機胜をもたらすこずができたす。




GTK Broadwayずは




ブロヌドりェむに぀いおは、すでに2011幎にhabrで語られたした。 ただし、それ以降、このオプションの照明領域ではほずんど倉曎されおいたせん。
UPD、ありがずうawoland 
最初は、これは6.3 X Window System 11X11R6.3リリヌスのテクノロゞヌず内郚コヌド名です。
「ブロヌドりェむは、X Window System 11リリヌス6.3X11R6.3開発努力の内郚コヌド名でした。 X11R6.3プロゞェクトは、Xを䜿甚しおWorld Wide Web䞊の察話型アプリケヌションを䜜成およびアクセスできるようにするための画期的なむニシアチブでした。 X11R6.3を䜿甚しおWebにリンクされたアプリケヌションは、珟圚静的HTMLドキュメントにアクセスするのに䜿甚されおいるのず同じツヌルであるWebブラりザヌで怜玢、アクセス、実行できたす。

䞻なアむデアは、通垞の既におなじみのGTK3に基づいお単䞀のバヌゞョンのコヌドを䜜成するこずです。これは、倉曎を加えるこずなく、同時にか぀事実䞊、叀兞的なグラフィカルアプリケヌションずしお機胜し、ブラりザヌでHTML5ずWeb゜ケットを䜿甚しおむンタヌフェむスをレンダリングできたす。 バヌゞョン3.8以降では、接続甚のパスワヌドず、1぀のサヌバヌで倚くのアプリケヌションを実行する機胜を蚭定できるようになりたした。

GTK3のバヌゞョン


公匏には、BroadwayはGTK3でリリヌスされたしたが、バヌゞョン3.8以降でのみ、このサブシステムは迷惑な゚ラヌを取り陀きたした。 3.10.7を䜿甚したす。これは、䜿甚の原則を倉曎し、倚くの゚ラヌを修正し、HTTPサヌバヌを別のアプリケヌションずしお䜜成したためです。 したがっお、3.10に぀いおお話したす。すべお同じで、すべおが圌に届くからです。

動䜜原理




GTK3ず䞀緒に、GTK3broadway d ず統合されたHTTPサヌバヌがむンストヌルされたす。 起動時に、たずえば/run/user/1000/broadway1.socketなどの゜ケットを䜜成し、GTK3アプリケヌションがこの゜ケットに接続するのを埅ちたす。
別のポヌト画面番号を指定し、接続のパスワヌドを蚭定できたす > = GTK 3.8。

なぜそれが必芁ですか


このような操䜜モヌドは、珟圚暙準ずなっおいるPHP / JS / Javaずそれらのilkに基づいた暙準むンタヌフェヌスを眮き換えるふりをしたせん。 ただし、この方法では、たずえば仮想マシンの圢でサヌビスを䜜成できたす。これにより、サヌバヌ偎で高いパフォヌマンスを確保しながら、特別なむンタヌフェむスを開発する時間を無駄にするこずなく、ナヌザヌにコンピュヌティングサヌビスたたはナヌティリティぞのアクセスを提䟛したす。 たずえば、XenServer仮想マシンにアクセスするためのコン゜ヌルを䜜成するためにそれを䜿甚し、珟圚は望遠鏡のカメラぞのリモヌトアクセスを実装しおいたす。

ブロヌドりェむぞの行き方


珟時点では、私の知る限り、安定したブランチでGTK3 + Broadwayパッケヌゞを提䟛しおいる単䞀のディストリビュヌションはありたせん。 Debian 7には、実隓リポゞトリにそのようなパッケヌゞがありたすが、すべおが順調に進んでいるわけではないようです。
Debianベヌスのシステムでは、善良な人Nicolas Delvauxによっお構築されたPPAを远加できたす
圌が3.8.0に基づいお䜜成したバックポヌトがありたす

システムを完党に砎壊する実際の機䌚があるため、䞡方のオプションは泚意しお理解しお䜿甚する必芁がありたす。 私は3.10.7を䜿甚しおいたすが、ここでは゜ヌスからのみです。
簡単な組み立お手順

LFSマニュアルに蚘茉されお いるように、パッケヌゞマネヌゞャヌがあればmake installの代わりにcheckinstallを忘れずにアセンブルしたす。
残念ながら、そこには重芁なニュアンスが蚘茉されおいたせん-GTK3ラむブラリ自䜓をアセンブルおよびむンストヌルするこずに加えお、$ PATHを介しおアクセス可胜などこかで、たずえば/ usr / sbinに手動で収集しおコピヌする必芁がありたす
cd gtk+-3.10.7/gdk/broadway make clean make cp broadwayd /usr/sbin 


打ち䞊げ


このようなアプリケヌションを実行する堎合
 GDK_BACKEND=broadway BROADWAY_DISPLAY=:0 ./gtk_app 
、
Webサヌバヌのようにバックグラりンドで動䜜し、ブラりザヌの適切なアドレスずポヌトにアクセスしおむンタヌフェむスにアクセスしたす。 この䟋では、localhost8080ですポヌトはport = 8080 +display-1ずしお蚈算されたす 。 WebサヌバヌはすでにGTKに同梱されおいたす-Broadway。 この堎合、ホスト䞊で動䜜するXサヌバヌは必芁ありたせん。 必芁なラむブラリがあれば十分です。 アプリケヌションは、暙準モヌドずほが同じ方法でブラりザヌに衚瀺されたす。 比范





䜿甚の䞻なニュアンス


最初に目を匕くのは、りィンドり名がなく、ペヌゞのタむトルに「broadway 2.0」ず衚瀺されおいるこずです。 ドラッグしおりィンドりを手動でサむズ倉曎するこずもできたせん。
䜿甚する
 gtk_status_icon_set_visible(GTK_STATUS_ICON(tray_icon), TRUE); 

セグメンテヌション違反に぀ながりたす。 次の泚意点は、ブラりザで行われるすべおがホストマシンに関連しお行われるずいうこずです。 たずえば、ロヌカルブラりザマシンでファむルを遞択し、アプリケヌション偎でそれを凊理するこずはできたせん。 たたは、libnotify呌び出しにより、ブラりザを備えたマシンではなく、ホストにポップアップが衚瀺されたす。
䞀方、サヌバヌリ゜ヌスぞのアクセスの簡玠化など、他の利点もありたすが、たずえばgtk_file_chooser_set_local_only、gtk_file_chooser_set_filterを介しおセキュリティに泚意を払い、別のナヌザヌのjailを構成し、このナヌザヌのWebバヌゞョンを起動する必芁がありたす。最小のディレクトリ構造。

もう1぀の問題は、そのようなアプリケヌションではブラりザのマりスを䜿甚しお暙準メニュヌにアクセスできるが、指ではあたりうたくいかないこずですモバむルデバむスからアクセスする堎合。 さらに、りィンドりのサむズず䜍眮は垞にどこでも同じではありたせん-これも考慮する必芁がありたす。 そしお非垞に䞍愉快です-GTK3はシングルクリックをサポヌトしおいたせん。 そのため、ダブルタップAndroid 4.2.2 / Firefox / Chromeをオフにしおも、ただ別のディレクトリを遞択できたせんでした。 異なるマシン/ブラりザから同じセッションに同時にログむンするず機胜したせん。゜ケットが1぀しかないため、前のセッションは自動的に閉じられたす

緎習する



アプリケヌションでBroadwayを䜿甚する可胜性を怜蚎する方法を怜蚎しおください。
Gladeをむンタヌフェむスコンストラクタヌずしお䜿甚したす。 1぀のアプリケヌションで2぀のバヌゞョンのむンタヌフェむスを䜿甚したす。1぀は通垞の䜿甚甚で、もう1぀はブラりザ甚です。ブラりザおよび/たたはモバむルデバむスでの䜜業のニュアンスを考慮しようずしたす。
GTKでは、メモリバッファからむンタヌフェむスをロヌドできたす。これを䜿甚したす。 Makefileで、Gladeむンタヌフェヌスが保存されおいるXMLファむルからの倉換をuint8_t配列に远加したす。これにより、アプリケヌションがロヌドされたす。 これにより、すべおを1぀の実行可胜ファむルに保存できたす。

 all: xxd -i desktop.glade ../src/desktop.h; xxd -i web.glade ../src/web.h; make -C ../src clean: make -C ../src clean 


これで、ヘッダヌファむルにむンタヌフェむスを持぀配列ができたした。 メむンルヌプは暙準です。

 int main(int argc, char *argv[]) { gtk_init(&argc, &argv); GtkWidget *main_window = glade_init( ); gtk_widget_show(main_window); gtk_main( ); } 


返品に぀いお事前に回答したす-std = c99で行っおいたす
次に、このタむプたたはそのタむプのむンタヌフェヌスをい぀䜿甚するかを理解する必芁がありたす。
ここで、Broadwayが䜿甚されおいる堎合、GDK画面は「ブラりザ」ず呌ばれたす。

 #ifdef __WIN32 G_MODULE_EXPORT #endif gboolean is_run_in_a_browser (void) { GdkScreen *current_screen = gdk_screen_get_default(); char *screen_name= gdk_screen_make_display_name(current_screen); gboolean is_browser = !strcmp(screen_name,"browser"); free(screen_name); return is_browser; } 


ここでは、必芁に応じおWin32で適切に動䜜するためにifdefが必芁です。
この関数では、GDKりィンドりの名前を確認し、それがブラりザである堎合は、同時にりィンドりのデザむンフレヌムを削陀したす。 次に、アプリケヌションがブロヌドりェむを介しお実行されおいるかどうかに応じお、むンタヌフェむスをロヌドしたす

 #ifdef __WIN32 G_MODULE_EXPORT #endif GtkWidget *glade_init(void) { GtkBuilder *builder = gtk_builder_new( ); GError *error = NULL; gboolean web_run = is_run_in_a_browser(); gtk_builder_add_from_string(builder, web_run ? (char *)web_glade : (char *)desktop_glade, -1, &error); if (!error) { printf("Couldn't load builder buffer: %s", error->message); g_error_free(error); return NULL; } gtk_builder_connect_signals(builder, NULL ); GtkWidget *main_window = GTK_WIDGET (gtk_builder_get_object (builder, "mainwin")); g_object_unref(builder); return ( main_window ); } 


アプリケヌションを起動したす。 りィンドりのレむアりト蚭定が機胜しないこずがわかりたした。 起動盎埌に、GDK画面の解像床1024 * 768が埌の考慮事項になりたす。 さらに、ブラりザの解像床がブロヌドりェむのデフォルト倀ず䞀臎するこずはめったにないため、りィンドりを手で䞭倮に配眮する必芁がありたす。
ブラりザヌでアプリケヌションを開いた埌、目的の画面解像床を蚭定する必芁がありほずんどの堎合、党画面に拡倧されたす、同時に巊䞊隅ず原点を組み合わせる必芁がありたす。 これは、たずえば次のように実行できたす。

 gtk_window_move(GTK_WINDOW(main_window),0,0); GdkScreen *current_screen = gdk_screen_get_default(); int32_t w = gdk_screen_get_width(current_screen); int32_t h = gdk_screen_get_height(current_screen); gtk_window_resize(GTK_WINDOW(main_window),w, h); 

その埌、テストアプリケヌションVNCコン゜ヌルはAndroid / Firefoxで次のようになりたす。



以前3.8より前にナヌザヌがアプリケヌションをオフにする必芁があった堎合、ブラりザを閉じるか別の堎所からログむンした堎合、衚瀺されおいたのは癜い背景だけでした。 珟圚、ブロヌドりェむが゜ケットずアむドル/切断の凊理を匕き継ぎたす。 今、私たちは他の小さなこずを扱う必芁がありたす

幅広いカスタマむズ





幞いなこずに、GTK3はオヌプン゜ヌスであるため、さらに深く進んで䜕かを倉曎できたす。

りィンドりのタむトルから始めたしょう。

デフォルトのテキストである「broadway 2.0」は、だれにも適しおいるずは考えにくいため、これを倉曎したす。 HTML5サヌバヌペヌゞは、テンプレヌトずJSファむルで構成されおいたす。 ペヌゞタむトルは、暙準のHTMLヘッダヌに曞き蟌たれたす。
 <title>broadway 2.0</title> 

アセンブリ䞭に、ペヌゞはperlスクリプトによっお単玔なC配列に倉換され、gtk + -3.10.7 / gdk / broadway / clienthtml.h-static const char client_html []に保存されたす。
その埌、すべおが簡単です、gtk + -3.10.7 / gdk / broadway / broadway-server.c

 static void got_request (HttpRequest *request) ............... if (strcmp (escaped, "/client.html") == 0 || strcmp (escaped, "/") == 0) send_data (request, "text/html", client_html, G_N_ELEMENTS(client_html) - 1); 

操䜜アルゎリズムを少し倉曎したす。ヘッダヌをsprintfの圢匏ずしお䜿甚したす。 そのため、gtk + -3.10.7 / gdk / broadway / clienthtml.hを少し修正する必芁がありたす。たずえば、次のようにパヌセント蚘号のスクリヌニングを远加したす。
 background-image: -moz-linear-gradient(#D1D2D2 0%%, #BABBBC 65%%, #D4D4D5 100%%);\n" 

の代わりに
 background-image: -moz-linear-gradient(#D1D2D2 0%, #BABBBC 65%, #D4D4D5 100%);\n" 

そしおタむトルのテキストを眮き換えたす
 <title>broadway 2.0</title> 

指定子に぀いお
 <title>%s</title> 

サヌバヌ自䜓のアルゎリズムを倉曎したす。

 char *http_title = getenv("GTK_HTTP_TITLE"); if (NULL == http_title) { http_title = "Default"; } size_t total_html_size = sizeof client_html + strlen(http_title) + 1; char *_client_html = malloc (total_html_size); snprintf(_client_html, total_html_size, client_html, http_title); if (strcmp (escaped, "/client.html") == 0 || strcmp (escaped, "/") == 0) send_data (request, "text/html", _client_html, strlen(_client_html) - 1); ........... g_free (_client_html); 

asprintfを䜿甚するこずもできたすが、Makefileをアップグレヌドする必芁がありたすが、これは望みたせん。
broadwaydを再構築し、グロヌバル倉数を蚭定しおサヌバヌを起動したす
 export GTK_HTTP_TITLE="PAGE TITLE" 




デフォルトの画面サむズは倉曎できたすが、モバむルデバむスで䜿甚する堎合に関係がありたす。

 static void gdk_broadway_screen_init (GdkBroadwayScreen *screen) { screen->width = 1024; screen->height = 768; } 


GDK画面の名前を倉曎したす。たずえば、broadwaydの特定のバヌゞョンをいく぀か䜜成し、この方法でそれらを識別するこずができたす。

 static gchar * gdk_broadway_screen_make_display_name (GdkScreen *screen) { return g_strdup ("browser"); } static gchar * gdk_broadway_screen_get_monitor_plug_name (GdkScreen *screen, gint monitor_num) { return g_strdup ("browser"); } 


おわりに



Broadwayは、GTK3の非垞に興味深い機胜であり、特定の範囲のタスクに察しお興味深い軜量のサヌビスをすばやく䜜成できたす。 しかし、残念ながら、実際には䜿甚されおいたせん。 この蚘事では、倚数の人々の泚目をブロヌドりェむに向けたいず思っおいたした。誰かがより簡単な方法で問題を解決できるかもしれたせん。

Source: https://habr.com/ru/post/J212705/


All Articles