首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xcb库和红宝石

xcb库和红宝石
EN

Stack Overflow用户
提问于 2012-04-06 07:57:34
回答 1查看 254关注 0票数 0

我想为我自己使用的xcb创建一个基本的ruby模块。我尝试了一个基本测试,用swig包装头文件:这是我的xcb_ruby.i

代码语言:javascript
复制
%module ruxcby 
%{
#include <xcb/xcb.h>
#include <xcb/xcb_util.h>
#include <xcb/xcb_aux.h
#include <xcb/xcb_atom.h>
#include <xcb/xcb_event.h>
%}
%include "/usr/include/xcb/xproto.h"
%include "/usr/include/xcb/xcb.h"
%include "/usr/include/xcb/xcb_atom.h"
%include "/usr/include/xcb/xcb_aux.h"
%include "/usr/include/xcb/xcb_event.h"

当我在irb中尝试时,我可以连接来初始化连接,从这个连接中获取信息,但是ruby接口类似于C。我希望有一个更面向对象的接口。

例如,在xcb.h中有:

代码语言:javascript
复制
typedef struct xcb_connection_t xcb_connection_t;
xcb_connection_t * xcb_connect(const char *displayname, int *screenp);
int xcb_flush( xcb_connection_t *);
uint32_t xcb_generate_id( xcb_connection_t *);
void xcb_disconnect(xcb_connection_t * );

我希望有一个连接类,其中包含了新/connect()、flush()、generate_id()和disconnect()方法--这里是我的新xcb_ruby.i:

代码语言:javascript
复制
%module ruxcby
%{
#include <xcb/xcb.h>
#include <xcb/xproto.h>
%}
%import "/usr/include/xcb/xproto.h"

typedef struct xcb_connection_t {
} Connection;

%extend Connection 
{
  Connection(const char *displayname, int *screenp)
  {
    Connection * c;
    c = xcb_connect(displayname, screenp);
    return c;
  }
  int flush()
  {
    return xcb_flush($self);
  }
  xcb_generic_event_t *wait_for_event()
  {
    return xcb_wait_for_event($self);
  }
  void disconnect()
  {
    return xcb_disconnect($self);
  }
  uint32_t generate_id()
  {
    return xcb_generate_id($self);
  }
};

如果我在生成c文件后尝试编译,就会出现一个错误: erreur:未知类型名称‘Connection’

有人能告诉我我哪里错了吗?

谢谢

编辑

我已经做了一些修改,现在我可以编译它了,但是我仍然会遇到一些错误:

代码语言:javascript
复制
%module ruxcby
%{
#include <xcb/xcb.h>
#include <xcb/xproto.h>
typedef struct {
  xcb_connection_t * ptr;
} Connection;
%}
%import "/usr/include/xcb/xproto.h"
%feature("autodoc" , "1");

typedef struct {
  xcb_connection_t * ptr;
} Connection;
%extend Connection {
  Connection(const char *displayname, int *screenp)
 {
    Connection * c ;
    c->ptr = xcb_connect(displayname, screenp);
    return c;
 }
 int flush()
 {  
    return xcb_flush($self->ptr);
 }
 xcb_generic_event_t *wait_for_event()
 {
    return xcb_wait_for_event($self->ptr);
 }
 int connection_has_error()
 {
    return xcb_connection_has_error($self->ptr);
 }
 void disconnect()
 {
   return xcb_disconnect($self->ptr);
 }
 uint32_t generate_id()
 {
    return xcb_generate_id($self->ptr);
 }
};

现在我可以编译我的模块并使用它:

代码语言:javascript
复制
require './ruxcby'
=> true
conn=Connection.new(nil, nil)
=> #<Ruxcby::Connection:0x0000000223dfc8>

但是,当我尝试另一种方法时,我有一个错误:

代码语言:javascript
复制
conn.connection_has_error 
ObjectPreviouslyDeleted: Expected argument 0 of type Connection *, but got Ruxcby::Connection #<Ruxcby::

该方法似乎是存在的,但在将参数传递给该方法时仍然存在问题。

有什么主意吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-10 13:43:51

我提出了解决方案,也许它可以帮助到某人:当我扩展连接类时,我没有为我的结构分配内存:

代码语言:javascript
复制
%extend Connection {
Connection(const char *displayname, int *screenp)
{
  Connection * c ;
  c = (Connection * ) malloc(sizeof(Connection));
  c->ptr = xcb_connect(displayname, screenp);
  return c;
}
~Connection()
{
  free($self);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10040745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档