How do I take a screenshot of a Text-Based User Interface? - unit-testing

I have a program which is a Text-Based User Interface (TUI). Think ncurses. Everything is displayed in the terminal and a lot of ANSI escape sequences are used to display colors, scroll bars, windows, etc...
For unit testing, I want to take "screenshots" of the TUI and compare them to the expected screenshot. Essentially, the unit test needs to run a virtual terminal and save the output to a png image file.
Keep in mind, these tests need to run on a headless CI system like travis or circleci. I cannot simply run gnome-terminal and take a screenshot with gnome-screenshot. The CI system does not have graphics running.
How do I programmatically take a screenshot of a Text-Based User Interface on a "headless" system?

Maybe you can try to take a screenshot using framebuffer, here is an example:
https://github.com/GunnarMonell/fbgrab

Related

C++ code to open a file in vim for editing in a terminal window from Xcode

i've been doing a search and can't quite seem to find a solution for this.
I am coding a realtime openGL visual application using openFrameworks in Xcode.
What I would like to do is to let the user press a button which opens up a terminal window with a glsl script ready for editing in vim.
So, I need to find some c++ code that
lets me launch a new terminal window
send commands to it in order to load a file in vim
close the terminal window
If anyone could point me in the right direction either with code examples or c++ libraries to look into that would be amazing. Thanks.
It's easy to open a process (like vim) with a system call, but a little trickier to open Terminal and then vim inside of that. As an alternative, I'd recommend installing Macvim (https://code.google.com/p/macvim/) which you can easily launch and control with an ofSystem call or, if you need finer-grained control, Poco::Process (http://pocoproject.org/slides/150-Processes.pdf). Since openFrameworks is built with Poco in the core, Poco::Process makes launching things easy.
Finally, as an alternative to all of that, you might look at the newly updated ofxGLEditor (https://github.com/Akira-Hayasaka/ofxGLEditor) that was just overhauled to allow live coding. You might be able to use it to edit directly in your app.
Good luck!

How to fetch data in a background process in Ubuntu

I am finding a Ubuntu OS command, which lets the program to read the data from keyboard even if the program is in background. I tried to search it a lot but got no success. If any Ubuntu/Linux programmer knows the OS command which lets the program to do so, Please share it with me.
I am a beginner of Ubuntu programming.
You can use the Linux input subsystem to read events from mice and keyboards. It will only work if your application has the necessary privileges. Basically, you have to run the application as root for this to work.
If you cannot run as root, you should not be attempting to monitor the keyboard anyway.
You can create an X11 application to monitor keyboard events in the current session. It only works for the current user, and in the current graphical environment, and may not be able to observe privileged dialogs, for example password inputs. For details, look at the application shortcut launcher for your desktop environment; all Linux DEs I've ever heard of have one.
I think the old Linux Journal articles, The Linux USB Input Subsystem and Using the Input Subsystem, are still one of the best introductions to the Linux input subsystem. Most Linux distributions nowadays also support uinput, a similar device that allows injecting input events back to the kernel subsystem, designed to allow user-space input device drivers. Their interfaces are described in /usr/include/linux/input.h and /usr/include/linux/uinput.h. I recommend you start at the above articles, and then look at some input and uinput examples.
If you are comfortable using a program, have a look at Logkeys project
. It directly takes input from /dev/input/event*.

Pixel-based graphics in linux terminal application

I'm developing a C++ application which will run on a headless server and keep track of some statistics. The application will run in a terminal in a screen session so that I can login over SSH and check those statistics.
Now, what I want to do, is display plots of various data. For that I need pixel-per-pixel access of course, which is not possible with ncurses or S-Lang. I found out about DirectFB (and it's C++ wrappers DFB++ & ++DFB), but can't seem to find conclusive evidence if it is possible to draw graphics with it inside a terminal.
Is DirectFB the way to go? Will it work fine inside a screen session without creating extra windows? If not, is there any library out there that can achieve what I want?
Edit: Ideally, I would of course prefer a library that has some kind of widget support as well, so that I don't have to create tons of classes to emulate text fields/scrollbars/...
You could make your application have a web interface. You could use e.g. Wt or Onion to make your application an HTTP server (or you could make it a FastCgi application), and use SVG (perhaps with Javascript and Ajax tricks) to display vector graphics (or generate a pixel-based PNG or JPEG or GIF image; there are several libraries for that).
I don't think that DirectFB works with SSH, and I believe it is becoming deprecated (for example GTK3 don't support it anymore).
You might also generate Gnu Plot graphics (by generating the appropriate commands), but that is not very interactive.
I don't think that making graphics thru ssh without X make sense, unless you want only ASCII art (which I believe is not the right way for your needs).

How to make a C++ program interact with mouse clicks and X Window System application?

How do I exactly make a C++ program interact with another program and interact with something I have clicked on.
Example: If I wanted to make an MSN auto reply program and I would have a dialog box that would ask me what I would want to type and than the program would paste that into the MSN chat box.
It turns out that X by itself doesn't let you do this, but you can make it possible by installing the Xtest extensions (and then reading about them...)
Other approaches would be to inject events at the operating system keyboard/mouse level or using some existing or patched in interface of the target program. A lot of unix-ish tools can be set up to accept command input on stdin or accomplish a lot via command line options for scripting purposes.

How can I code my own custom splash screen for Linux?

This is NOT a question on plain old boring customization; I actually want to create an program, you know, with source code, etc...
I'm thinking about programming my own media centre interface, and I figured it'd look better if I coded my own splash screen for when the OS is loading.
Note: The media centre interface will be run in X, but this question is regarding what will happen before the X server loads.
Simply, I'd like to make a splash screen application to hide the linux kernel boot messages. Is there a way I can program some animation in to this like some sort of animated progress bar for example? I assume that I won't be able to code any 2D/3D graphics (as that'd require X to be running, right?), so how would I go about generating that?
I'd prefer to do this in C++, but C is also an option.
Note: I'm not looking to use any existing "themes" or anything like that, just interested in the programming side of things.
Update:
Some suggestions have been to use standard images (.bmp, .jpeg, etc), I am not interested in loading images in to an existing application. But obviously I may want to load images in to the boot screen application that I will make.
I'm not tied to a Linux distro, so this can be for anything, although Debian or a Debian-based distro would be nice.
I like the suggestion about loading the X server early and running a loading screen from there, however is there not a more direct approach? Surely you can make a program which hides the boot messages and shows a custom program? Obviously this would be very low level programming, but that's what I'm looking for...
Also, I'm not interested in altering the boot loader (LILO, GRUB, etc).
Update 2:
So far good suggestions have been looking at the source code for applications like splashy and fbsplash. Can anyone better this suggestion?
For the graphical output you can use the Linux framebuffer, for application development you can use gtk which support rendering directly to the framebuffer GtkFB.
For the video and such you can use mplayer which also support rendering to the framebuffer.
For the initialization you have to look around the system used, debian uses a sysv init style initialization http://www.debian-administration.org/articles/212, ubuntu uses upstart.
I'd look into splashy source code. But you will need to code in C.
If you have the skills, you can implement a software based 3D engine (like in the good old days). A simple rotating cube shouldn't be very hard to code and there are tons of tutorials.
The downside is that you will increase the boot time, something not very pleasant in a media center.
Here's the thing: there is a library/kernel patch, fbsplash, that has already been written to do exactly what it sounds like you want to do. It will display an image in place of the normal boot messages, and it can also incorporate a progress bar. When you're trying to do something for which a well-established open-source implementation already exists, there's really no better way to learn how to do it yourself than to look at the source code.
Even if you're looking for something more complicated (say if you want to create some fancier animation than a progress bar), you might be able to start with fbsplash and modify it to suit your needs.
There are several ways you could do this. You could have the X server load very early, and just write a program to display the splash screen. You could also use the framebuffer device. If you are using Intel hardware, or are willing to use the OSS AMD drivers, or Nouveau for Nvidia, you could use kernel mode setting. For this, I would look at Fedora's Plymouth. You could just write a Plymouth plugin to display your splash screen.
The splash screen is simply an image (.bmp, .jpg, etc.) and can be loaded by the boot loader. Since you haven't specified the distribution you're using, look into LILO, grub, or whichever one is appropriate. Check the /boot directory for clues that will direct your search.
If all you want to do is have a nice clean boot sequence with your own splash and absolutely no boot messaging you can do the following:
First, silence grub, boot messaging, and console cursor:
GRUB_CMDLINE_LINUX_DEFAULT = quiet fastboot splash vt.cur_default=1 loglevel=0
GRUB_TIMEOUT = 0
This will very quickly and silently (fade to black) bring you to your login screen, where you can place a splash. Your distro may show it's own splash briefly, which you can change if you like.
This yeilds a professional clean boot sequence, without all the usual linux warts and wrinkles. (Like OSX and Windows).
I personally use Ubunutu with LXDE, and have a clean splashy boot in under 3 seconds, even on older hardware.