NPAPI を使用して gtk+ UI でコンパイル済みのフラッシュ (.swf) を実行するスタンドアロン アプリケーションを作成しました。ビデオを実行すると、白い画面が表示される短い時間があります (おそらく 1 ~ 2 秒)。それはちょっと面倒で、それを取り除くために何かできるかどうか疑問に思っています..たとえばXlib(ネイティブ)を使用してください。出来ますか?そうだと思いますが、私はこのようなことにかなり慣れていないため、最初のアプリケーション ("hello world") を実行しただけです。私はそれが非常に低レベルであり、同じことをするのにかなりの時間がかかると確信しています. 必要に応じてコードを提供できます。
1) gtk+ で (フラッシュをロードする前に) 白い画面が遅延する原因は何ですか?
2) フラッシュをレンダリングするためにネイティブ Xlib でウィンドウを実装するのはどれほど難しいでしょうか? たとえば、NPWindow をセットアップするには...
Gtk++ (次のようになります)
static NPWindow *
npwindow_construct (GtkWidget *widget) {
NPWindow *npwindow;
NPSetWindowCallbackStruct *ws_info = NULL;
GdkWindow *parent_win = widget->window;
GtkWidget *socketWidget = gtk_socket_new();
gtk_widget_set_parent_window(socketWidget, parent_win);
gtk_widget_set_uposition(socketWidget, xPosition, yPosition);
g_signal_connect(socketWidget, "plug_removed", G_CALLBACK(plug_removed_cb), NULL);
g_signal_connect(socketWidget, "unrealize", G_CALLBACK(socket_unrealize_cb), NULL);
g_signal_connect(socketWidget, "destroy", G_CALLBACK(gtk_widget_destroyed), &socketWidget);
gpointer user_data = NULL;
gdk_window_get_user_data(parent_win, &user_data);
GtkContainer *container = GTK_CONTAINER(user_data);
gtk_container_add(container, socketWidget);
gtk_widget_realize(socketWidget);
GtkAllocation new_allocation;
new_allocation.x = 0;
new_allocation.y = 0;
new_allocation.width = WINDOW_XSIZE;
new_allocation.height = WINDOW_YSIZE;
gtk_widget_size_allocate(socketWidget, &new_allocation);
gtk_widget_show(socketWidget);
gdk_flush();
GdkNativeWindow ww = gtk_socket_get_id(GTK_SOCKET(socketWidget));
GdkWindow *w = gdk_window_lookup(ww);
npwindow = malloc (sizeof (NPWindow));
npwindow->window = (void*)(unsigned long)ww;
npwindow->x = 0;
npwindow->y = 0;
npwindow->width = WINDOW_XSIZE;
npwindow->height = WINDOW_YSIZE;
ws_info = malloc(sizeof (NPSetWindowCallbackStruct));
ws_info->type = NP_SETWINDOW;
ws_info->display = GDK_WINDOW_XDISPLAY(w);
ws_info->colormap = GDK_COLORMAP_XCOLORMAP(gdk_drawable_get_colormap(w));
GdkVisual* gdkVisual = gdk_drawable_get_visual(w);
ws_info->visual = GDK_VISUAL_XVISUAL(gdkVisual);
ws_info->depth = gdkVisual->depth;
npwindow->ws_info = ws_info;
npwindow->type = NPWindowTypeWindow;
return npwindow;
}
3) Xlib と Xt の違いは何ですか?
アドバイスや修正をいただければ幸いです。
ありがとうございました。
編集: gtk コンポーネント内に Xlib を埋め込もうとしました。したがって、メインのGdkWindow ( widget- >window ) 内に単純なウィンドウ ( XCreateSimpleWindow ) を作成します。これを行う方法についてはちょっと迷っています... gtk_socket_new() は、gtk コンポーネントが npapi プラグインからのデータに到達する (「フィード」できるようにする) ことを可能にするプロセスを作成するためです。では、どのように NPWindow を設定 (コーディング) するのでしょうか?
GtkWidget *socketWidget = gtk_drawing_area_new ();
gtk_drawing_area_size (socketWidget , WINDOW_XSIZE, WINDOW_YSIZE);
gtk_widget_realize (socketWidget);
XCreateSimpleWindow (GDK_WINDOW_XDISPLAY (parent_win), GDK_WINDOW_XWINDOW (parent_win), 0, 0, WINDOW_XSIZE, WINDOW_YSIZE, 0, 0);