2014-12-11 3 views
1

Как я упоминал в названии, у меня есть две программы: во-первых, это создает GtkWindow, GtkDrawingArea и возвращает XID окна GtkDrawingArea. Второй получает XID и выполняет некоторые операции над ним (изменение размера, drawing..etc). Изменение размера работает, но если я рисую, я ничего не вижу на моей GtkDrawingArea (это все еще ясно). Как кажется, проблема в конфигурации GtkDrawingArea (для рисования), XID прав. Вот пример кода, который я использую, чтобы проверить: Рисование в GtkDrawingArea другим приложением

#!/usr/bin/python3 
from gi.repository import Gtk, Gdk, GdkX11 

WIDTH = 800 
HEIGHT = 600 

drawing_area = Gtk.DrawingArea() 
drawing_area.set_size_request(WIDTH, HEIGHT) 
drawing_area.add_events(Gdk.EventMask.ALL_EVENTS_MASK) 
drawing_area.set_double_buffered(False) 
drawing_area.realize() 

window = Gtk.Window() 
window.add(drawing_area) 

window.connect('delete-event', Gtk.main_quit) 
window.show_all() 

# Just for sure 
drawing_area.get_window().resize(WIDTH, HEIGHT) 

xid = drawing_area.get_window().get_xid() 
print('APP_XID=%s' % xid) 

Gtk.main() 
+0

Я не думаю, что вы можете это сделать. Вместо этого используйте 'Gtk.Socket' и' Gtk.Plug' (к сожалению, только X11, но если вы используете XID, то это X11 только для начала.) – ptomato

+0

@ptomato Хорошо, но возможно ли создать Gtk.Socket в первом приложении, и рисовать на нем во втором, не создавая Gtk.Plug? (Я пытался создать XWindow из идентификатора Socket, но тогда я могу только изменить геометрию окна - ничего не нарисовано. – poxip

+0

№ 'Gtk.Socket' и' Gtk.Plug' должны быть спарены. – ptomato

ответ

0

Теперь это делается путем создания совместно используемой памяти через «memfd_create» и рендеринг в этой области памяти. Обе стороны сопоставляют память с возможностью рисования через «cairo_image_surface_create_for_data». Это очень прямолинейно.

+0

Спасибо за ответ, я задал этот вопрос 3 года назад, но, возможно, кто-то с подобной проблемой найдет это, и ваш ответ будет Помоги им. – poxip

Смежные вопросы