Регистрация | Войти
Lisp — программируемый язык программирования
RSS
Common Lisp + Gtk+ + GL
Hedin - 14.11.2016 04:31, Сообщений - 2
Добрый день! Кто-нибудь пробовал создать приложение на Common Lisp с использованием Gtk+ и виджетом GtkGlArea? Если пробовал, то подкиньте, пожалуйста, примеров.:) Ни в одном байндинге не нашел байндинга к этому виджету. Самому байндинг не получилось написать (как видно, руки не оттуда растут.:)).
[#]
Если кому-нибудь интересно, то вот способ использовать OpenGL 2.0 с Gtk3+. Рисовать можно на любом виджете, но я использовал EventBox. Если что, вот ссылка на полный код проекта - gemstone hunter.
(defcfun ("gdk_win32_window_get_handle" gdk-win32-window-get-handle) :pointer
  (window :pointer)
)


(defcfun ("gtk_widget_get_window" gtk-widget-get-window) :pointer
  (widget :pointer)
)


(defcfun ("gdk_pixbuf_new_from_file" gdk-pixbuf-new-from-file)
    (g-object gdk-pixbuf:gdk-pixbuf)
  (filename :string)
  (error :pointer)
)


(defcfun ("gdk_pixbuf_new_subpixbuf" gdk-pixbuf-new-subpixbuf)
    (g-object gdk-pixbuf:gdk-pixbuf)
  (src-pixbuf (g-object gdk-pixbuf:gdk-pixbuf))
  (src-x :int)
  (src-y :int)
  (src-width :int)
  (src-height :int)
)


(defun create-gl-context (widget)
  (let* (gdk-window hwnd)
    (log-msg "test : ~a" (pointer widget))

    (setf gdk-window (gtk-widget-get-window (pointer widget)))
    (log-msg "test2 : ~a" gdk-window)
    (when (null-pointer-p gdk-window) (return-from create-gl-context nil))

    (setf hwnd (gdk-win32-window-get-handle gdk-window))
    (log-msg "test3 : ~a" hwnd)
    (when (null-pointer-p hwnd) (return-from create-gl-context nil))
    
    (setf *hdc* (glop-win32:get-dc hwnd))
    (when (null-pointer-p *hdc*) (return-from create-gl-context nil))
    
    (glop-win32:choose-pixel-format *hdc*)
    (let ((gl-context (glop-wgl:wgl-create-context *hdc*)))
      (glop-wgl:wgl-make-current *hdc* gl-context)
gl-context
)
)
)
Hedin - 09.03.2017 14:22
[#] Ответ на комментарий от Hedin 09.03.2017 14:22
Здесь способ использования под Windows, но в Gtk3+ есть функции для получения handle'а окна и в linux. Весь код тестировался только на sbcl.
Hedin - 09.03.2017 14:23
@2009-2013 lisper.ru