龙芯操作系统下,GTK的版本是3.14,并不支持直接与OPENGL互操作。

查询了一些资料,在GtkDrawingArea上画出简单的OPENGL图形。

首先基于gtk的网站demo,链接如下:

https://wiki.gnome.org/Projects/Vala/OpenGLSamples

Using GLX: Coloured Triangle

原始vala代码如下:

usingGtk;usingGdk;usingGLX;usingGL;classGLXSample : Gtk.Window {privateX.Display xdisplay;privateGLX.Context context;privateXVisualInfo xvinfo;publicGLXSample () {this.title = "OpenGL with GLX";
set_reallocate_redraws (
true);
destroy.connect (Gtk.main_quit);
int[] attrlist ={
GLX_RGBA,
GLX_RED_SIZE,
1,
GLX_GREEN_SIZE,
1,
GLX_BLUE_SIZE,
1,
GLX_DOUBLEBUFFER,
0};this.xdisplay =x11_get_default_xdisplay ();if (!glXQueryExtension (xdisplay, null, null)) {
stderr.printf (
"OpenGL not supported\n");
}
this.xvinfo =glXChooseVisual (xdisplay, x11_get_default_screen (), attrlist);if (xvinfo == null) {
stderr.printf (
"Error configuring OpenGL\n");
}
var drawing_area = newDrawingArea ();
drawing_area.set_size_request (
300, 300);
drawing_area.set_double_buffered (
false);this.context = glXCreateContext (xdisplay, xvinfo, null, true);

drawing_area.configure_event.connect (on_configure_event);
drawing_area.expose_event.connect (on_expose_event);

add (drawing_area);
}
private bool on_configure_event (Widget widget, Gdk.EventConfigure event) {if (!glXMakeCurrent (xdisplay, x11_drawable_get_xid (widget.window), context))return false;

glViewport (
0, 0, (GLsizei) widget.allocation.width,
(GLsizei) widget.allocation.height);
return true;
}
private bool on_expose_event (Widget widget, Gdk.EventExpose event) {if (!glXMakeCurrent (xdisplay, x11_drawable_get_xid (widget.window), context))return false;

glClear (GL_COLOR_BUFFER_BIT);

glBegin (GL_TRIANGLES);
glIndexi (
0);
glColor3f (
1.0f, 0.0f, 0.0f);
glVertex2i (
0, 1);
glIndexi (
0);
glColor3f (
0.0f, 1.0f, 0.0f);
glVertex2i (
-1, -1);
glIndexi (
0);
glColor3f (
0.0f, 0.0f, 1.0f);
glVertex2i (
1, -1);
glEnd ();

glXSwapBuffers (xdisplay, x11_drawable_get_xid (widget.window));
return true;
}
}
void main (string[] args) {
Gtk.init (
refargs);var sample = newGLXSample ();
sample.show_all ();

Gtk.main ();
}

编译命令:

$ valac --pkg gtk+-2.0 --pkg gdk-x11-2.0 --pkg gl --pkg glx glx-sample.vala

  从这儿看,基于的是gtk+-2.0,同时需要gl.vapi与glx.vapi,可以到

https://wiki.gnome.org/Projects/Vala/ExternalBindings

下去获取

在ubuntu 18.04编译时,有部分编译错误,修正后的vala代码(编译通过,并不能运行)

usingGtk;usingGdk;usingGLX;usingGL;classGLXSample : Gtk.Window {privateX.Display xdisplay;privateGLX.Context context;privateXVisualInfo xvinfo;publicGLXSample () {this.title = "OpenGL with GLX";
set_reallocate_redraws (
true);
destroy.connect (Gtk.main_quit);
int[] attrlist ={
GLX_RGBA,
GLX_RED_SIZE,
1,
GLX_GREEN_SIZE,
1,
GLX_BLUE_SIZE,
1,
GLX_DOUBLEBUFFER,
0};this.xdisplay ;//= x11_get_default_xdisplay (); if (!glXQueryExtension (xdisplay, null, null)) {
stderr.printf (
"OpenGL not supported\n");
}
this.xvinfo =glXChooseVisual (xdisplay, x11_get_default_screen (), attrlist);if (xvinfo == null) {
stderr.printf (
"Error configuring OpenGL\n");
}
var drawing_area = newDrawingArea ();
drawing_area.set_size_request (
300, 300);
drawing_area.set_double_buffered (
false);this.context = glXCreateContext (xdisplay, xvinfo, null, true);

drawing_area.configure_event.connect (on_configure_event);
drawing_area.expose_event.connect (on_expose_event);

add (drawing_area);
}
private bool on_configure_event (Widget widget, Gdk.EventConfigure event) {if (!glXMakeCurrent (xdisplay, x11_drawable_get_xid (widget.window), context))return false;

glViewport (
0, 0, (GLsizei) widget.allocation.width,
(GLsizei) widget.allocation.height);
return true;
}
private bool on_expose_event (Widget widget, Gdk.EventExpose event) {if (!glXMakeCurrent (xdisplay, x11_drawable_get_xid (widget.window), context))return false;

glClear (GL_COLOR_BUFFER_BIT);

glBegin (GL_TRIANGLES);
glIndexi (
0);
glColor3f (
1.0f, 0.0f, 0.0f);
glVertex2i (
0, 1);
glIndexi (
0);
glColor3f (
0.0f, 1.0f, 0.0f);
glVertex2i (
-1, -1);
glIndexi (
0);
glColor3f (
0.0f, 0.0f, 1.0f);
glVertex2i (
1, -1);
glEnd ();

glXSwapBuffers (xdisplay, x11_drawable_get_xid (widget.window));
return true;
}
}
void main (string[] args) {
Gtk.init (
refargs);var sample = newGLXSample ();
sample.show_all ();

Gtk.main ();
}

