ãã®æ©äŒã¯ãããŒããŠã§ã€ã«ãã£ãŠæäŸãããŸã-é·ãéæ°ãããã®ã§ã¯ãããŸãããã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ã®éåžžã«èå³æ·±ãæ©èœã§ãããç¹å®ã®ç¯å²ã®ã¿ã¹ã¯ã«å¯ŸããŠèå³æ·±ã軜éã®ãµãŒãã¹ããã°ããäœæã§ããŸãã ããããæ®å¿µãªãããå®éã«ã¯äœ¿çšãããŠããŸããã ãã®èšäºã§ã¯ãå€æ°ã®äººã ã®æ³šç®ããããŒããŠã§ã€ã«åããããšæã£ãŠããŸããã誰ããããç°¡åãªæ¹æ³ã§åé¡ã解決ã§ãããããããŸããã