#! perl #:META:RESOURCE:%.hotkey:string:activation hotkey keysym =head1 NAME kuake - kuake-like hotkey terminal =head1 EXAMPLES urxvt -kuake-hotkey F10 URxvt.kuake.hotkey: F10 =head1 DESCRIPTION A very primitive quake-console-like extension. It was inspired by a description of how the programs C and C work: Whenever the user presses a global accelerator key (by default C), the terminal will show or hide itself. Another press of the accelerator key will hide or show it again. Initially, the window will not be shown when using this extension. This is useful if you need a single terminal that is not using any desktop space most of the time but is quickly available at the press of a key. The accelerator key is grabbed regardless of any modifiers, so this extension will actually grab a physical key just for this function. If you want a quake-like animation, tell your window manager to do so (fvwm can do it). =cut sub on_start { my ($self) = @_; $self->{key} = $self->{argv}[0] || $self->x_resource ("%.hotkey") || "F10"; $self->{keysym} = $self->XStringToKeysym ($self->{key}) or urxvt::fatal "cannot convert requested kuake wake-up key '$self->{key}' to keysym, unable to continue.\n"; $self->{keycode} = $self->XKeysymToKeycode ($self->{keysym}) or urxvt::fatal "cannot convert requested kuake wake-up key '$self->{key}' to keycode, unable to continue.\n"; $self->XGrabKey ($self->{keycode}, urxvt::AnyModifier, $self->DefaultRootWindow); $self->XUnmapWindow ($self->parent); $self->{unmap_me} = 1; () } sub on_map_notify { my ($self) = @_; # suppress initial map event $self->XUnmapWindow ($self->parent) if delete $self->{unmap_me}; () } sub on_root_event { my ($self, $event) = @_; return unless $event->{type} == urxvt::KeyPress && $event->{keycode} == $self->{keycode}; $self->mapped ? $self->XUnmapWindow ($self->parent) : $self->XMapWindow ($self->parent); 1 } sub on_destroy { my ($self) = @_; $self->XUngrabKey ($self->XKeysymToKeycode ($self->{keysym}), 0, $self->DefaultRootWindow) if $self->{keysym}; () }