针对gtk+-3.0的编译链接命令需要修改为:

$ valac --pkg gtk+-3.0 --pkg gdk-x11-3.0 --pkg gl --pkg glx glx-sample.vala

相应的vala代码为:

usingGtk;usingGdk.X11;usingGdk;usingGLX;usingGL;classGLXSample : Gtk.Window {//private X.Display xdisplay;
    privateGLX.Context context;privateXVisualInfo xvinfo;publicGLXSample () {this.title = "OpenGL with GLX";
set_reallocate_redraws (
true);
destroy.connect (Gtk.main_quit);
int[] attrlist ={
GLX_RGBA,
GLX_RED_SIZE,
1,
GLX_GREEN_SIZE,
1,
GLX_BLUE_SIZE,
1,
GLX_DOUBLEBUFFER,
0};var drawing_area = newDrawingArea ();
drawing_area.set_size_request (
300, 300);
drawing_area.set_double_buffered (
false);
drawing_area.show();
var gdk_display = drawing_area.get_display() asGdk.X11.Display;//var xdisplay = gdk_display.get_xdisplay (); if (!glXQueryExtension (gdk_display.get_xdisplay (), null, null)) {
stderr.printf (
"OpenGL not supported\n");
}
var gdk_screen = gdk_display.get_default_screen () asGdk.X11.Screen;this.xvinfo =glXChooseVisual (gdk_display.get_xdisplay (), gdk_screen.get_screen_number(), attrlist);if (xvinfo == null) {
stderr.printf (
"Error configuring OpenGL\n");
}
this.context = glXCreateContext (gdk_display.get_xdisplay (), xvinfo, null, true);

drawing_area.size_allocate.connect (on_size_allocate_event);
drawing_area.draw.connect (on_draw_event);

add (drawing_area);
}
private voidon_size_allocate_event (Widget widget, Gtk.Allocation allocation) {var gdk_window =widget.get_window();if (!(gdk_window isGdk.Window))return;var gdk_display = widget.get_display() asGdk.X11.Display;//var xdisplay = gdk_display.get_xdisplay (); if (!glXMakeCurrent (gdk_display.get_xdisplay (), Gdk.X11Window.get_xid(gdk_window), context))return ;//false; glViewport (0, 0, (GLsizei) allocation.width,
(GLsizei) allocation.height);
return ;//true; }private boolon_draw_event (Widget widget, Cairo.Context cr) {var gdk_window = widget.get_window() asGdk.X11.Window;if (!(gdk_window isGdk.Window))return false;var gdk_display = widget.get_display() asGdk.X11.Display;//var xdisplay = gdk_display.get_xdisplay (); if (!glXMakeCurrent (gdk_display.get_xdisplay (), gdk_window.get_xid(), context))return false;

glClear (GL_COLOR_BUFFER_BIT);

glBegin (GL_TRIANGLES);
glIndexi (
0);
glColor3f (
1.0f, 0.0f, 0.0f);
glVertex2i (
0, 1);
glIndexi (
0);
glColor3f (
0.0f, 1.0f, 0.0f);
glVertex2i (
-1, -1);
glIndexi (
0);
glColor3f (
0.0f, 0.0f, 1.0f);
glVertex2i (
1, -1);
glEnd ();

glXSwapBuffers (gdk_display.get_xdisplay (), gdk_window.get_xid());
//x11_drawable_get_xid (widget.window)); return true;
}
}
void main (string[] args) {
Gtk.init (
refargs);var sample = newGLXSample ();
sample.show_all ();

Gtk.main ();
}

vala生成的代码中,基于opengl的会自动包含glew.h,狗屎,又不一定要用到,注释掉后的c代码

