Giter VIP home page Giter VIP logo

screengrab's Introduction

ScreenGrab

version 2.0-dev

ScreenGrab - A program for fast creating screenshots, and easily publishing them on internet image hosting services. It works on Linux and Windows operating systems. ScreenGrab uses the Qt framework and thus, it is independent from any desktop environment.

Build requirements

  • Qt5 >= 5.2 (Qt 4.x support only 1.x branch)
  • CMake >= 2.8.11 (only for building ScreenGrab from sources)
  • GCC > 4.5
  • KF5WindowSystem
  • [optional] Qxt Library > 0.6 (if you want to build ScreenGrab using your system Qxt version - see the "Build options" section in this file)

Build

To build ScreenGrab from sources, use these commands:

mkdir build
cd build
cmake [BUILD OPTIONS] ../
make
make install

Build options

You can use some or all of these parameters to customise your build.

  • -DCMAKE_INSTALL_PREFIX - Install prefix for Linux distro. Default setting: "/usr".
  • -DSG_XDG_CONFIG_SUPPORT - Place config files into XDGC_CONFIG_HOME directory (usually - ~/.config/${app_name) ). Default setting: ON. In previous versions the config files were stored in ~/.screengrab (Set this parameter to "OFF" to store the config files here).
  • -DSG_EXT_UPLOADS - Enable uploading screenshots to image hosting services. Default setting: ON.
  • -DSG_DBUS_NOTIFY - Enable D-Bus notifications.
  • -DSG_GLOBALSHORTCUTS - Enable global shortcuts for main actions to create screenshots. Default setting: ON.
  • -DSG_USE_SYSTEM_QXT - Use system version Qxt Library for global shortcuts. Default setting: OFF.
  • -DSG_DOCDIR - Name for the directory of user's documentation. Default setting: "screengrab".
  • -DQKSW_SHARED - Enable shared linking with qkeysequencewidget library (in src/common/qksysekwesewidget). Default setting: OFF.

Build notes:

  • For Debian based Linux distro (Debian Squeezy, Ubuntu 12.04, etc) - if you want to build ScreenGrab using the system version of the Qxt Library, please use this command to run CMake:

    cmake -DSG_USE_SYSTEM_QXT=ON -DQXT_QXTCORE_INCLUDE_DIR=/usr/include/qxt/QxtCore -DQXT_QXTGUI_INCLUDE_DIR=/usr/include/qxt -DCMAKE_INSTALL_PREFIX=/usr ../

LICENSE

Screengrab is licensed under the GPL v2. See file LICENSE in docs directory for more information

Contacts

E-mail: [email protected] Jabber: [email protected] Web homepage: http://screengrab.doomer.org/

Copyright (c) 2009-2013, Artem 'DOOMer' Galichkin

screengrab's People

Contributors

agaida avatar cuuptee avatar doomer avatar ilya87 avatar jhooverman avatar jleclanche avatar luis-pereira avatar paulolieuthier avatar pmattern avatar sokoloffa avatar stefonarch avatar tantun avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

screengrab's Issues

Proposal: Move to QtDesktop org

Hi

As I previously discussed, I've set up the QtDesktop organization:
https://github.com/QtDesktop

With the recent addition of github teams, it's now possible to split up organizations into teams. Which means I can create you a ScreenGrab team you can administrate, but others are more easily able to pick up maintainership of it.

We (LXQt) would like to have ScreenGrab be part of the recommended software suite so more oversight would be nice. Up to you.

Open with external program not listed in 'Edit In'

My environement

Window Manager: i3wm
Linux Distro: gentoo
Screengrab Version: 1.0

The problem

When I click 'Advanced'->'Edit In' I see list of programs: Feh, Gimp, Xfi etc... But there is no xpaint there (I have it installed and working).

Is there any way to add it there manually?

upload options faulty

