Gtk+ задержанный белый экран (плагин вспышки + NPAPI)

Я создал отдельное приложение, которое запускает скомпилированный flash (.swf) на интерфейсе gtk+ с NPAPI. Когда мое видео запускается, есть небольшое время, когда появляется белый экран (возможно, 1 или 2 секунды). Это немного раздражает, и мне интересно, смогу ли я что-то сделать, чтобы избавиться от этого... например, с помощью Xlib (нативного). Является ли это возможным? Наверное, но я довольно новичок в этом деле и запустил только мое первое приложение ("Привет, мир"). Я уверен, что это очень низкий уровень и требует много времени, чтобы сделать то же самое. Я мог бы предоставить код при необходимости.

1) Что может быть причиной задержки белого экрана (до загрузки моей вспышки) в gtk+?

2) Насколько сложно было реализовать окно в родном Xlib для рендеринга flash? Например, для настройки 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?

Любые советы или исправления приветствуются.

благодарю вас.

РЕДАКТИРОВАТЬ: я пытался встроить Xlib в мои компоненты GTK. Итак, создайте простое окно (XCreateSimpleWindow) в моем главном GdkWindow (widget-> window). Я как-то заблудился, как это сделать... Потому что gtk_socket_new() создает процесс, который позволяет компоненту gtk получать (разрешать "кормить") данные из моего плагина npapi. Итак, как мне заполнить (кодировать) окно NPW?

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);

0 ответов

Другие вопросы по тегам