/*gtk3_glx-sample.c generated by valac 0.40.23, the Vala compiler
* generated from gtk3_glx-sample.vala, do not modify
*/#include<glib.h>#include<glib-object.h>#include<gtk/gtk.h>#include<GL/glx.h>#include<gdk/gdkx.h>#include<stdio.h>#include<gdk/gdk.h>#include<cairo.h> //#include <GL/glew.h> #include <stdlib.h>#include<string.h> #define TYPE_GLX_SAMPLE (glx_sample_get_type ()) #define GLX_SAMPLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_GLX_SAMPLE, GLXSample)) #define GLX_SAMPLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_GLX_SAMPLE, GLXSampleClass)) #define IS_GLX_SAMPLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_GLX_SAMPLE)) #define IS_GLX_SAMPLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_GLX_SAMPLE)) #define GLX_SAMPLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_GLX_SAMPLE, GLXSampleClass))typedefstruct_GLXSample GLXSample;
typedef
struct_GLXSampleClass GLXSampleClass;
typedef
struct_GLXSamplePrivate GLXSamplePrivate;enum{
GLX_SAMPLE_0_PROPERTY,
GLX_SAMPLE_NUM_PROPERTIES
};
static GParamSpec*glx_sample_properties[GLX_SAMPLE_NUM_PROPERTIES];#define _XFree0(var) ((var == NULL) ? NULL : (var = (XFree (var), NULL))) #define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL))) struct_GLXSample {
GtkWindow parent_instance;
GLXSamplePrivate
*priv;
};
struct_GLXSampleClass {
GtkWindowClass parent_class;
};
struct_GLXSamplePrivate {
GLXContext context;
XVisualInfo
*xvinfo;
};
static gpointer glx_sample_parent_class =NULL;

GType glx_sample_get_type (
void) G_GNUC_CONST;#define GLX_SAMPLE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_GLX_SAMPLE, GLXSamplePrivate))GLXSample* glx_sample_new (void);
GLXSample
*glx_sample_construct (GType object_type);static void _gtk_main_quit_gtk_widget_destroy (GtkWidget*_sender,
gpointer self);
static void glx_sample_on_size_allocate_event (GLXSample*self,
GtkWidget
*widget,
GtkAllocation
*allocation);static void _glx_sample_on_size_allocate_event_gtk_widget_size_allocate (GtkWidget*_sender,
GtkAllocation
*allocation,
gpointer self);
static gboolean glx_sample_on_draw_event (GLXSample*self,
GtkWidget
*widget,
cairo_t
*cr);static gboolean _glx_sample_on_draw_event_gtk_widget_draw (GtkWidget*_sender,
cairo_t
*cr,
gpointer self);
static void glx_sample_finalize (GObject *obj);void _vala_main (gchar**args,intargs_length1);static void_gtk_main_quit_gtk_widget_destroy (GtkWidget*_sender,
gpointer self)
{
gtk_main_quit ();
}
staticgpointer
_g_object_ref0 (gpointer self)
{
return self ?g_object_ref (self) : NULL;
}
static void_glx_sample_on_size_allocate_event_gtk_widget_size_allocate (GtkWidget*_sender,
GtkAllocation
*allocation,
gpointer self)
{
glx_sample_on_size_allocate_event ((GLXSample
*) self, _sender, allocation);
}
staticgboolean
_glx_sample_on_draw_event_gtk_widget_draw (GtkWidget
*_sender,
cairo_t
*cr,
gpointer self)
{
gboolean result;
result
= glx_sample_on_draw_event ((GLXSample*) self, _sender, cr);returnresult;
}


GLXSample
*glx_sample_construct (GType object_type)
{
GLXSample
* self =NULL;
gint
* attrlist =NULL;
gint
*_tmp0_;
gint attrlist_length1;
gint _attrlist_size_;
GtkDrawingArea
* drawing_area =NULL;
GtkDrawingArea
*_tmp1_;
GtkDrawingArea
*_tmp2_;
GtkDrawingArea
*_tmp3_;
GtkDrawingArea
*_tmp4_;
GdkX11Display
* gdk_display =NULL;
GtkDrawingArea
*_tmp5_;
GdkDisplay
*_tmp6_;
GdkX11Display
*_tmp7_;
GdkX11Display
*_tmp8_;
Display
*_tmp9_;
GdkX11Screen
* gdk_screen =NULL;
GdkX11Display
*_tmp11_;
GdkScreen
*_tmp12_;
GdkX11Screen
*_tmp13_;
GdkX11Display
*_tmp14_;
Display
*_tmp15_;
GdkX11Screen
*_tmp16_;
gint
*_tmp17_;
gint _tmp17__length1;
XVisualInfo
*_tmp18_;
XVisualInfo
*_tmp19_;
GdkX11Display
*_tmp21_;
Display
*_tmp22_;
XVisualInfo
*_tmp23_;
GtkDrawingArea
*_tmp24_;
GtkDrawingArea
*_tmp25_;
GtkDrawingArea
*_tmp26_;
self
= (GLXSample*) g_object_new (object_type, NULL);
gtk_window_set_title ((GtkWindow
*) self, "OpenGL with GLX");
gtk_container_set_reallocate_redraws ((GtkContainer
*) self, TRUE);
g_signal_connect ((GtkWidget
*) self, "destroy", (GCallback) _gtk_main_quit_gtk_widget_destroy, NULL);
_tmp0_
= g_new0 (gint, 9);
_tmp0_[
0] =GLX_RGBA;
_tmp0_[
1] =GLX_RED_SIZE;
_tmp0_[
2] = 1;
_tmp0_[
3] =GLX_GREEN_SIZE;
_tmp0_[
4] = 1;
_tmp0_[
5] =GLX_BLUE_SIZE;
_tmp0_[
6] = 1;
_tmp0_[
7] =GLX_DOUBLEBUFFER;
_tmp0_[
8] = 0;
attrlist
=_tmp0_;
attrlist_length1
= 9;
_attrlist_size_
=attrlist_length1;
_tmp1_
= (GtkDrawingArea*) gtk_drawing_area_new ();
g_object_ref_sink (_tmp1_);
drawing_area
=_tmp1_;
_tmp2_
=drawing_area;
gtk_widget_set_size_request ((GtkWidget
*) _tmp2_, 300, 300);
_tmp3_
=drawing_area;
gtk_widget_set_double_buffered ((GtkWidget
*) _tmp3_, FALSE);
_tmp4_
=drawing_area;
gtk_widget_show ((GtkWidget
*) _tmp4_);
_tmp5_
=drawing_area;
_tmp6_
= gtk_widget_get_display ((GtkWidget*) _tmp5_);
_tmp7_
= _g_object_ref0 (G_TYPE_CHECK_INSTANCE_TYPE (_tmp6_, gdk_x11_display_get_type ()) ? ((GdkX11Display*) _tmp6_) : NULL);
gdk_display
=_tmp7_;
_tmp8_
=gdk_display;
_tmp9_
=gdk_x11_display_get_xdisplay (_tmp8_);if (!glXQueryExtension (_tmp9_, NULL, NULL)) {
FILE
*_tmp10_;
_tmp10_
=stderr;
fprintf (_tmp10_,
"OpenGL not supported\n");
}
_tmp11_
=gdk_display;
_tmp12_
= gdk_display_get_default_screen ((GdkDisplay*) _tmp11_);
_tmp13_
= _g_object_ref0 (G_TYPE_CHECK_INSTANCE_TYPE (_tmp12_, gdk_x11_screen_get_type ()) ? ((GdkX11Screen*) _tmp12_) : NULL);
gdk_screen
=_tmp13_;
_tmp14_
=gdk_display;
_tmp15_
=gdk_x11_display_get_xdisplay (_tmp14_);
_tmp16_
=gdk_screen;
_tmp17_
=attrlist;
_tmp17__length1
=attrlist_length1;
_tmp18_
=glXChooseVisual (_tmp15_, gdk_x11_screen_get_screen_number (_tmp16_), _tmp17_);
_XFree0 (self
->priv->xvinfo);
self
->priv->xvinfo =_tmp18_;
_tmp19_
= self->priv->xvinfo;if (_tmp19_ ==NULL) {
FILE
*_tmp20_;
_tmp20_
=stderr;
fprintf (_tmp20_,
"Error configuring OpenGL\n");
}
_tmp21_
=gdk_display;
_tmp22_
=gdk_x11_display_get_xdisplay (_tmp21_);
_tmp23_
= self->priv->xvinfo;
self
->priv->context =glXCreateContext (_tmp22_, _tmp23_, NULL, TRUE);
_tmp24_
=drawing_area;
g_signal_connect_object ((GtkWidget
*) _tmp24_, "size-allocate", (GCallback) _glx_sample_on_size_allocate_event_gtk_widget_size_allocate, self, 0);
_tmp25_
=drawing_area;
g_signal_connect_object ((GtkWidget
*) _tmp25_, "draw", (GCallback) _glx_sample_on_draw_event_gtk_widget_draw, self, 0);
_tmp26_
=drawing_area;
gtk_container_add ((GtkContainer
*) self, (GtkWidget*) _tmp26_);
_g_object_unref0 (gdk_screen);
_g_object_unref0 (gdk_display);
_g_object_unref0 (drawing_area);
attrlist
=(g_free (attrlist), NULL);returnself;
}


