⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 linux下很好的截图工具。 抓取整个桌面、某个指定的窗口、以及选择的矩形区域。
💻 C
📖 第 1 页 / 共 2 页
字号:
/* main.cCopyright (C) 1999,2000 Tom Gilbert.Permission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), todeal in the Software without restriction, including without limitation therights to use, copy, modify, merge, publish, distribute, sublicense, and/orsell copies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included inall copies of the Software and its documentation and acknowledgment shall begiven in the documentation and software packages that this Software wasused.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALLTHE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHERIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR INCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.*/#include "scrot.h"#include "options.h"intmain(int argc,     char **argv){  Imlib_Image image;  Imlib_Image thumbnail;  Imlib_Load_Error err;  char *filename_im = NULL, *filename_thumb = NULL;  time_t t;  struct tm *tm;  init_parse_options(argc, argv);  init_x_and_imlib(NULL, 0);  if (!opt.output_file) {    opt.output_file = gib_estrdup("%Y-%m-%d-%H%M%S_$wx$h_scrot.png");    opt.thumb_file = gib_estrdup("%Y-%m-%d-%H%M%S_$wx$h_scrot-thumb.png");  }  if (opt.select)    image = scrot_sel_and_grab_image();  else {    scrot_do_delay();    if (opt.multidisp) {      image = scrot_grab_shot_multi();    } else {      image = scrot_grab_shot();    }  }  if (!image)    gib_eprintf("no image grabbed");  time(&t); /* Get the time directly after the screenshot */  tm = localtime(&t);  imlib_context_set_image(image);  imlib_image_attach_data_value("quality", NULL, opt.quality, NULL);  filename_im = im_printf(opt.output_file, tm, NULL, NULL, image);  gib_imlib_save_image_with_error_return(image, filename_im, &err);  if (err)    gib_eprintf("Saving to file %s failed\n", filename_im);  if (opt.thumb)  {    int cwidth, cheight;    int twidth, theight;    cwidth = gib_imlib_image_get_width(image);    cheight = gib_imlib_image_get_height(image);    /* Geometry based thumb size */    if (opt.thumb_width || opt.thumb_height)    {      if (!opt.thumb_width)      {        twidth = cwidth * opt.thumb_height / cheight;        theight = opt.thumb_height;      }      else if (!opt.thumb_height)      {        twidth = opt.thumb_width;        theight = cheight * opt.thumb_width / cwidth;      }      else      {        twidth = opt.thumb_width;        theight = opt.thumb_height;      }    }    else    {      twidth = cwidth * opt.thumb / 100;      theight = cheight * opt.thumb / 100;    }    thumbnail =      gib_imlib_create_cropped_scaled_image(image, 0, 0, cwidth, cheight,                                            twidth, theight, 1);    if (thumbnail == NULL)      gib_eprintf("Unable to create scaled Image\n");    else    {      filename_thumb = im_printf(opt.thumb_file, tm, NULL, NULL, thumbnail);      gib_imlib_save_image_with_error_return(thumbnail, filename_thumb, &err);      if (err)        gib_eprintf("Saving thumbnail %s failed\n", filename_thumb);    }  }  if (opt.exec)    scrot_exec_app(image, tm, filename_im, filename_thumb);  gib_imlib_free_image_and_decache(image);  return 0;}voidscrot_do_delay(void){  if (opt.delay) {    if (opt.countdown) {      int i;      printf("Taking shot in %d.. ", opt.delay);      fflush(stdout);      sleep(1);      for (i = opt.delay - 1; i > 0; i--) {        printf("%d.. ", i);        fflush(stdout);        sleep(1);      }      printf("0.\n");      fflush(stdout);    } else      sleep(opt.delay);  }}Imlib_Imagescrot_grab_shot(void){  Imlib_Image im;  XBell(disp, 0);  im =    gib_imlib_create_image_from_drawable(root, 0, 0, 0, scr->width,                                         scr->height, 1);  return im;}voidscrot_exec_app(Imlib_Image image, struct tm *tm,               char *filename_im, char *filename_thumb){  char *execstr;  execstr = im_printf(opt.exec, tm, filename_im, filename_thumb, image);  system(execstr);  exit(0);}Imlib_Imagescrot_sel_and_grab_image(void){  Imlib_Image im = NULL;  static int xfd = 0;  static int fdsize = 0;  XEvent ev;  fd_set fdset;  int count = 0, done = 0;  int rx = 0, ry = 0, rw = 0, rh = 0, btn_pressed = 0;  int rect_x = 0, rect_y = 0, rect_w = 0, rect_h = 0;  Cursor cursor, cursor2;  Window target = None;  GC gc;  XGCValues gcval;  xfd = ConnectionNumber(disp);  fdsize = xfd + 1;  cursor = XCreateFontCursor(disp, XC_left_ptr);  cursor2 = XCreateFontCursor(disp, XC_lr_angle);  gcval.foreground = XWhitePixel(disp, 0);  gcval.function = GXxor;  gcval.background = XBlackPixel(disp, 0);  gcval.plane_mask = gcval.background ^ gcval.foreground;  gcval.subwindow_mode = IncludeInferiors;  gc =    XCreateGC(disp, root,              GCFunction | GCForeground | GCBackground | GCSubwindowMode,              &gcval);  if ((XGrabPointer       (disp, root, False,        ButtonMotionMask | ButtonPressMask | ButtonReleaseMask, GrabModeAsync,        GrabModeAsync, root, cursor, CurrentTime) != GrabSuccess))    gib_eprintf("couldn't grab pointer:");  if ((XGrabKeyboard       (disp, root, False, GrabModeAsync, GrabModeAsync,        CurrentTime) != GrabSuccess))    gib_eprintf("couldn't grab keyboard:");  while (1) {    /* handle events here */    while (!done && XPending(disp)) {      XNextEvent(disp, &ev);      switch (ev.type) {        case MotionNotify:          if (btn_pressed) {            if (rect_w) {              /* re-draw the last rect to clear it */              XDrawRectangle(disp, root, gc, rect_x, rect_y, rect_w, rect_h);            } else {              /* Change the cursor to show we're selecting a region */              XChangeActivePointerGrab(disp,                                       ButtonMotionMask | ButtonReleaseMask,                                       cursor2, CurrentTime);            }            rect_x = rx;            rect_y = ry;            rect_w = ev.xmotion.x - rect_x;            rect_h = ev.xmotion.y - rect_y;            if (rect_w < 0) {              rect_x += rect_w;              rect_w = 0 - rect_w;            }            if (rect_h < 0) {              rect_y += rect_h;              rect_h = 0 - rect_h;            }            /* draw rectangle */            XDrawRectangle(disp, root, gc, rect_x, rect_y, rect_w, rect_h);            XFlush(disp);          }          break;        case ButtonPress:          btn_pressed = 1;          rx = ev.xbutton.x;          ry = ev.xbutton.y;          target =            scrot_get_window(disp, ev.xbutton.subwindow, ev.xbutton.x,                             ev.xbutton.y);          if (target == None)            target = root;          break;        case ButtonRelease:          done = 1;          break;        case KeyPress:          fprintf(stderr, "Key was pressed, aborting shot\n");          done = 2;          break;        case KeyRelease:          /* ignore */          break;        default:          break;      }    }    if (done)      break;    /* now block some */    FD_ZERO(&fdset);    FD_SET(xfd, &fdset);    errno = 0;    count = select(fdsize, &fdset, NULL, NULL, NULL);    if ((count < 0)        && ((errno == ENOMEM) || (errno == EINVAL) || (errno == EBADF)))      gib_eprintf("Connection to X display lost");  }  if (rect_w) {    XDrawRectangle(disp, root, gc, rect_x, rect_y, rect_w, rect_h);    XFlush(disp);  }  XUngrabPointer(disp, CurrentTime);  XUngrabKeyboard(disp, CurrentTime);  XFreeCursor(disp, cursor);  XFreeGC(disp, gc);  XSync(disp, True);  if (done < 2) {    scrot_do_delay();    if (rect_w > 5) {      /* if a rect has been drawn, it's an area selection */      rw = ev.xbutton.x - rx;      rh = ev.xbutton.y - ry;      if (rw < 0) {        rx += rw;        rw = 0 - rw;      }      if (rh < 0) {        ry += rh;        rh = 0 - rh;      }    } else {      Window child;      XWindowAttributes attr;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -