linux截图工具的讨论
Tofloor
poster avatar
z85525006
deepin
2011-12-09 09:34
Author
昨日闲着无聊,想摆弄一下截图工具.随便给自己作个笔记
由于只能实现截取全屏,
想尽办法本人也无法实现窗口截图.
gdk_pixbuf_get_from_drawable(NULL, root_window, NULL, x, y, 0, 0, widht, height); // 只要设定 x,y就可以定位root_windows的坐标, width, height就是截图窗口的宽和高。
由于GTK+也不是太深入.
查找资料只知道 #include 是 xlib的部分封装.
只知道涉及的 xlib函数有一些:
XQueryTree
....
xwininfo 和 xprop 着两个工具的源码都是基于 xlib.
可惜本人没有学过 xlib.
如果将 xwininfo > 123.txt,这个办法太不爽了.
对于如何取实现的这些东西也是无能为力啊... ...纠结中 快2:00了... 睡不着啊,思考中,翻查中 ... ... -_-
分析别人(xwininfo)的代码:[精简]注:上面的英文注释是原作者的注释!!
  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include
  7. #include
  8. Display *dpy;
  9. int screen;
  10. Window Select_Window(Display *dpy)
  11. {
  12.   int status;
  13.   Cursor cursor;
  14.   XEvent event;
  15.   Window target_win = None, root = RootWindow(dpy,screen);
  16.   int buttons = 0;
  17.   /* Make the target cursor */
  18.   //cursor = XCreateFontCursor(dpy, XC_crosshair);
  19.   /* Grab the pointer using target cursor, letting it room all over */
  20.   status = XGrabPointer(dpy, root, False,
  21.                         ButtonPressMask|ButtonReleaseMask, GrabModeSync,
  22.                         GrabModeAsync, root, cursor, CurrentTime);
  23.   
  24.   /* Let the user select a window... */
  25.   while ((target_win == None) || (buttons != 0)) {
  26.     /* allow one more event */
  27.     XAllowEvents(dpy, SyncPointer, CurrentTime);
  28.     XWindowEvent(dpy, root, ButtonPressMask|ButtonReleaseMask, &event);
  29.     switch (event.type) {
  30.     case ButtonPress:
  31.       if (target_win == None) {
  32.         target_win = event.xbutton.subwindow; /* window selected */
  33.         if (target_win == None) target_win = root;
  34.       }
  35.       buttons++;
  36.       break;
  37.     case ButtonRelease:
  38.       if (buttons > 0) /* there may have been some down before we started */
  39.         buttons--;
  40.        break;
  41.     }
  42.   }
  43.   XUngrabPointer(dpy, CurrentTime);      /* Done with pointer */
  44.   return(target_win);
  45. }
  46. Display_Stats_Info(Window window)
  47. {
  48.   XWindowAttributes win_attributes;
  49.   XVisualInfo vistemplate, *vinfo;
  50.   XSizeHints hints;
  51.   int dw = DisplayWidth (dpy, screen), dh = DisplayHeight (dpy, screen);
  52.   int rx, ry, xright, ybelow;
  53.   int showright = 0, showbelow = 0;
  54.   Status status;
  55.   Window wmframe;
  56.   int junk;
  57.   long longjunk;
  58.   Window junkwin;
  59.   if (!XGetWindowAttributes(dpy, window, &win_attributes))
  60.     Fatal_Error("Can't get window attributes.");
  61.    
  62.   vistemplate.visualid = XVisualIDFromVisual(win_attributes.visual);
  63.   vinfo = XGetVisualInfo(dpy, VisualIDMask, &vistemplate, &junk);
  64.   (void) XTranslateCoordinates (dpy, window, win_attributes.root,
  65.                                 -win_attributes.border_width,
  66.                                 -win_attributes.border_width,
  67.                                 &rx, &ry, &junkwin);
  68.                                
  69.   xright = (dw - rx - win_attributes.border_width * 2 -
  70.             win_attributes.width);
  71.   ybelow = (dh - ry - win_attributes.border_width * 2 -
  72.             win_attributes.height);
  73. }
  74. int main(int argc,char **argv)
  75. {
  76.   register int i;
  77.   int tree = 0, stats = 0, bits = 0, events = 0, wm = 0, size  = 0, shape = 0;
  78.   int frame = 0, children = 0;
  79.   Window window;
  80.   
  81.   window = Select_Window(dpy);
  82.   Display_Stats_Info(window);
  83.   exit(0);
  84. }
Copy the Code
查询Devhelp
gdk_window_get_width   //看width就知道
gdk_window_get_height
gdk_window_get_pointer //返回鼠标的坐标
gdk_window_get_window_type  //获取窗口的类型
    GDK_WINDOW_ROOT,
    GDK_WINDOW_TOPLEVEL,
    GDK_WINDOW_CHILD,
    GDK_WINDOW_DIALOG,
    GDK_WINDOW_TEMP,
    GDK_WINDOW_FOREIGN,
    GDK_WINDOW_OFFSCREEN
   
