1// +build !gtk_3_6,!gtk_3_8,!gtk_3_10,!gtk_3_12,!gtk_3_14
2// Supports building with gtk 3.16+
3
4/*
5 * Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
6 *
7 * This file originated from: http://opensource.conformal.com/
8 *
9 * Permission to use, copy, modify, and distribute this software for any
10 * purpose with or without fee is hereby granted, provided that the above
11 * copyright notice and this permission notice appear in all copies.
12 *
13 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
14 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
15 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
16 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
17 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
18 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
19 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20 */
21
22package gdk
23
24// #include <gdk/gdk.h>
25// #include "gdk_since_3_16.go.h"
26import "C"
27import (
28	"errors"
29	"unsafe"
30
31	"github.com/gotk3/gotk3/glib"
32)
33
34func init() {
35
36	tm := []glib.TypeMarshaler{
37		{glib.Type(C.gdk_gl_context_get_type()), marshalGLContext},
38	}
39
40	glib.RegisterGValueMarshalers(tm)
41}
42
43/*
44 * Constants
45 */
46
47const (
48	GRAB_FAILED GrabStatus = C.GDK_GRAB_FAILED
49)
50
51/*
52 * GdkDevice
53 */
54
55// TODO:
56// gdk_device_get_vendor_id().
57// gdk_device_get_product_id().
58
59/*
60 * GdkGLContext
61 */
62
63// GLContext is a representation of GDK's GdkGLContext.
64type GLContext struct {
65	*glib.Object
66}
67
68// native returns a pointer to the underlying GdkGLContext.
69func (v *GLContext) native() *C.GdkGLContext {
70	if v == nil || v.GObject == nil {
71		return nil
72	}
73	p := unsafe.Pointer(v.GObject)
74	return C.toGdkGLContext(p)
75}
76
77// Native returns a pointer to the underlying GdkGLContext.
78func (v *GLContext) Native() uintptr {
79	return uintptr(unsafe.Pointer(v.native()))
80}
81
82func marshalGLContext(p uintptr) (interface{}, error) {
83	c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
84	obj := &glib.Object{glib.ToGObject(unsafe.Pointer(c))}
85	return &GLContext{obj}, nil
86}
87
88// GetDisplay is a wrapper around gdk_gl_context_get_display().
89func (v *GLContext) GetDisplay() (*Display, error) {
90	c := C.gdk_gl_context_get_display(v.native())
91	if c == nil {
92		return nil, nilPtrErr
93	}
94
95	return &Display{glib.Take(unsafe.Pointer(c))}, nil
96}
97
98// GetWindow is a wrapper around gdk_gl_context_get_window().
99func (v *GLContext) GetSurface() (*Window, error) {
100	c := C.gdk_gl_context_get_window(v.native())
101	if c == nil {
102		return nil, nilPtrErr
103	}
104
105	return &Window{glib.Take(unsafe.Pointer(c))}, nil
106}
107
108// GetSharedContext is a wrapper around gdk_gl_context_get_shared_context().
109func (v *GLContext) GetSharedContext() (*GLContext, error) {
110	c := C.gdk_gl_context_get_shared_context(v.native())
111	if c == nil {
112		return nil, nilPtrErr
113	}
114
115	return &GLContext{glib.Take(unsafe.Pointer(c))}, nil
116}
117
118// MajorVersion is a representation of OpenGL major version.
119type MajorVersion int
120
121// MinorVersion is a representation of OpenGL minor version.
122type MinorVersion int
123
124// GetVersion is a wrapper around gdk_gl_context_get_version().
125func (v *GLContext) GetVersion() (MajorVersion, MinorVersion) {
126	var major, minor int
127	C.gdk_gl_context_get_version(v.native(),
128		(*C.int)(unsafe.Pointer(&major)), (*C.int)(unsafe.Pointer(&minor)))
129
130	return MajorVersion(major), MinorVersion(minor)
131}
132
133// GetRequiredVersion is a wrapper around gdk_gl_context_get_required_version().
134func (v *GLContext) GetRequiredVersion() (MajorVersion, MinorVersion) {
135	var major, minor int
136	C.gdk_gl_context_get_required_version(v.native(),
137		(*C.int)(unsafe.Pointer(&major)), (*C.int)(unsafe.Pointer(&minor)))
138
139	return MajorVersion(major), MinorVersion(minor)
140}
141
142// SetRequiredVersion is a wrapper around gdk_gl_context_set_required_version().
143func (v *GLContext) SetRequiredVersion(major, minor int) {
144	C.gdk_gl_context_set_required_version(v.native(), (C.int)(major), (C.int)(minor))
145}
146
147// GetDebugEnabled is a wrapper around gdk_gl_context_get_debug_enabled().
148func (v *GLContext) GetDebugEnabled() bool {
149	return gobool(C.gdk_gl_context_get_debug_enabled(v.native()))
150}
151
152// SetDebugEnabled is a wrapper around gdk_gl_context_set_debug_enabled().
153func (v *GLContext) SetDebugEnabled(enabled bool) {
154	C.gdk_gl_context_set_debug_enabled(v.native(), gbool(enabled))
155}
156
157// GetForwardCompatible is a wrapper around gdk_gl_context_get_forward_compatible().
158func (v *GLContext) GetForwardCompatible() bool {
159	return gobool(C.gdk_gl_context_get_forward_compatible(v.native()))
160}
161
162// SetForwardCompatible is a wrapper around gdk_gl_context_set_forward_compatible().
163func (v *GLContext) SetForwardCompatible(compatible bool) {
164	C.gdk_gl_context_set_forward_compatible(v.native(), gbool(compatible))
165}
166
167// Realize is a wrapper around gdk_gl_context_realize().
168func (v *GLContext) Realize() (bool, error) {
169	var err *C.GError
170	r := gobool(C.gdk_gl_context_realize(v.native(), &err))
171	if !r {
172		defer C.g_error_free(err)
173		return r, errors.New(C.GoString((*C.char)(err.message)))
174	}
175
176	return r, nil
177}
178
179// MakeCurrent is a wrapper around gdk_gl_context_make_current().
180func (v *GLContext) MakeCurrent() {
181	C.gdk_gl_context_make_current(v.native())
182}
183
184// GetCurrent is a wrapper around gdk_gl_context_get_current().
185func GetCurrent() (*GLContext, error) {
186	c := C.gdk_gl_context_get_current()
187	if c == nil {
188		return nil, nilPtrErr
189	}
190
191	return &GLContext{glib.Take(unsafe.Pointer(c))}, nil
192}
193
194// ClearCurrent is a wrapper around gdk_gl_context_clear_current().
195func ClearCurrent() {
196	C.gdk_gl_context_clear_current()
197}
198