File: gwydgets.c

package info (click to toggle)
gwyddion 2.47-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 38,180 kB
  • ctags: 37,276
  • sloc: ansic: 317,531; sh: 5,122; xml: 3,583; python: 3,067; makefile: 2,694; cpp: 2,550; pascal: 418; perl: 154; ruby: 130; sed: 17
file content (158 lines) | stat: -rw-r--r-- 5,155 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/*
 *  @(#) $Id: gwydgets.c 15598 2013-11-11 12:33:32Z yeti-dn $
 *  Copyright (C) 2003 David Necas (Yeti), Petr Klapetek.
 *  E-mail: yeti@gwyddion.net, klapetek@gwyddion.net.
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
 *  Boston, MA 02110-1301, USA.
 */

#include "config.h"
#include <libdraw/gwydraw.h>
#include <libgwydgets/gwydgets.h>

static GdkGLConfig *glconfig = NULL;

/************************** Initialization ****************************/

/**
 * gwy_widgets_type_init:
 *
 * Makes libgwydgets types safe for deserialization and performs other
 * initialization.  You have to call this function before using widgets and
 * objects from libgwydgets.
 *
 * Calls gwy_draw_type_init() first to make sure libgwydraw is initialized.
 *
 * It is safe to call this function more than once, subsequent calls are no-op.
 **/
void
gwy_widgets_type_init(void)
{
    static guint types_initialized = FALSE;

    if (types_initialized)
        return;

    gwy_draw_type_init();

    g_type_class_peek(GWY_TYPE_GRAPH_CURVE_MODEL);
    g_type_class_peek(GWY_TYPE_GRAPH_MODEL);
    g_type_class_peek(GWY_TYPE_3D_LABEL);
    g_type_class_peek(GWY_TYPE_3D_SETUP);
    g_type_class_peek(GWY_TYPE_SELECTION_GRAPH_POINT);
    g_type_class_peek(GWY_TYPE_SELECTION_GRAPH_AREA);
    g_type_class_peek(GWY_TYPE_SELECTION_GRAPH_ZOOM);
    g_type_class_peek(GWY_TYPE_SELECTION_GRAPH_LINE);
    g_type_class_peek(GWY_TYPE_SELECTION_GRAPH_1DAREA);
    types_initialized = 1;

    gtk_rc_parse_string
        (/* graph window statusbar */
         "style \"gwyflatstatusbar\" {\n"
         "  GtkStatusbar::shadow_type = 0\n"
         "}\n"
         "widget \"*.gwyflatstatusbar\" style \"gwyflatstatusbar\"\n"
         "\n");
}

/**
 * gwy_widgets_gl_init:
 *
 * Configures an OpenGL-capable visual for 3D widgets.
 *
 * Use gwy_widgets_get_gl_config() to get the framebuffer configuration.
 *
 * This function must be called before OpenGL widgets can be used.
 *
 * Returns: %TRUE if an appropriate visual was found.  If Gwyddion was compiled
 *          without OpenGL support, it always returns %FALSE.
 **/
gboolean
gwy_widgets_gl_init(void)
{
    /* when called twice, fail but successfully :o) */
    g_return_val_if_fail(glconfig == NULL, TRUE);

#ifdef HAVE_GTKGLEXT
    glconfig = gdk_gl_config_new_by_mode(GDK_GL_MODE_RGB
                                         | GDK_GL_MODE_DEPTH
                                         | GDK_GL_MODE_DOUBLE);
    /* Try double-buffered visual */
    if (!glconfig) {
        g_warning("Cannot find a double-buffered OpenGL visual, "
                  "Trying single-buffered visual.");

        /* Try single-buffered visual */
        glconfig = gdk_gl_config_new_by_mode(GDK_GL_MODE_RGB
                                             | GDK_GL_MODE_DEPTH);
        if (!glconfig) {
            g_warning("No appropriate OpenGL-capable visual found.");
        }
    }
#endif

    return glconfig != NULL;
}

/**
 * gwy_widgets_get_gl_config:
 *
 * Returns OpenGL framebuffer configuration for 3D widgets.
 *
 * Call gwy_widgets_gl_init() first.
 *
 * Returns: The OpenGL framebuffer configuration, %NULL if OpenGL
 *          initialization was not successfull.
 **/
GdkGLConfig*
gwy_widgets_get_gl_config(void)
{
    return glconfig;
}

/************************** Documentation ****************************/

/**
 * SECTION:gwydgets
 * @title: gwydgets
 * @short_description: Base functions
 *
 * Gwyddion classes has to be initialized before they can be safely
 * deserialized. The function gwy_type_init() performs this initialization.
 *
 * Before 3D widgets (#Gwy3DView) can be used, OpenGL must be initialized with
 * gwy_widgets_gl_init().
 **/

/**
 * GdkGLConfig:
 *
 * Placeholder typedef.
 *
 * If Gwyddion is compiled with OpenGL (i.e., GtkGLExt) this is the real
 * <type>GdkGLConfig</type>.  However, if Gwyddion is compiled without OpenGL
 * this type is typedefed as <type>void</type>.
 *
 * Since one cannot actually use any of the Gwyddion OpenGL widgets if they
 * are not enabled, this usually works well.  However, it can break in the
 * unlikely case one compiles with wibgwydgets that have OpenGL disabled and
 * at the same time he uses GtkGLExt directly.  In such case
 * <type>GdkGLConfig</type> is defined twice.   The only known fix is not
 * to include <filename>gwydgets.h</filename> and GtkGLExt headers in the same
 * source file.
 **/

/* vim: set cin et ts=4 sw=4 cino=>1s,e0,n0,f0,{0,}0,^0,\:1s,=0,g1s,h0,t0,+1s,c3,(0,u0 : */