if you select:

  • MediaCrush: the form for imgur.com is shown
  • Imgur: Account settings for imageshack.us is shown
  • ImageShack:Account settings for imageshack.us is shown

Wrong Index?

Remove qxt include source and use from oficial project, needed for packagin

Its necesary to remove qxt include source and use from oficial project, needed for packagin.

The packagin process are very tedius due include embebed source of qxt libs into project.. not integrate to sistem libqxt an make confising or dificult packagin.. for debian and other debian derivated distros.

Theres any option to do not use internat embebed qxt code?

Merge "Help" and "About" buttons

Make "Help" a menu-button, with "Help" and "About" as submenus.

Incidentally, this gives us space to get rid of the "Advanced" button and get Upload and Edit in as two buttons instead.

cmake failed

CMakeFiles/CMakeOutput.log:
https://bpaste.net/show/a3d8c3e1bb1a

Screengrab from git/master. Gentoo ~amd64. Archlinux has same result.

// Не умею писать багрепорты, тем более на нечеловеческих языках.

does not respect DCMAKE_INSTALL_PREFIX

$ cmake -DCMAKE_INSTALL_PREFIX:PATH=/home/ale/docs/bin/screengrab ../
[...]
$ make
[...]
$ make install
[  8%] Built target qkeysequencewidget
[ 12%] Built target singleapp
[ 57%] Built target uploader
[ 62%] Built target extedit
[ 68%] Built target qxt
[100%] Built target screengrab
Install the project...
-- Install configuration: "Release"
-- Installing: /usr/bin/screengrab
CMake Error at cmake_install.cmake:42 (FILE):
  file INSTALL cannot copy file
  "/home/ale/docs/src/screengrab/build/screengrab" to "/usr/bin/screengrab".


Makefile:62: recipe for target 'install' failed
make: *** [install] Error 1

tried with both this repository and the one at qtdesktop...

Segfault at startup

Just running screengrab normally, I get a segfault. Rebuilt with debug symbols and got a backtrace. Let me know if you need more info.

$ gdb screengrab 
GNU gdb (GDB) 7.5.91.20130417-cvs-ubuntu
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/iggy/projects/screengrab/_build/screengrab...done.
(gdb) r
Starting program: /home/iggy/projects/screengrab/_build/screengrab 
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ffa000
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Program received signal SIGSEGV, Segmentation fault.
__gconv_transform_internal_utf8 (step=step@entry=0x67f078, data=data@entry=0x67f758, inptrp=inptrp@entry=0x7fffff7ff170, inend=inend@entry=0x67f854 "q", outbufstart=0x0, outbufstart@entry=0x7ffff58da870 <__gconv_transform_internal_utf8>, 
irreversible=irreversible@entry=0x7fffff7ff250, do_flush=do_flush@entry=0, consume_incomplete=consume_incomplete@entry=0) at ../iconv/skeleton.c:394
394     ../iconv/skeleton.c: No such file or directory.
(gdb) thread apply all bt

