Home > FVWM, Programming & scripting > Faking a quake terminal (like kuake / yakuake) in FVWM

Faking a quake terminal (like kuake / yakuake) in FVWM

December 20th, 2006

This guide assumes you have a basic understanding about configuring FVWM. You don’t need to be an expert (I’m not) but you should at least know how FvwmButton’s work.

I used KDE for a long time, and a big part of the reason for that is yakuake which is probably the best terminal available. For those who don’t know what it is, it is a terminal emulator that behaves like the quake console. That is, when you press a button it comes scrolling down/up. Very handy.

Yakuake doesn’t work very well in FVWM. It kind of works… but there are a bunch of bugs, such as text overlapping and what not.
However by editing your FVWM configuration file you can replicate the functions of yakuake rather nicely, and also add some nice extras.

The key is the Panel option in FvwmButtons. This enables you to drop down a FvwmButton from anywhere by clicking another FvwmButton. If you also would want to enabel this drop down terminal to a keyboard button, then the FakeClick method fixes that decently. It is a bit buggy if you move your mouse too much while toggling but it is good enough.

Simply create a button swallowing the terminal you want to have as a drop down console, and then make another button call the console button by Panel. Specify where it should drop down and that’s pretty much it.

Setup the button

DestroyFunc StartFunction
AddToFunc StartFunction
+ I Module FvwmButtons MenuButtons

The button calling the panel. You should add the Panel-call to any of you buttons instead of using this (but this is an example)

DestroyModuleConfig MenuButtons: *
*MenuButtons: Rows 1
*MenuButtons: Columns 1
*MenuButtons: Back black
*MenuButtons: Geometry 50x50-2-2
*MenuButtons: (1x1, Panel(down, delay 0, steps 30, position root left 0 0) \\
    SubPanel "Module FvwmButtons SubPanel")

The subpanel that holds the terminal

DestroyModuleConfig SubPanel: *
*SubPanel: Geometry 1280x350
*SubPanel: Rows 1
*SubPanel: Columns 1
*SubPanel: (1x1, Swallow(UseOld,NoHints,Respawn) "xterm" `Exec exec xterm`)

Now you have a button which you can click to get down the console holding an xterm. If you want to bind this to a button then use FakeClick like this to fool your system that you are clicking the button (ugly fix but the only one I’ve found).

The button press calls a function…

Key f12 A N press_fakebutton

The function quickly places the mouse cursor over the button, fakes a click and returns it.

DestroyFunc press_fakebutton
AddToFunc press_fakebutton
+ I SetEnv CURSOR_X $[pointer.x]
+ I SetEnv CURSOR_Y $[pointer.y]
+ I All [MenuButtons] WarpToWindow 25p 25p #middle of button
+ I FakeClick depth 0 press 1 wait 10 release 1
+ I WindowId root 1 WarpToWindow $[CURSOR_X]p $[CURSOR_Y]p

Adding styles to the SubPanel is smart. Displaying it on all pages for an example is quite nice.
Also feel free to use another terminal with tab support if you want to be able to use a tabbed console like in yakuake. Or maybe a drop down python interpreter instead? It’s of course possible to have the drop down console have more than 1 row/col and have them swallow other applications as well. The possibilities are endless ;)

Here are some screenshot of how it can look (without any style tags).
Please do not complain on this configuration as it is work in progress :)



I would love to be proven wrong and have some easier way to do this but right now this is my method of choice. Please feel free to comment.

buffi FVWM, Programming & scripting

  1. May 15th, 2008 at 23:20 | #1

    Few nitpicks:

    + I All [MenuButtons] WarpToWindow 25p 25p #middle of button

    1. You can’t have in-line comments like that. FVWM will parse that in confusion.

    2. The [] syntax for conditional commands has long since been deprecated. You mean:

    + I All (MenuButtons) WarpToWindow 25p 25p

    But even then, since you’ll only ever have one instance, “Next” will suffice:

    + I Next (MenuButtons) WarpToWindow 25p 25p

  2. May 15th, 2008 at 23:21 | #2

    Also note that your function doesn’t:

    UnSetEnv CURSOR_X
    UnSetEnv CURSOR_Y

    It should do.

  1. No trackbacks yet.