小编non*_*hip的帖子

如何在x11中获得屏幕像素的颜色

我想获得整个x11显示器的顶部/左侧像素(0; 0)的RGB值.

到目前为止我得到了什么:

XColor c;
Display *d = XOpenDisplay((char *) NULL);

XImage *image;
image = XGetImage (d, RootWindow (d, DefaultScreen (d)), x, y, 1, 1, AllPlanes, XYPixmap);
c->pixel = XGetPixel (image, 0, 0);
XFree (image);
XQueryColor (d, DefaultColormap(d, DefaultScreen (d)), c);
cout << c.red << " " << c.green << " " << c.blue << "\n";
Run Code Online (Sandbox Code Playgroud)

但我需要这些价值观,0..255或者(0.00)..(1.00),虽然它们看起来0..57825,但我认识的格式不是.

另外,复制整个屏幕只是为了得到一个像素是非常慢的.因为这将用于速度关键的环境,如果有人知道更高效的方式,我会很感激.也许使用XGetSubImage1x1大小,但我在x11开发时非常糟糕,并且不知道如何实现它.

我该怎么办?

c++ linux x11 xlib

8
推荐指数
1
解决办法
5562
查看次数

在序言中读取行到原子列表

我需要将任何行(来自 user_input)读入原子列表,例如:

Example line, which contains any ASCII chars.
Run Code Online (Sandbox Code Playgroud)

进入:

[Example,'line,',which,contains,any,ASCII,'chars.']
Run Code Online (Sandbox Code Playgroud)

到目前为止我所得到的:

read_line_to_codes(user_input, Input),
atom_codes(IA,Input),
atomic_list_concat(AlistI,' ',IA).
Run Code Online (Sandbox Code Playgroud)

但这仅适用于单个单词,因为 atom_codes。read/2 也抱怨空格,所以有什么办法可以做到这一点吗?

哦,然后可能以逗号分割成二维列表,附加点/感叹号/问号,例如:

[[Example,line],[which,contains,any,ASCII,chars],'.']
Run Code Online (Sandbox Code Playgroud)

顺便说一句:那是 SWI 序言。

编辑:找到解决方案:

read_line_to_codes(user_input, Input),
string_to_atom(Input,IA),
atomic_list_concat(AlistI,' ',IA),
Run Code Online (Sandbox Code Playgroud)

无法回答我自己的问题,因为我没有 100 声望:-/

prolog swi-prolog

5
推荐指数
1
解决办法
4631
查看次数

css :before/:after 伪元素/内容引用标签名

是否可以使用 CSS 的“内容”属性(在 :before/:after 伪元素中)用标签名称实际标记一个块?像attr(...),但用于标记而不是其属性。

伪CSS:

body *:before{
  content: tagname;
  color: red;
}
Run Code Online (Sandbox Code Playgroud)

应该在页面中的所有元素前面加上用红色书写的标签名称。

html css

5
推荐指数
1
解决办法
2240
查看次数

udp 客户端在接收来自服务器的消息时发送 ICMP“端口不可达”

移动:https://superuser.com/questions/782549/udp-client-sending-icmp-port-unreachable-when-receiveing-messages-from-the-ser

我有一个使用 luasocket 的 udp 客户端,基本上是这样做的(有几个抽象层,但这就是那里发生的事情):

s=socket.udp()
s:setsockname("*",0)
s:setpeername(socket.dns.toip("example.com"),64299)
s:settimeout(0)
s:send(...)
s:settimeout(10)
msg,err=s:receive()
s:settimeout(0)
print(msg,err)
Run Code Online (Sandbox Code Playgroud)

虽然在服务器的调试输出中看到一切正常(ssh 到远程主机),但我在客户端中收到“超时”错误。

当使用客户端wireshark检查所有内容时,我看到客户端发送的数据包,以及来自服务器的响应数据包(正确的端口和所有内容),以及从我的客户端主机发送到服务器的ICMP“端口不可达”数据包,以响应这是(正确的)回应。

那里发生了什么事?我尝试了所有方法,包括将 iptables 重置为“接受所有内容”,但我的客户端仍然发送“端口无法访问”。

相关数据包是:

From            To                  Len Description
192.168.2.100   95.143.172.171  UDP 61  Source port: 45025  Destination port: 64299
  000e8f11e7000025229835a908004500002f4008400040112b6fc0a802645f8facabafe1fb2b001b28d794d2000ec8360100aa81a477616e74a3756964
95.143.172.171  192.168.2.100   UDP 60  Source port: 64299  Destination port: 45025
  0025229835a9000e8f11e70008004500002b000040003911727b5f8facabc0a80264fb2bafe100172e8d94d2000e0ea10100a681a3756964ff000000