GLXSample
*glx_sample_new (void)
{
returnglx_sample_construct (TYPE_GLX_SAMPLE);
}
static voidglx_sample_on_size_allocate_event (GLXSample*self,
GtkWidget
*widget,
GtkAllocation
*allocation)
{
GdkWindow
* gdk_window =NULL;
GdkWindow
*_tmp0_;
GdkWindow
*_tmp1_;
GdkWindow
*_tmp2_;
GdkX11Display
* gdk_display =NULL;
GdkDisplay
*_tmp3_;
GdkX11Display
*_tmp4_;
GdkX11Display
*_tmp5_;
Display
*_tmp6_;
GdkWindow
*_tmp7_;
GLXContext _tmp8_;
GtkAllocation _tmp9_;
gint _tmp10_;
GtkAllocation _tmp11_;
gint _tmp12_;
g_return_if_fail (self
!=NULL);
g_return_if_fail (widget
!=NULL);
g_return_if_fail (allocation
!=NULL);
_tmp0_
=gtk_widget_get_window (widget);
_tmp1_
=_g_object_ref0 (_tmp0_);
gdk_window
=_tmp1_;
_tmp2_
=gdk_window;if (!G_TYPE_CHECK_INSTANCE_TYPE (_tmp2_, gdk_window_get_type ())) {
_g_object_unref0 (gdk_window);
return;
}
_tmp3_
=gtk_widget_get_display (widget);
_tmp4_
= _g_object_ref0 (G_TYPE_CHECK_INSTANCE_TYPE (_tmp3_, gdk_x11_display_get_type ()) ? ((GdkX11Display*) _tmp3_) : NULL);
gdk_display
=_tmp4_;
_tmp5_
=gdk_display;
_tmp6_
=gdk_x11_display_get_xdisplay (_tmp5_);
_tmp7_
=gdk_window;
_tmp8_
= self->priv->context;if (!glXMakeCurrent (_tmp6_, (GLXDrawable) gdk_x11_window_get_xid (_tmp7_), _tmp8_)) {
_g_object_unref0 (gdk_display);
_g_object_unref0 (gdk_window);
return;
}
_tmp9_
= *allocation;
_tmp10_
=_tmp9_.width;
_tmp11_
= *allocation;
_tmp12_
=_tmp11_.height;
glViewport ((GLint)
0, (GLint) 0, (GLsizei) _tmp10_, (GLsizei) _tmp12_);
_g_object_unref0 (gdk_display);
_g_object_unref0 (gdk_window);
return;
}
staticgboolean
glx_sample_on_draw_event (GLXSample
*self,
GtkWidget
*widget,
cairo_t
*cr)
{
gboolean result
=FALSE;
GdkX11Window
* gdk_window =NULL;
GdkWindow
*_tmp0_;
GdkX11Window
*_tmp1_;
GdkX11Window
*_tmp2_;
GdkX11Display
* gdk_display =NULL;
GdkDisplay
*_tmp3_;
GdkX11Display
*_tmp4_;
GdkX11Display
*_tmp5_;
Display
*_tmp6_;
GdkX11Window
*_tmp7_;
GLXContext _tmp8_;
GdkX11Display
*_tmp9_;
Display
*_tmp10_;
GdkX11Window
*_tmp11_;
g_return_val_if_fail (self
!=NULL, FALSE);
g_return_val_if_fail (widget
!=NULL, FALSE);
g_return_val_if_fail (cr
!=NULL, FALSE);
_tmp0_
=gtk_widget_get_window (widget);
_tmp1_
= _g_object_ref0 (G_TYPE_CHECK_INSTANCE_TYPE (_tmp0_, gdk_x11_window_get_type ()) ? ((GdkX11Window*) _tmp0_) : NULL);
gdk_window
=_tmp1_;
_tmp2_
=gdk_window;if (!G_TYPE_CHECK_INSTANCE_TYPE (_tmp2_, gdk_window_get_type ())) {
result
=FALSE;
_g_object_unref0 (gdk_window);
returnresult;
}
_tmp3_
=gtk_widget_get_display (widget);
_tmp4_
= _g_object_ref0 (G_TYPE_CHECK_INSTANCE_TYPE (_tmp3_, gdk_x11_display_get_type ()) ? ((GdkX11Display*) _tmp3_) : NULL);
gdk_display
=_tmp4_;
_tmp5_
=gdk_display;
_tmp6_
=gdk_x11_display_get_xdisplay (_tmp5_);
_tmp7_
=gdk_window;
_tmp8_
= self->priv->context;if (!glXMakeCurrent (_tmp6_, (GLXDrawable) gdk_x11_window_get_xid (_tmp7_), _tmp8_)) {
result
=FALSE;
_g_object_unref0 (gdk_display);
_g_object_unref0 (gdk_window);
returnresult;
}
glClear ((GLbitfield) GL_COLOR_BUFFER_BIT);
glBegin ((GLenum) GL_TRIANGLES);
glIndexi ((GLint)
0);
glColor3f ((GLfloat)
1.0f, (GLfloat) 0.0f, (GLfloat) 0.0f);
glVertex2i ((GLint)
0, (GLint) 1);
glIndexi ((GLint)
0);
glColor3f ((GLfloat)
0.0f, (GLfloat) 1.0f, (GLfloat) 0.0f);
glVertex2i ((GLint)
-1, (GLint) -1);
glIndexi ((GLint)
0);
glColor3f ((GLfloat)
0.0f, (GLfloat) 0.0f, (GLfloat) 1.0f);
glVertex2i ((GLint)
1, (GLint) -1);
glEnd ();
_tmp9_
=gdk_display;
_tmp10_
=gdk_x11_display_get_xdisplay (_tmp9_);
_tmp11_
=gdk_window;
glXSwapBuffers (_tmp10_, (GLXDrawable) gdk_x11_window_get_xid (_tmp11_));
result
=TRUE;
_g_object_unref0 (gdk_display);
_g_object_unref0 (gdk_window);
returnresult;
}
static voidglx_sample_class_init (GLXSampleClass*klass)
{
glx_sample_parent_class
=g_type_class_peek_parent (klass);
g_type_class_add_private (klass,
sizeof(GLXSamplePrivate));
G_OBJECT_CLASS (klass)
->finalize =glx_sample_finalize;
}
static voidglx_sample_instance_init (GLXSample*self)
{
self
->priv =GLX_SAMPLE_GET_PRIVATE (self);
}
static voidglx_sample_finalize (GObject*obj)
{
GLXSample
*self;
self
=G_TYPE_CHECK_INSTANCE_CAST (obj, TYPE_GLX_SAMPLE, GLXSample);
_XFree0 (self
->priv->xvinfo);
G_OBJECT_CLASS (glx_sample_parent_class)
->finalize (obj);
}


