问题描述
我正在学习C语言的X11编程。我编写了这个小代码,它只是创建了一个窗口:
var places = [{
lat: 12.123,lng: 13.213,city: 'New York'
},{
lat: 3.123,lng: 2.213,lng: 4.123,city: 'Some City'
}];
const getUniqueBy = (arr,prop) => {
const set = new Set;
return arr.filter(o => !set.has(o[prop]) && set.add(o[prop]));
};
console.log(getUniqueBy(places,'city'));
我有一台Linux PC(Ubuntu发行版),并安装了Gnome桌面环境。我已经成功编译并从Gnome的图形终端运行了程序。
据我所知,X11程序应该在没有桌面环境帮助的情况下运行。因此,我切换到了TTY( ALT + F3 ),并尝试从那里运行该程序。但显示“无法打开显示”。
阅读一些帖子后,我了解到我应该#include<stdio.h>
#include<stdlib.h>
#include<X11/Xlib.h>
int main(int argc,char *argv[]) {
Display *display;
int screen;
Window win;
XEvent event;
display = XOpenDisplay((char*)0);
if(display == NULL) {
fprintf(stderr,"Cannot open display\n");
exit(1);
}
screen = DefaultScreen(display);
win=XCreateSimpleWindow(display,RootWindow(display,screen),100,1000,600,1,BlackPixel(display,WhitePixel(display,screen));
XSelectInput(display,win,ExposureMask | KeyPressMask);
XMapWindow(display,win);
while(1) {
XNextEvent(display,&event);
}
return 0;
}
。但是这样做之后,该程序将在现有Gnome桌面内而不是当前TTY上创建窗口。
这个问题可能看起来很愚蠢。我想知道如何在不运行任何桌面环境的情况下直接从TTY运行此程序。
解决方法
没有X11,您将无法运行X11程序。您的计算机已经在运行X11实例(称为显示器),并且您的桌面环境已连接到它,这就是它显示所有桌面内容的方式。
在桌面环境中运行的所有东西都有一个名为DISPLAY
的环境变量集,它告诉它要连接到哪个X11显示器(实例)。在另一个TTY中,尚未设置。如果将其设置为与桌面程序相同的值,则可以运行将连接到该显示器的X11程序。
您也可以启动另一个X11。尽管您可能必须设置一些命令行参数,但这实际上很简单。但是,我认为这不是主题,因为它不是编程问题,而是Linux问题。
根据您的内核配置,您也许可以使用帧缓冲设备(fbdev)直接在屏幕上绘制。它是与X11分开的系统,对于简单的图形(即直接在屏幕上绘制像素)最有用。如果您想知道如何使用fbdev,那应该是一个单独的问题。
在最新版本的Linux中,X11实际上使用帧缓冲设备,因此,理论上您可以通过X11可以完成的所有帧缓冲设备来完成所有工作。它使用了更多的功能来访问图形卡等等。关键字是“内核模式设置”(KMS)和“直接渲染基础结构”(DRI)。据我所知,除了X11服务器和Wayland(类似于设计不同的X11服务器)外,没有其他程序使用这些程序。