首页 > 编程知识 正文

windows是基于linux吗,java执行shell命令并返回结果

时间:2023-05-06 18:20:55 阅读:117412 作者:2332

我想现在已经没有人使用XCB这样的底层库来编写APP应用程序了,但是要使用的话,需要使用高度封装的库,例如Motif、LessTiff、GTK、Qt、EWL、ETK或Cairo 我这么小心翼翼地挥舞XCB,其实主要是为了学习。 毕竟,使用最接近基础的UI库编写代码是学习x协议和GUI编程原理的最好方法。

XCB的主要教程请参阅此处。 http://xcb.free desktop.org/tutorial /

有关x协议的文档,这里: http://www.x.org/releases/x11r 7.7/doc /

现在继续深入freedesktop.org。 没错,XCB的官网又在freedesktop.org上,而且就像我在之前的随笔中提到的Xft、Freetype一样,文档非常不完整。 但是,在其XcbApi页面上有“refactoring this page . pleasebepatient .”的提示,所以耐心等待吧。 幸运的是,代码是最好的文档。 在Fedora 20上安装libXCB-devel软件包后,可以直接在/usr/include/XCB目录中显示xcb库的头文件,因此学习xcb也不是难事。 我系统的XCB库头文件,如下图所示:

以下是最简单的XCB程序,其功能是创建窗口。 因为没有任何事件处理机制,所以必须使用pause ()暂停程序,然后按Ctrl C退出程序。

1 #包含

2 #包含

3 #include

4 #include

5 #包含

6

7 double get_time

8结构时间时间;

9日期时间(时间,空);

10返回(双精度) timeval.tv_usec ) ) ) timeval.tv_usec )/1000000 );

11 }

12

13 int main () }

14双精度start _ time=get _ time (;

15

16x CB _ connection _ t * connection=xcb _ connect (null,null );

17 const xcb _ setup _ t * setup=xcb _ get _ setup (connection );

18 xcb _ screen _ iterator _ titer=xcb _ setup _ roots _ iterator (setup );

19 xcb _ screen _ t * screen=ITER.data;

20

21xc b _ window _ t window=xcb _ generate _ id (connection );

22 xcb_create_window (

23连接,

24 XCB_COPY_FROM_PARENT,

25窗口

26屏幕根、

7100,100,

8400,300,

210、210、

30 xcb _ window _ class _ input _ output、

31屏幕- root _ visual,

30,空值;

33XCB_map_window(connection,window );

34 xcb _ flush (连接;

35

36 printf ('需要时间: %f秒。' ,get_time(-start_time );

37闪存(stdout;

38

39 pause (;

40xcb_disconnect(connection;

41返回0;

42 }

从这段代码中可以看出,要创建一个简单的窗口程序,必须执行以下步骤:

1、连接到XServer的Display使用xcb_connect ()函数进行,并返回xcb_connection_t的指针。 在此步骤中,可以同时获取当前屏幕的屏幕编号。

2、获取xcb_setup,用xcb_get_setup ()函数进行。 xcb_setup存储了APP应用程序与XServer之间通信所需的信息,包括协议版本和字节顺序。 通常,我们不需要关注这些细节;

3、获得屏幕对象。 这个步骤既重要又复杂。 重要的是,只有在获得一个屏幕后,才能在屏幕上创建窗口,并且在创建窗口时需要屏幕信息。 复杂的是通过xcb_setup_roots_itera,因为一个Display可以具有多个屏幕

tor()函数返回的是一个迭代器,可以通过该迭代器对所有的Screen进行遍历。如果只有一个Screen,则返回的第一个迭代器中的data就指向该Screen。XCB中使用xcb_screen_t结构来保存Screen的信息;

4、创建窗口并显示窗口,这需要三步,第一步先使用xcb_generate_id()函数生成一个ID,第二步使用xcb_create_window()函数创建一个窗口,第三步使用xcb_map_window让窗口显示出来。

通过以上的代码,我还学到了一个技巧,那就是使用gettimeofday()函数来获取一个精确到微秒的时间,用来查看应用程序的耗时。

程序运行如下图:

这个新创建的窗口自己没有背景,所以它创建的时候屏幕上有什么,它窗口里面就有什么。对于程序中用到的数据结构和枚举的含义,可以直接查看xcb的头文件,配合ctags和taglist.vim插件使用的话,只需要按Ctrl+]键,就可以自动跳转到这些数据结构的定义处(在Vim中使用taglist的方法见这里Linux江湖02:打造属于自己的Vim),如下两图:

最后,我对第一个简单的程序进行适当的扩展,看看怎么获取Display中有几个Screen以及怎么遍历Screen,最后显示Screen的一些信息。程序如下:

1 #include

2 #include

3 #include

4 #include

5 #include

6

7 double get_time(){

8 struct timeval timeval;

9 gettimeofday(&timeval, NULL);

10 return (double)timeval.tv_sec + (((double)timeval.tv_usec)/1000000);

11 }

12

13 int main(){

14 double start_time = get_time();

15 int screen_number;

16

17 xcb_connection_t *connection = xcb_connect(NULL, &screen_number);

18 const xcb_setup_t *setup = xcb_get_setup(connection);

19 xcb_screen_iterator_t iter = xcb_setup_roots_iterator(setup);

20 printf("当前的Screen Number为:%dn",screen_number);

21 printf("iter.rem = %d,下面开始遍历:n",iter.rem);

22

23 xcb_screen_t *screen;

24 for(; iter.rem!=0; xcb_screen_next(&iter)){

25 screen = iter.data;

26 printf("*****看到多少行这个提示,就说明有多少个Screen。*****n");

27 printf(" Screen->root:%dn",screen->root);

28 printf(" Screen->root_depth:%dn",screen->root_depth);

29 printf(" Screen->white_pixel:%dn",screen->white_pixel);

30 printf(" Screen->black_pixel:%dn",screen->black_pixel);

31 printf(" Screen->width_in_pixels:%dn",screen->width_in_pixels);

32 printf(" Screen->height_in_pixels:%dn",screen->height_in_pixels);

33 printf(" Screen->width_in_millimeters:%dn",screen->width_in_millimeters);

34 printf(" Screen->height_in_millimeters:%dn",screen->height_in_millimeters);

35 }

36

37

38 xcb_window_t window = xcb_generate_id(connection);

39 xcb_create_window(

40 connection,

41 XCB_COPY_FROM_PARENT,

42 window,

43 screen->root,

44 100,100,

45 400, 300,

46 10,

47 XCB_WINDOW_CLASS_INPUT_OUTPUT,

48 screen->root_visual,

49 0, NULL);

50 xcb_map_window(connection, window);

51 xcb_flush(connection);

52

53 printf("花费时间:%f秒。",get_time()-start_time);

54 fflush(stdout);

55

56 pause();

57 xcb_disconnect(connection);

58 return 0;

59 }

最后运行效果如下图:

(京山游侠于2014-06-25发布于博客园,转载请注明出处。)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。