GType
glx_sample_get_type (
void)
{
static volatile gsize glx_sample_type_id__volatile = 0;if (g_once_init_enter (&glx_sample_type_id__volatile)) {static const GTypeInfo g_define_type_info = { sizeof (GLXSampleClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) glx_sample_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (GLXSample), 0, (GInstanceInitFunc) glx_sample_instance_init, NULL };
GType glx_sample_type_id;
glx_sample_type_id
= g_type_register_static (gtk_window_get_type (), "GLXSample", &g_define_type_info, 0);
g_once_init_leave (
&glx_sample_type_id__volatile, glx_sample_type_id);
}
returnglx_sample_type_id__volatile;
}
void_vala_main (gchar**args,intargs_length1)
{
GLXSample
* sample =NULL;
GLXSample
*_tmp0_;
gtk_init (
&args_length1, &args);
_tmp0_
=glx_sample_new ();
g_object_ref_sink (_tmp0_);
sample
=_tmp0_;
gtk_widget_show_all ((GtkWidget
*) sample);
gtk_main ();
_g_object_unref0 (sample);
}
intmain (intargc,char **argv)
{
_vala_main (argv, argc);
return 0;
}

 

很多Linux桌面系统默认不生成Core文件,此时的应用软件遇到Crash问题没有Core文件,就很难确定问题根因。

因此,在应用中开启程序的Core Dump功能,很有实际意义

实现这个功能分两步:

1.设置进程可以dump

    //set app dumpable
    prctl(PR_SET_DUMPABLE, 1);

2.设置rlimit_core的大小

    //set core size
    structrlimit rlimit_core;
rlimit_core.rlim_cur
=CORE_FILE_SIZE;
rlimit_core.rlim_max
=CORE_FILE_SIZE;
setrlimit(RLIMIT_CORE,
&rlimit_core);

头文件依赖有如下:

#include <sys/prctl.h>#include<sys/resource.h>

 

在Linux下运行YY,WINE方式,主要注册表修改点

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Wine\Fonts\Replacements]
"DFKai-SB"="WenQuanYi Micro Hei"
"FangSong"="WenQuanYi Micro Hei"
"KaiTi"="WenQuanYi Micro Hei"
"Microsoft JhengHei"="WenQuanYi Micro Hei"
"Microsoft YaHei"="WenQuanYi Micro Hei"
"MingLiU"="WenQuanYi Micro Hei"
"MS Gothic"="TakaoGothic"
"MS Mincho"="TakaoMincho"
"MS PGothic"="TakaoPGothic"
"MS PMincho"="TakaoPMincho"
"MS UI Gothic"="TakaoGothic"
"NSimSun"="WenQuanYi Micro Hei"
"PMingLiU"="WenQuanYi Micro Hei"
"SimHei"="WenQuanYi Micro Hei"
"SimKai"="WenQuanYi Micro Hei"
"SimSun"="WenQuanYi Micro Hei"

Windows的Fonts目录下的文件列表:

/home/users/.wine/drive_c/windows/Fonts/Arial.ttf/home/users/.wine/drive_c/windows/Fonts/Arial.TTF/home/users/.wine/drive_c/windows/Fonts/Arialbd.TTF/home/users/.wine/drive_c/windows/Fonts/ArialBd.ttf/home/users/.wine/drive_c/windows/Fonts/Arialbi.TTF/home/users/.wine/drive_c/windows/Fonts/ArialBI.ttf/home/users/.wine/drive_c/windows/Fonts/Ariali.TTF/home/users/.wine/drive_c/windows/Fonts/ArialI.ttf/home/users/.wine/drive_c/windows/Fonts/AriBlk.TTF/home/users/.wine/drive_c/windows/Fonts/batang.ttf/home/users/.wine/drive_c/windows/Fonts/cambria.ttc/home/users/.wine/drive_c/windows/Fonts/cambriab.ttf/home/users/.wine/drive_c/windows/Fonts/cambriai.ttf/home/users/.wine/drive_c/windows/Fonts/cambriaz.ttf/home/users/.wine/drive_c/windows/Fonts/Comic.TTF/home/users/.wine/drive_c/windows/Fonts/Comicbd.TTF/home/users/.wine/drive_c/windows/Fonts/consolab.ttf/home/users/.wine/drive_c/windows/Fonts/consolai.ttf/home/users/.wine/drive_c/windows/Fonts/consolaz.ttf/home/users/.wine/drive_c/windows/Fonts/constan.ttf/home/users/.wine/drive_c/windows/Fonts/constanb.ttf/home/users/.wine/drive_c/windows/Fonts/constani.ttf/home/users/.wine/drive_c/windows/Fonts/constanz.ttf/home/users/.wine/drive_c/windows/Fonts/cour.ttf/home/users/.wine/drive_c/windows/Fonts/courbd.ttf/home/users/.wine/drive_c/windows/Fonts/courbi.ttf/home/users/.wine/drive_c/windows/Fonts/couri.ttf/home/users/.wine/drive_c/windows/Fonts/dotum.ttf/home/users/.wine/drive_c/windows/Fonts/DroidSans.ttf/home/users/.wine/drive_c/windows/Fonts/DroidSans-Bold.ttf/home/users/.wine/drive_c/windows/Fonts/DroidSansFallback.ttf/home/users/.wine/drive_c/windows/Fonts/DroidSansJapanese.ttf/home/users/.wine/drive_c/windows/Fonts/DroidSerif-Bold.ttf/home/users/.wine/drive_c/windows/Fonts/DroidSerif-BoldItalic.ttf/home/users/.wine/drive_c/windows/Fonts/DroidSerif-Italic.ttf/home/users/.wine/drive_c/windows/Fonts/DroidSerif-Regular.ttf/home/users/.wine/drive_c/windows/Fonts/Georgia.TTF/home/users/.wine/drive_c/windows/Fonts/Georgiab.TTF/home/users/.wine/drive_c/windows/Fonts/Georgiai.TTF/home/users/.wine/drive_c/windows/Fonts/Georgiaz.TTF/home/users/.wine/drive_c/windows/Fonts/gulim.ttf/home/users/.wine/drive_c/windows/Fonts/hline.ttf/home/users/.wine/drive_c/windows/Fonts/Impact.TTF/home/users/.wine/drive_c/windows/Fonts/ipag-mona.ttf/home/users/.wine/drive_c/windows/Fonts/ipagp-mona.ttf/home/users/.wine/drive_c/windows/Fonts/ipagui-mona.ttf/home/users/.wine/drive_c/windows/Fonts/ipam-mona.ttf/home/users/.wine/drive_c/windows/Fonts/ipamp-mona.ttf/home/users/.wine/drive_c/windows/Fonts/TakaoExMincho.ttf/home/users/.wine/drive_c/windows/Fonts/TakaoGothic.ttf/home/users/.wine/drive_c/windows/Fonts/TakaoMincho.ttf/home/users/.wine/drive_c/windows/Fonts/TakaoPGothic.ttf/home/users/.wine/drive_c/windows/Fonts/TakaoPMincho.ttf/home/users/.wine/drive_c/windows/Fonts/Times.ttf/home/users/.wine/drive_c/windows/Fonts/Times.TTF/home/users/.wine/drive_c/windows/Fonts/Timesbd.TTF/home/users/.wine/drive_c/windows/Fonts/TimesBd.ttf/home/users/.wine/drive_c/windows/Fonts/Timesbi.TTF/home/users/.wine/drive_c/windows/Fonts/TimesBI.ttf/home/users/.wine/drive_c/windows/Fonts/Timesi.TTF/home/users/.wine/drive_c/windows/Fonts/TimesI.ttf/home/users/.wine/drive_c/windows/Fonts/trebuc.ttf/home/users/.wine/drive_c/windows/Fonts/trebucbd.ttf/home/users/.wine/drive_c/windows/Fonts/Trebucbd.ttf/home/users/.wine/drive_c/windows/Fonts/trebucit.ttf/home/users/.wine/drive_c/windows/Fonts/Verdana.ttf/home/users/.wine/drive_c/windows/Fonts/Verdana.TTF/home/users/.wine/drive_c/windows/Fonts/Verdanab.ttf/home/users/.wine/drive_c/windows/Fonts/Verdanab.TTF/home/users/.wine/drive_c/windows/Fonts/Verdanai.ttf/home/users/.wine/drive_c/windows/Fonts/Verdanai.TTF/home/users/.wine/drive_c/windows/Fonts/Verdanaz.ttf/home/users/.wine/drive_c/windows/Fonts/Verdanaz.TTF/home/users/.wine/drive_c/windows/Fonts/Webdings.TTF/home/users/.wine/drive_c/windows/Fonts/wqy-microhei.ttc

 