Thread 1 (Thread 0x7ffff7fc67c0 (LWP 26862)):
#0  __gconv_transform_internal_utf8 (step=step@entry=0x67f078, data=data@entry=0x67f758, inptrp=inptrp@entry=0x7fffff7ff170, inend=inend@entry=0x67f854 "q", outbufstart=0x0, outbufstart@entry=0x7ffff58da870 <__gconv_transform_internal_utf8>, 
irreversible=irreversible@entry=0x7fffff7ff250, do_flush=do_flush@entry=0, consume_incomplete=consume_incomplete@entry=0) at ../iconv/skeleton.c:394
#1  0x00007ffff1eeec26 in gconv (step=0x67f010, data=data@entry=0x67f720, inptrp=inptrp@entry=0x7fffff7ff2e8, inend=inend@entry=0x6eef44 "", outbufstart=outbufstart@entry=0x0, irreversible=irreversible@entry=0x7fffff7ff250, do_flush=do_flush@entry=0, 
consume_incomplete=consume_incomplete@entry=0) at ../iconv/skeleton.c:673
#2  0x00007ffff58d6191 in __gconv (cd=0x67f710, inbuf=inbuf@entry=0x7fffff7ff2e8, inbufend=0x6eef44 "", outbuf=0x67f854, outbuf@entry=0x7fffff7ff2f0, outbufend=<optimized out>, irreversible=irreversible@entry=0x7fffff7ff250) at gconv.c:79
#3  0x00007ffff58d575b in iconv (cd=<optimized out>, inbuf=0x7fffff7ff2e8, inbytesleft=0x7fffff7ff2f8, outbuf=0x7fffff7ff2f0, outbytesleft=0x7fffff7ff308) at iconv.c:52
#4  0x00007ffff63460c4 in QIconvCodec::convertFromUnicode (this=<optimized out>, uc=0x6eeeea, len=45, convState=0x0) at codecs/qiconvcodec.cpp:398
#5  0x00007ffff633fd38 in QTextCodec::fromUnicode (this=<optimized out>, str=...) at codecs/qtextcodec.cpp:1375
#6  0x00007ffff6256a11 in QString::toLocal8Bit (this=0x7fffff7ff3a0) at tools/qstring.cpp:3767
#7  0x00007ffff6297089 in locale_encode (f=...) at io/qfile.cpp:72
#8  0x00007ffff62974fa in QFile::encodeName (fileName=...) at io/qfile.cpp:515
#9  0x00007ffff62e0e95 in QFileSystemEntry::resolveNativeFilePath (this=this@entry=0x3370f58) at io/qfilesystementry.cpp:171
#10 0x00007ffff62e0f3c in QFileSystemEntry::nativeFilePath (this=this@entry=0x3370f58) at io/qfilesystementry.cpp:139
#11 0x00007ffff62e4c38 in QFileSystemEngine::fillMetaData (entry=..., data=..., what=...) at io/qfilesystemengine_unix.cpp:370
#12 0x00007ffff629d313 in QFileInfo::size (this=this@entry=0x7fffff7ff530) at io/qfileinfo.cpp:1228
#13 0x00007ffff62d50b6 in QConfFileSettingsPrivate::syncConfFile (this=this@entry=0x3370bc0, confFileNo=confFileNo@entry=0) at io/qsettings.cpp:1546
#14 0x00007ffff62d5ad1 in QConfFileSettingsPrivate::sync (this=0x3370bc0) at io/qsettings.cpp:1370
#15 0x00007ffff62d0619 in QConfFileSettingsPrivate::QConfFileSettingsPrivate (this=0x3370bc0, fileName=..., format=<optimized out>) at io/qsettings.cpp:1200
#16 0x00007ffff62d06b4 in QSettingsPrivate::create (fileName=..., format=QSettings::IniFormat) at io/qsettings.cpp:376
#17 0x00007ffff62d06fe in QSettings::QSettings (this=0x33695d0, fileName=..., format=<optimized out>, parent=0x0) at io/qsettings.cpp:2717
#18 0x0000000000425b6d in Config::Config (this=0x3370db0) at /home/iggy/projects/screengrab/src/core/config.cpp:67
#19 0x0000000000425e5a in Config::instance () at /home/iggy/projects/screengrab/src/core/config.cpp:97
#20 0x0000000000421838 in Core::Core (this=0x336b9f0) at /home/iggy/projects/screengrab/src/core/core.cpp:56
#21 0x0000000000421cf8 in Core::instance () at /home/iggy/projects/screengrab/src/core/core.cpp:92
#22 0x00000000004291d8 in Config::setDefaultSettings (this=0x3370190) at /home/iggy/projects/screengrab/src/core/config.cpp:570
#23 0x0000000000425be0 in Config::Config (this=0x3370190) at /home/iggy/projects/screengrab/src/core/config.cpp:75
#24 0x0000000000425e5a in Config::instance () at /home/iggy/projects/screengrab/src/core/config.cpp:97
#25 0x0000000000421838 in Core::Core (this=0x33706d0) at /home/iggy/projects/screengrab/src/core/core.cpp:56
#26 0x0000000000421cf8 in Core::instance () at /home/iggy/projects/screengrab/src/core/core.cpp:92
#27 0x00000000004291d8 in Config::setDefaultSettings (this=0x336f570) at /home/iggy/projects/screengrab/src/core/config.cpp:570
#28 0x0000000000425be0 in Config::Config (this=0x336f570) at /home/iggy/projects/screengrab/src/core/config.cpp:75
#29 0x0000000000425e5a in Config::instance () at /home/iggy/projects/screengrab/src/core/config.cpp:97
#30 0x0000000000421838 in Core::Core (this=0x336fab0) at /home/iggy/projects/screengrab/src/core/core.cpp:56
#31 0x0000000000421cf8 in Core::instance () at /home/iggy/projects/screengrab/src/core/core.cpp:92
#32 0x00000000004291d8 in Config::setDefaultSettings (this=0x336e950) at /home/iggy/projects/screengrab/src/core/config.cpp:570
#33 0x0000000000425be0 in Config::Config (this=0x336e950) at /home/iggy/projects/screengrab/src/core/config.cpp:75
#34 0x0000000000425e5a in Config::instance () at /home/iggy/projects/screengrab/src/core/config.cpp:97
#35 0x0000000000421838 in Core::Core (this=0x336ee90) at /home/iggy/projects/screengrab/src/core/core.cpp:56
#36 0x0000000000421cf8 in Core::instance () at /home/iggy/projects/screengrab/src/core/core.cpp:92
#37 0x00000000004291d8 in Config::setDefaultSettings (this=0x336dd30) at /home/iggy/projects/screengrab/src/core/config.cpp:570
#38 0x0000000000425be0 in Config::Config (this=0x336dd30) at /home/iggy/projects/screengrab/src/core/config.cpp:75
#39 0x0000000000425e5a in Config::instance () at /home/iggy/projects/screengrab/src/core/config.cpp:97
#40 0x0000000000421838 in Core::Core (this=0x336e270) at /home/iggy/projects/screengrab/src/core/core.cpp:56
#41 0x0000000000421cf8 in Core::instance () at /home/iggy/projects/screengrab/src/core/core.cpp:92
#42 0x00000000004291d8 in Config::setDefaultSettings (this=0x336d110) at /home/iggy/projects/screengrab/src/core/config.cpp:570
#43 0x0000000000425be0 in Config::Config (this=0x336d110) at /home/iggy/projects/screengrab/src/core/config.cpp:75
#44 0x0000000000425e5a in Config::instance () at /home/iggy/projects/screengrab/src/core/config.cpp:97
#45 0x0000000000421838 in Core::Core (this=0x336d650) at /home/iggy/projects/screengrab/src/core/core.cpp:56
#46 0x0000000000421cf8 in Core::instance () at /home/iggy/projects/screengrab/src/core/core.cpp:92
#47 0x00000000004291d8 in Config::setDefaultSettings (this=0x336c4f0) at /home/iggy/projects/screengrab/src/core/config.cpp:570
#48 0x0000000000425be0 in Config::Config (this=0x336c4f0) at /home/iggy/projects/screengrab/src/core/config.cpp:75
#49 0x0000000000425e5a in Config::instance () at /home/iggy/projects/screengrab/src/core/config.cpp:97
#50 0x0000000000421838 in Core::Core (this=0x336ca30) at /home/iggy/projects/screengrab/src/core/core.cpp:56
#51 0x0000000000421cf8 in Core::instance () at /home/iggy/projects/screengrab/src/core/core.cpp:92
#52 0x00000000004291d8 in Config::setDefaultSettings (this=0x336b8d0) at /home/iggy/projects/screengrab/src/core/config.cpp:570
#53 0x0000000000425be0 in Config::Config (this=0x336b8d0) at /home/iggy/projects/screengrab/src/core/config.cpp:75
#54 0x0000000000425e5a in Config::instance () at /home/iggy/projects/screengrab/src/core/config.cpp:97
#55 0x0000000000421838 in Core::Core (this=0x336be10) at /home/iggy/projects/screengrab/src/core/core.cpp:56
#56 0x0000000000421cf8 in Core::instance () at /home/iggy/projects/screengrab/src/core/core.cpp:92
#57 0x00000000004291d8 in Config::setDefaultSettings (this=0x336acb0) at /home/iggy/projects/screengrab/src/core/config.cpp:570
#58 0x0000000000425be0 in Config::Config (this=0x336acb0) at /home/iggy/projects/screengrab/src/core/config.cpp:75
#59 0x0000000000425e5a in Config::instance () at /home/iggy/projects/screengrab/src/core/config.cpp:97
---Type <return> to continue, or q <return> to quit---q
Quit
(gdb)

The last couple of lines repeat forever from what I can tell.

Please install the supplied AppData file

Please consider installing this AppData file: https://raw.githubusercontent.com/hughsie/fedora-appstream/master/appdata-extra/desktop/screengrab.appdata.xml

This is used in GNOME and KDE software installers to add the application description and some screenshots. We'd love to showcase more applications, but without the extra data file we can't. The AppData file needs to be installed to /usr/share/appdata/ on Linux and the basename needs to match the .desktop basename. It would also be great if you could integrate the file with your translation system (e.g. intltool) to make the descriptions translated.

See http://people.freedesktop.org/~hughsient/appdata/ for more details; thanks!

Richard

Settings reworking & English fixes

Main

Split in two sections:

  1. Saving section. With default save dir, default file name and default format
  2. Screenshot section, with Delay and Window decorations on two separate lines
Advanced

"Insert DateTime in filename" -> "Insert current date and time in file name"

"Filenames to clipboard on saving" -> "Copy file name to the clipboard when saving"
"No copy" -> "Do not copy"
"Only filename" -> "Copy file name only"
"Full path to file" -> "Copy full file path"

"Allow multiple copies" -> "Allow multiple instances of ScreenGrab" (?)
"Enable external viewer" -> ??? (I don't know what that does)

NOTE: Move the filename clipboard copy to the Main tab, in the Saving section

Display
  1. Always save the window size, remove the option
  2. Move "Zoom area ..." to the Main tab, in the Screenshot section
Tray
  1. Rename section to "System tray"
  2. Instead of hiding other options when the tray isn't checked, disable them (gray them out)

"Use tray" -> "Show ScreenGrab in the system tray"
"Close in tray" -> "Minimize to tray when closing"

Uploader
  1. Rename section to "Uploading"
  2. Rename any instances of ImgUr or Img Ur to "Imgur".
  3. Use Imgur as the default host (or better yet, MediaCrush ;)). ImageShack is terrible and bugged.
  4. Move the clipboard setting below the default host.