192.168.2.100   95.143.172.171  ICMP 85 Destination unreachable (Port unreachable)
  000e8f11e7000025229835a9080045c00047061d00004001a492c0a802645f8facab0303cc6c000000004500002b000040003911727b5f8facabc0a80264fb2bafe100172e8d94d2000e0ea10100a681a3756964ff
Run Code Online (Sandbox Code Playgroud)

防火墙,以防万一它很重要(我认为这并不重要,因为 iptables 在发生这种情况时不会增加任何 INPUT 数据包计数器):

$ sudo iptables -S
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-A INPUT -i lo …
Run Code Online (Sandbox Code Playgroud)

sockets networking udp luasocket icmp

5
推荐指数
1
解决办法
3万
查看次数

编写 Linux 终端模拟器

我想编写一个 x11 终端模拟器,但我不知道我应该如何生成并与 shell 通信,是否有任何基本的(伪或 C)代码?比如要创建什么样的 PTY,如何将 shell 绑定到它,我必须捕捉或发送什么信号,等等。并不是真的想对整个 xterm 源进行排序。

编辑:哦,我想实现一种与其中的任何应用程序进行通信的方式,我该如何进行功能发现?“客户端”中有一些隐藏的ansi序列,希望它不会与其他终端模拟器冲突?一些环境变量,希望它不会与“客户端”发生冲突或被 shell 删除?

linux tty pty terminal-emulator

4
推荐指数
2
解决办法
7952
查看次数

“增量”`std::variant` 替代方案

我想增加/减少 astd::variant的类型替代,基本上像这样:

using var_t = std::variant</*...*/>;
var_t var;
var.emplace< (var.index()+1) % std::variant_size<var_t> >(); // "increment" case, wrapping for good measure
Run Code Online (Sandbox Code Playgroud)

这里的问题是,虽然emplace期望 clang 的错误消息称为“显式指定的参数”,index但似乎不是constexpr.

明显的替代方案是这样的:

switch(var.index()){
  0:
    var.emplace<1>();
    break;
  1:
    var.emplace<2>();
    break;
// ...
  variant_size<var_t>-1:
    var.emplace<0>();
}
Run Code Online (Sandbox Code Playgroud)

但这就是我个人所说的“极其丑陋”和“维护背后的巨大痛苦”(特别是因为我必须维护这些块的两个几乎副本,以进行递增和递减)。

有没有更好/“正确”的方法来做到这一点?

如果该信息在任何方面都很重要,我的目标C++20是.clanglibstdc++

c++ c++20 std-variant

2
推荐指数
2
解决办法
383
查看次数

在C中,NULL等于0,所以我应该将这两个值视为零吗?

Afaik NULL可以(或者实际上,至少在我的stdlib实现中)#define'd as:

#define NULL ((void*)0)
Run Code Online (Sandbox Code Playgroud)

此外,/sf/answers/64727841/声明在C++中NULL是透明地转换为/从((int)0)(这是std::nullptr在C++中使用的原因,因为它有一个真正的nil类型/值对,由于nullptr_topaque typedef).

所以,我目前正在开发一个LuaJIT库,并希望提供一个辅助函数来检查值nil/ NULL/不管(=价值意义 nil,但也许不是类型nil).

目前,那是:

function ffi.nil(value)
  return value==nil or value==ffi.NULL
end
Run Code Online (Sandbox Code Playgroud)

但是,在我的系统中(NULL==0)通过此片段打印验证,在C中是真的,这是正确的true:

#include <stdio.h>
#include <stdlib.h>
void main(void){
  if(NULL==0)
    printf("true\n");
  else
    printf("false\n");
}
Run Code Online (Sandbox Code Playgroud)

那么我应该去寻找" nil意义价值"的定义吗?

function ffi.nil(value)
  return value==nil or value==ffi.NULL or value==0
end
Run Code Online (Sandbox Code Playgroud)

TL; DR:在C中,NULL等于0,而在LuaJIT的FFI中,没有两对nil, ffi.NULL, 0相等; 因此,在定义nil …

c null lua luajit

1
推荐指数
1
解决办法
1568
查看次数

标签 统计

c++ ×2

linux ×2

c ×1

c++20 ×1

css ×1

html ×1

icmp ×1

lua ×1

luajit ×1

luasocket ×1

networking ×1

null ×1

prolog ×1

pty ×1

sockets ×1

std-variant ×1

swi-prolog ×1

terminal-emulator ×1

tty ×1

udp ×1

x11 ×1

xlib ×1