您有点混淆了Display,它是一个用于与 X 交互的对象,以及一个display name,它是一个可用于识别和连接到 Display 的字符串。
此外,最好不要使用repr('CPointer')
,而不是repr('CStruct')
,XDisplay *
因为 Xlib 文档说它应该被视为一个不透明的指针,并且通过函数访问的所有内容,并且将整个结构转换为 Raku 会很费力(而且不是很有用)。
由于它就像一个对象,您可以选择将所有 Xlib 函数封装在Display
类中,并将它们包装在方法中,如NativeCall 文档的指针部分所示。到目前为止,我对这种风格的代码的翻译是:
use NativeCall;
class Display is repr('CPointer') {
sub XOpenDisplay(Str) returns Display is native('X11') { * }
method new(Str $name = ':0') {
XOpenDisplay($name);
}
# You can wrap a libX11 function in a method explicitly, like this...
sub XDisplayString(Display) returns Str is native('X11') { * }
method DisplayString {
XDisplayString(self);
}
# Or implicitly, by putting 'is native' on a method declaration
# and using 'is symbol' to match the names
# (self will be passed as the first argument to the libX11 function)
method DefaultScreen() returns int32 is native('X11')
is symbol('XDefaultScreen') { * }
method Str {
"Display({ self.DisplayString })";
}
}
my Display $display .= new
or die "Can not open display";
my int $screen = $display.DefaultScreen;
print "display = <" ~ $display ~ ">\n";
print "screen = <" ~ $screen ~ ">\n";
我提供了一个method Str
for Display
,以便可以直接打印它,但同样,不要将对象与用于获取对象的字符串混淆。您可以从这里继续以相同的方式向Display
、 以及定义Screen
、Window
等添加更多方法。您不必这样做——您可以自由地公开定义 subs 并使用对 XOpenDisplay 和其他所有内容的调用,就好像您正在编写 C 一样,但是 OO 样式往往更简洁一些。这是你的选择。