gdk_window_at_pointer    //获取鼠标指针下面的窗口,并返回该窗口的坐标
gdk_display_get_window_at_pointer //代替上面的函数

GdkDisplay  用于键盘/鼠标的 捉取

GDK_ROOT_WINDOW 获取当面屏幕根窗口和当前xlib窗口的ID

选择性的截图
可以以窗体为基准,比如gtk+ 中的 set_opacity 设置窗体的透明透,我们就以这个窗体为截图的范围,
比如鼠标按下后和鼠标放开的距离计算,可以得知 窗体的高和宽,设置窗体的高和宽和X,Y坐标,这个我们就直接可以得出截图的范围了.
截图后,将截图的信息显示在我们的窗体中,然后显示出来,这里当然窗体是没有标题拦那一块的,不然我们就露底了。
用户就可以任意的在上面画线,画圈,当然要编辑图片,我这个我就不知道了.
反正在窗体上画的任何东西,当时侯保存一下就OK了。也是直接截窗体。
要是想取消,又将原来保存的图片信息再显示出来,我们刚刚画的东西就没有了.
如果感觉不爽,还可以为截图后的窗体下方添加一行工具拦,这个就又点QQ截图的闻道了,好的思是要多学习的。
这个在深度linux软件中心讲解过了,工具拦也一个窗体,只是跟随主窗体的坐标显示在下面而已,不可移动,移动主窗体,他只能默默的消失.
原理就是这样,大家又什么好的想法,也一起讨论吧。互相学习。

其它参考信息: http://socol.iteye.com/blog/562816
Reply Favorite View the author
All Replies
s.******fe@gmail.com
deepin
2011-12-09 09:43
#1
呃,懒猫现在在写一个截图工具啊。
Reply View the author
z85525006
deepin
2011-12-09 10:01
#2
呃,懒猫现在在写一个截图工具啊。
痛苦,还要分析别人的源码啊,不过算学习吧.你不睡觉啊!
Reply View the author
s.******fe@gmail.com
deepin
2011-12-09 19:07
#3
[quote]呃,懒猫现在在写一个截图工具啊。
痛苦,还要分析别人的源码啊,不过算学习吧.你不睡觉啊![/quote]
我是晚睡晚起的坏孩子。
Reply View the author
z85525006
deepin
2011-12-13 00:09
#4
[quote][quote]呃,懒猫现在在写一个截图工具啊。
痛苦,还要分析别人的源码啊,不过算学习吧.你不睡觉啊![/quote]
我是晚睡晚起的坏孩子。[/quote]

懒猫是不是王勇,我不是王勇,你搞错了...晕!
Reply View the author
s.******fe@gmail.com
deepin
2011-12-13 00:21
#5
懒猫是不是王勇,我不是王勇,你搞错了...晕!
我没搞错啊,你搞错了。我就是跟你说王勇在写一个截图工具,你可以和他交流啊。
Reply View the author
z85525006
deepin
2011-12-13 00:25
#6
[quote]
懒猫是不是王勇,我不是王勇,你搞错了...晕!
我没搞错啊,你搞错了。我就是跟你说王勇在写一个截图工具,你可以和他交流啊。[/quote]

对,是我搞错了。语文不好,哈哈哈哈

对了,你要我们的个人介绍邮件干什么.

不要那么神秘嘛,也不和我们说一声,有什么好事情吗?
Reply View the author
s.******fe@gmail.com
deepin
2011-12-13 00:27
#7
对,是我搞错了。语文不好,哈哈哈哈

对了,你要我们的个人介绍邮件干什么.

不要那么神秘嘛,也不和我们说一声,有什么好事情吗?

啊?我不记得了诶…… 什么情况?

要么还是站内信联系吧…………
Reply View the author
z85525006
deepin
2011-12-13 00:32
#8
[quote]

对,是我搞错了。语文不好,哈哈哈哈

对了,你要我们的个人介绍邮件干什么.

不要那么神秘嘛,也不和我们说一声,有什么好事情吗?

啊?我不记得了诶…… 什么情况?

要么还是站内信联系吧…………[/quote]
就是王明栋 收 个人介绍邮件的事情,昨天晚上的时候,他也不和我们说说是搞的什么事情,问他也不说,好神秘啊。
Reply View the author
s.******fe@gmail.com
deepin
2011-12-13 00:44
#9
就是王明栋 收 个人介绍邮件的事情,昨天晚上的时候,他也不和我们说说是搞的什么事情,问他也不说,好神秘啊。
我晕…… 他不说应该是不在电脑旁边……

你看这个页面: http://www.linuxdeepin.com/about/team

新来的同志们都还不在里头,所以要加一下。
Reply View the author
z85525006
deepin
2011-12-13 00:46
#10
[quote]
就是王明栋 收 个人介绍邮件的事情,昨天晚上的时候,他也不和我们说说是搞的什么事情,问他也不说,好神秘啊。
我晕…… 他不说应该是不在电脑旁边……

你看这个页面: http://www.linuxdeepin.com/about/team

新来的同志们都还不在里头,所以要加一下。[/quote]

我问他了,他说是让大家相互了解一下,
Reply View the author