安卓下的so,由于需要链接第三方lib库,导出符号时,总是会将第三方的符号也导出了。

根据LD链接,可以指定相应的version_script,简化的version_script为如下格式:

{
global:
XXXXXXXXXXX
;YYYYYYYYYYYY;local:*;};
XXXXXXXXXXX与YYYYYYYYYYYY即需要导出的符号。
研究了一下,利用nm.exe与awk.exe,实现了在windows下交叉编译时,只导出指定符号

关键代码行:
add_custom_command(TARGET abcd PRE_LINK
COMMAND ${ANDROID_NDK}
/toolchains/aarch64-linux-android-4.9/prebuilt/windows-x86_64/bin/aarch64-linux-android-nm.exe -g "\$(abcd_OBJECTS)" > ${CMAKE_CURRENT_BINARY_DIR}/cwCrypt_${ANDROID_ABI}.txt
COMMAND ..\\..\\..\\..\\
awk.exe \"BEGIN{print(\\"{\\nglobal\:\\")} / T /{print $$NF,\\"\;\\"} END {print(\\"local\:\*\;}\\\;\\")}\" ${CMAKE_CURRENT_BINARY_DIR}/abcd_${ANDROID_ABI}.txt > ${CMAKE_CURRENT_BINARY_DIR}/abcd_${ANDROID_ABI}.def COMMAND ${CMAKE_COMMAND} -E remove -f ${CMAKE_CURRENT_BINARY_DIR}/abcd_${ANDROID_ABI}.txt )

这儿的abcd,即将要链接出来的so文件,默认只导出编译abcd时指定的目标文件中的符号;

利用awk的/ T /过滤掉非导出的符号

这儿会生成一个abcd_armv8.txt及abcd_armv8.def

此命令后会删除txt文件,相应def文件则使用如下命令来删除

add_custom_command(TARGET abcd POST_BUILD COMMAND ${CMAKE_COMMAND} -E remove -f ${CMAKE_CURRENT_BINARY_DIR}/abcd_${ANDROID_ABI}.def)

使用相应的def文件可以有两种实现方式,如下:

#set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--version-script,\"${CMAKE_CURRENT_BINARY_DIR}/abcd_${ANDROID_ABI}.def\" ${CMAKE_SHARED_LINKER_FLAGS}")
set_target_properties(abcd PROPERTIES LINK_FLAGS
"-Wl,--version-script,\"${CMAKE_CURRENT_BINARY_DIR}/abcd_${ANDROID_ABI}.def\"")

如此后,编译出来的so文件,将只剩下编译库时中指定导出的符号,其余符号均会被隐藏为内部符号

 

 



 

AutoHotKey脚本模板实现初始化、配置、退出

#NoEnv
SetWorkingDir
%A_ScriptDir%CoordMode, Mouse, Screen
SendMode Input
#SingleInstance Force
SetTitleMatchMode
2#WinActivateForce
SetControlDelay
1SetWinDelay0SetKeyDelay-1SetMouseDelay-1SetBatchLines-1; WinSet, Transparent, Off

#NoEnv
#Warn
SetWorkingDir
%A_ScriptDir%; Ensures a consistent starting directory.

toggle_get_blood :
= 0get_blood_count := 0is_show_gui := 0is_create_gui :=0NewHotKey := "^F9"MsgBox ,64, 使用提示, 系统要求:xxxxxxxxxxxx, 30;;先配置默认快捷键
Hotkey,
^F1, Change_HotKey_Show
Hotkey,
^F2, Exit_App
Hotkey,
^F9, Run_arkAutoGetBlood
Return

;;;
Change_HotKey_Show:
if is_create_gui = 0{
is_create_gui
= 1Gui, Add, Text, x8 y8 w100 h24+0x200, 自动抽血快捷键:
Gui, Add, Hotkey, x128 y8 w268 h24 vNewHotKey,
%NewHotKey%Gui, Add, Button, x40 y56 w80 h25default gChange_HotKey, 确认(&O)
Gui, Add, Button, x288 y56 w80 h25 gCloseForm, 取消(
&C)
Gui, Show, w412 h97, 配置快捷键
}
else{if is_show_gui = 0{
is_show_gui
= 1Gui, Show, w412 h97, 配置快捷键
}
else{
MsgBox ,
64, 提示, 重复按键, 1}
}
Return

Change_HotKey:
Gui Submit
display_hot_key
= %NewHotKey%StringReplace, display_hot_key, display_hot_key,+,Shift +, All
StringReplace, display_hot_key, display_hot_key,
^,Ctrl +, All
StringReplace, display_hot_key, display_hot_key,
!,Alt +, All
MsgBox ,
64, 提示, 新快捷键: %display_hot_key%, 3Hotkey,%NewHotKey%, Run_arkAutoGetBlood
Return

CloseForm:
Gui, Hide
is_show_gui
= 1Return

;;;

脚本下补充自己的主体功能实现体:

Run_arkAutoGetBlood
即可