"Auto copy result link to clipboard" -> "Always copy the link to the clipboard"
"Default upload to" -> "Default image host"

Respect xdg basedir

Im not really sure why config.cpp reimplements what QSettings already does. In any case, it should respect XDG_CONFIG_HOME (default to .config/screengrab)

"Previous selection" mode

Often need to make a few screenshots of one and the same area of the screen.
It would be good to have additional shooting mode, in which selected a region which was selected by the previous time.

Qt 5 support

Does screengrab build with qt 5? No matter what I do it seems to build with qt 4.

Project style guidelines

While cleaning up --help I noticed the files use inconsistent indent rules - some 4 spaces, some tabs, some mixed. Could you decide on a rule? I'll be happy to send a PR to clean everything up to that.
I recommend tabs, because I like tabs :P But it just needs to be consistent.

qt4

Qt4 больше не будет? Пичаль-бида. Хорошая была программулина.

Allow drag & drop

Let users drag & drop screenshots from the main area to other apps.

I recall ksnapshot has this implemented.

window close unexpectedly (0.9.96 unstable)

When I build unstable version from this source:

http://screengrab.doomer.org/download/screengrab-0_9_96_/

the window close unexpectedly if you select "Type: Window" and click on "New Screen", if the main window of the app is on the Root window of the desktop screen.

