SWT(implemented with gtk)的可视化控件的X11窗口句柄

2016-01-29 18:38 32 1 收藏

SWT(implemented with gtk)的可视化控件的X11窗口句柄,SWT(implemented with gtk)的可视化控件的X11窗口句柄

【 tulaoshi.com - Linux 】


--谨献给我一样试图使用JNI把java和naitve window掺和在一起的developer
SWT与AWT本质上都是一套依赖于操作系统具体实现的GUI库。与swing在所有操作系统上外观一致的做法不同,awt和swt在不同的操作系统上的外观是和本地窗口一样的。
每一个swt和awt的窗口都对应一个本地窗口(native window),自然也会有一个窗口句柄。而swing则不同,是没有本地窗口句柄的。在获得窗口句柄之后,就可以和用其他的语言(比如C++)实现的GUI应用程序进行一些互操作。比如我们可以调用一些SetParene()之类的方法把一个本地的窗口嵌入到一个SWT的窗口里来,反之亦然。这样就提供了一个创建更丰富美观的,可扩充性更强的GUI应用程序的手段。
关于AWT的窗口句柄如何获得,就不多说了。大家可以参考一下你的jdk的安装目录的include子目录,可以看到里面有一个jawt.h,里面有一个很容易看懂的得到系统的window handle的sample. 我是用的linux上的SUN j2sdk 1.4,在include/linux子目录里还可以看到jawt_md.h.里面定义了一个struct:
[code:1:f8fe5d1f80]
typedef struct jawt_X11DrawingSurfaceInfo {
Drawable drawable;
Display* display;
VisualID visualID;
Colormap colormapID;
int depth;
/*
* Since 1.4
* Returns a pixel value from a set of RGB values.
* This is useful for paletted color (256 color) modes.
*/
int (JNICALL *GetAWTColor)(JAWT_DrawingSurface* ds,

int r, int g, int b);
} JAWT_X11DrawingSurfaceInfo;
[/code:1:f8fe5d1f80]
drawable这个成员其实就是X11的Resource ID.在jawt.h的那个sample中,只要把dsi->platforminfo转换成jawt_X11DrawingSurfaceInfo类型,就可以得到X11的resource ID了,是不是很容易呢。
至于SWT,所有控件和窗口的父类org.eclipse.swt.widgets.Control有一个成员变量handle.按照SWT的官方API的说法:the handle to the OS resource (Warning: This field is platform dependent) 。如果是Win32平台上,那么这个handle其实就是Win32 API里的那个最常见的HWND。如果用spy++的话可以很容易看到。在linux上就不是这样了。——终于说到正题了看来我还真是能拖戏啊……,hoho ^O^ )。
由于在Linux上,swt是基于不同的本地窗口风格来构建自己的窗口的,所以就有了Motif版的和gtk版的SWT。不知道会不会有QT版的,呵呵。我是用的gtk版本的SWT,所以org.ecllipse.swt.widgets.Control的成员handle并不是X11的resource ID,通过察看swt的source code发现,这个handle其实是一个GtkWidget*类型的变量。OK,我们就可以通过类似这样一段代码来得到X11的resource ID:
[code:1:f8fe5d1f80]
JNIEXPORT jlogn JNICALL Java_.......getX11Handle(JNIEnv* env, jobject obj_this, jlong swt_handle)
{
GtkWidget* pWidget = (GtkWidget*)((int)swt_handle);
GdkWindow* pWindow = pWidget->window;
int x11id = GDK_WINDOW_XWINDOW(pWindow);
return (jlong)x11id;
}
[/code:1:f8fe5d1f80]
这样我们就得到了这个swt控件的X11 ID了。

[size=9:f8fe5d1f80] (为了在linux也能查看当前所有的可视窗口的Handle,我写了一小段程序,用树形结构来显示当前已经map了的window的id.
http://www.sakulagi.org/Source/GTk+/SWT-gtk/ListHdl.zip
[/size:f8fe5d1f80]
eagerly1 回复于:2003-11-14 17:06:09 辛苦了
sakulagi 回复于:2003-11-16 09:18:51 谢谢,那个小工具已经放到我的主页上了。希望有用

来源:https://www.tulaoshi.com/n/20160129/1506643.html

延伸阅读
在 MyEclipse 的可视化 Swing 中,有 JTable 控件。 JTable 用来显示和编辑常规二维单元表。 那么,如何将 数据库SQL中的数据绑定至JTable中呢? 在这里,提供两种方法。 JTable的构造方法 通过查阅Java的API,可以可以得到JTable的两个重要的构造方法: JTable(Object[][] rowData, Object[] columnNames) 构造一个 JTable 来显示二维数组 r...
本文作者Barnabas Nagy ,译者@C7210。Barnabas是一名拥有六年从业经验的UX设计师、信息架构师,其对用户体验设计的交付提出一点:你的合作伙伴未必会看懂你的交付。 为了让自己的设计能够让人更容易理解,交付一个优秀可视化的成果是一个不错的选择。 在实际的用户体验设计工作当中,作为设计师,我们的一些产出在信息呈现方式及沟通效果等...
本文主要就书法字体在设计中的得当应用与信息可视化研究这两个主题进行分享。 1.浅谈书法在视觉设计中的应用 毛笔书写汉字是一种个性、抽象的中国传统文化艺术。它通过简洁的线条,演绎出魅力无穷的视觉艺术形象,表现出丰富的内涵,极具表现力和感染力。汉字通过毛 笔的书写,不单是把字写出来,更重要的是将精神和意境传达出来,使文字具有...
人的思考过程,是一个奇妙的过程,思维在脑海里流窜,横冲直撞又反复纠缠,最后扭成一团麻。所以常常会有人抱怨,脑袋里很乱,想不出头绪。这是因为,大部分人的思考过程都是杂乱无序的,没有逻辑的,最后也没法形成有效的沉淀,更无法找到清晰的结论。那么本文要讲述的,就是怎样把思维进行可视化的规整,最终系统化的沉淀下来,找到其中有价...
标签: 服务器
在Linux中可视化显示内存占用情况的方法   物理内存不足对Linux桌面系统和服务器系统的性能影响都很大。当你的计算机变慢时,要做的第一件事就是释放内存。尤其是在多用户环境以及执行关键任务的服务器环境下,内存消耗会变得更加关键,因为多个用户和应用线程会同时竞争更多的内存空间。 如果要监测系统内各种资源的使用情况(比...

经验教程

405

收藏

35
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部