自分で使用する xcb の基本的な ruby モジュールを作成したいと考えています。ヘッダーファイルをswigでラップする基本的なテストを試みました:これが私のxcb_ruby.iです
%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 には次のようなものがあります。
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 * );
メソッド new/connect()、flush()、generate_id()、および disconnect() を持つ Connection クラスが必要です。これが私の新しい xcb_ruby.i です。
%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 ファイルを生成した後にコンパイルしようとすると、エラーが発生します: エラー: 不明な型名 '接続'</p>
誰かが私が間違っている場所を教えてもらえますか?
ありがとう
編集
いくつかの変更を行い、コンパイルできるようになりましたが、まだいくつかのエラーが発生します。
%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);
}
};
これで、モジュールをコンパイルして使用できます。
require './ruxcby'
=> true
conn=Connection.new(nil, nil)
=> #<Ruxcby::Connection:0x0000000223dfc8>
しかし、別の方法を試すと、エラーが発生します。
conn.connection_has_error
ObjectPreviouslyDeleted: Expected argument 0 of type Connection *, but got Ruxcby::Connection #<Ruxcby::
メソッドは存在するようですが、メソッドに引数を渡すときにまだ問題があります。
何か案は??