However, this DOES NOT happens if I use the app from the package:

http://screengrab.doomer.org/download/screengrab_0_9_96-ubuntu1_i386/

This is the buggy log from terminal:


QPixmap::scaled: Pixmap is a null pixmap
X Error: BadWindow (invalid Window parameter) 3
Major opcode: 15 (X_QueryTree)
Resource id: 0x0
X Error: BadWindow (invalid Window parameter) 3
Major opcode: 3 (X_GetWindowAttributes)
Resource id: 0x0
Not window attributes.
X Error: BadAlloc (insufficient resources for operation) 11
Major opcode: 53 (X_CreatePixmap)
Resource id: 0x197
X Error: BadDrawable (invalid Pixmap or Window parameter) 9
Extension: 149 (RENDER)
Minor opcode: 4 (RenderCreatePicture)
Resource id: 0x140001b
X Error: BadDrawable (invalid Pixmap or Window parameter) 9
Major opcode: 55 (X_CreateGC)
Resource id: 0x140001b
X Error: BadGC (invalid GC parameter) 13
Major opcode: 56 (X_ChangeGC)
Resource id: 0x140001b
X Error: BadDrawable (invalid Pixmap or Window parameter) 9
Major opcode: 62 (X_CopyArea)
Resource id: 0x140001b
X Error: BadGC (invalid GC parameter) 13
Major opcode: 60 (X_FreeGC)
Resource id: 0x140001b
X Error: BadDrawable (invalid Pixmap or Window parameter) 9
Major opcode: 73 (X_GetImage)
Resource id: 0x140001b
Qt has caught an exception thrown from an event handler. Throwing
exceptions from an event handler is not supported in Qt. You must
reimplement QApplication::notify() and catch all exceptions there.

terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Aborted


This is the NON-buggy log from terminal:


QPixmap::scaled: Pixmap is a null pixmap
X Error: BadWindow (invalid Window parameter) 3
Major opcode: 15 (X_QueryTree)
Resource id: 0x0
X Error: BadWindow (invalid Window parameter) 3
Major opcode: 3 (X_GetWindowAttributes)
Resource id: 0x0
Not window attributes.
QPixmap::scaled: Pixmap is a null pixmap
X Error: BadDrawable (invalid Pixmap or Window parameter) 9
Major opcode: 55 (X_CreateGC)
Resource id: 0x0
X Error: BadGC (invalid GC parameter) 13
Major opcode: 56 (X_ChangeGC)
Resource id: 0x0
X Error: BadDrawable (invalid Pixmap or Window parameter) 9
Major opcode: 62 (X_CopyArea)
Resource id: 0x0
X Error: BadGC (invalid GC parameter) 13
Major opcode: 60 (X_FreeGC)
Resource id: 0x0


Imgur option to log in

Probably this is planned already, but, anyway, just to show that there are users who really want to see this implemented, I create this issue.

Fix default upload

Default upload is blank for me, says it'll upload to imgur but it actually uploads to imageshack. Worse yet, on imageshack, all i get is the thumbnail, not the actual image.

Compositing issues

Picture says it all:
image

With kwin and compositing on, windows have a "fade" effect. This fade effect appears on the screengrab window and causes ghost window effects to appear on all shots. Really annoying.

Don't know about a solution...

Refactor comand line options code

Refactor code of class for work with command line params. To make simple adding, checking and deleting options from any place of app's code

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.