mirror of https://github.com/davatorium/rofi.git
Add some comments and cleanups, allow reeloading of keybindings at run-time
This commit is contained in:
parent
681bd5bcbb
commit
c68ab67dd8
|
@ -92,6 +92,15 @@ int take_keyboard ( Display *display, Window w );
|
||||||
*/
|
*/
|
||||||
void x11_grab_key ( Display *display, unsigned int modmask, KeySym key );
|
void x11_grab_key ( Display *display, unsigned int modmask, KeySym key );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param display Connection to the X server.
|
||||||
|
* @param modmask Modifier mask.
|
||||||
|
* @param key Key.
|
||||||
|
*
|
||||||
|
* Ungrab key on display.
|
||||||
|
*/
|
||||||
|
void x11_ungrab_key ( Display *display, unsigned int modmask, KeySym key );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param combo String representing the key combo
|
* @param combo String representing the key combo
|
||||||
* @param mod [out] The modifier specified (or AnyModifier if not specified)
|
* @param mod [out] The modifier specified (or AnyModifier if not specified)
|
||||||
|
|
|
@ -1605,11 +1605,15 @@ static void cleanup ()
|
||||||
// Cleanup
|
// Cleanup
|
||||||
if ( display != NULL ) {
|
if ( display != NULL ) {
|
||||||
if ( main_window != None ) {
|
if ( main_window != None ) {
|
||||||
|
// We should never hit this code.
|
||||||
release_keyboard ( display );
|
release_keyboard ( display );
|
||||||
XFreeGC ( display, gc );
|
XFreeGC ( display, gc );
|
||||||
|
gc = NULL;
|
||||||
XDestroyWindow ( display, main_window );
|
XDestroyWindow ( display, main_window );
|
||||||
XCloseDisplay ( display );
|
main_window = None;
|
||||||
}
|
}
|
||||||
|
XCloseDisplay ( display );
|
||||||
|
display = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1753,7 +1757,18 @@ void show_error_message ( const char *msg, int markup )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void * pthread_signal_process ( void *arg )
|
/**
|
||||||
|
* Separate thread that handles signals being send to rofi.
|
||||||
|
* Currently it listens for three signals:
|
||||||
|
* * HUP: reload the configuration.
|
||||||
|
* * INT: Quit the program.
|
||||||
|
* * USR1: Dump the current configuration to stdout.
|
||||||
|
*
|
||||||
|
* These messages are relayed to the main thread via a pipe, the write side of the pipe is passed
|
||||||
|
* as argument to this thread.
|
||||||
|
* When receiving a sig-int the thread quits.
|
||||||
|
*/
|
||||||
|
static gpointer pthread_signal_process ( gpointer arg )
|
||||||
{
|
{
|
||||||
int pfd = *( (int *) arg );
|
int pfd = *( (int *) arg );
|
||||||
|
|
||||||
|
@ -1781,27 +1796,56 @@ static void * pthread_signal_process ( void *arg )
|
||||||
else if ( sig == SIGINT ) {
|
else if ( sig == SIGINT ) {
|
||||||
write ( pfd, "q", 1 );
|
write ( pfd, "q", 1 );
|
||||||
// Close my end and exit.
|
// Close my end and exit.
|
||||||
return NULL;
|
g_thread_exit ( NULL );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void release_global_keybindings ()
|
||||||
|
{
|
||||||
|
for ( unsigned int i = 0; i < num_switchers; i++ ) {
|
||||||
|
if ( switchers[i]->keystr != NULL ) {
|
||||||
|
// No need to parse key, this should be done when grabbing.
|
||||||
|
if ( switchers[i]->keysym != NoSymbol ) {
|
||||||
|
x11_ungrab_key ( display, switchers[i]->modmask, switchers[i]->keysym );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static int grab_global_keybindings ()
|
||||||
|
{
|
||||||
|
int key_bound = FALSE;
|
||||||
|
for ( unsigned int i = 0; i < num_switchers; i++ ) {
|
||||||
|
if ( switchers[i]->keystr != NULL ) {
|
||||||
|
x11_parse_key ( switchers[i]->keystr, &( switchers[i]->modmask ), &( switchers[i]->keysym ) );
|
||||||
|
if ( switchers[i]->keysym != NoSymbol ) {
|
||||||
|
x11_grab_key ( display, switchers[i]->modmask, switchers[i]->keysym );
|
||||||
|
key_bound = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return key_bound;
|
||||||
|
}
|
||||||
|
|
||||||
static void reload_configuration ()
|
static void reload_configuration ()
|
||||||
{
|
{
|
||||||
if ( find_arg ( "-no-config" ) < 0 ) {
|
if ( find_arg ( "-no-config" ) < 0 ) {
|
||||||
// We need to open a new connection to X11, otherwise we get old
|
// We need to open a new connection to X11, otherwise we get old
|
||||||
// configuration
|
// configuration
|
||||||
Display *display = XOpenDisplay ( display_str );
|
Display *temp_display = XOpenDisplay ( display_str );
|
||||||
if ( display ) {
|
if ( temp_display ) {
|
||||||
load_configuration ( display );
|
load_configuration ( temp_display );
|
||||||
load_configuration_dynamic ( display );
|
load_configuration_dynamic ( temp_display );
|
||||||
|
|
||||||
// Sanity check
|
// Sanity check
|
||||||
config_sanity_check ( );
|
config_sanity_check ( );
|
||||||
parse_keys_abe ();
|
parse_keys_abe ();
|
||||||
XCloseDisplay ( display );
|
XCloseDisplay ( temp_display );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fprintf ( stderr, "Failed to get a new connection to the X11 server. No point in continuing.\n" );
|
||||||
|
abort ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1970,24 +2014,14 @@ int main ( int argc, char *argv[] )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
int key_bound = FALSE;
|
|
||||||
unsigned int key_length = 0;
|
|
||||||
// Daemon mode, Listen to key presses..
|
// Daemon mode, Listen to key presses..
|
||||||
for ( unsigned int i = 0; i < num_switchers; i++ ) {
|
if ( !grab_global_keybindings () ) {
|
||||||
key_length = MAX ( key_length, strlen ( switchers[i]->name ) );
|
|
||||||
if ( switchers[i]->keystr != NULL ) {
|
|
||||||
x11_parse_key ( switchers[i]->keystr, &( switchers[i]->modmask ), &( switchers[i]->keysym ) );
|
|
||||||
x11_grab_key ( display, switchers[i]->modmask, switchers[i]->keysym );
|
|
||||||
key_bound = TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( !key_bound ) {
|
|
||||||
fprintf ( stderr, "Rofi was launched in daemon mode, but no key-binding was specified.\n" );
|
fprintf ( stderr, "Rofi was launched in daemon mode, but no key-binding was specified.\n" );
|
||||||
fprintf ( stderr, "Please check the manpage on how to specify a key-binding.\n" );
|
fprintf ( stderr, "Please check the manpage on how to specify a key-binding.\n" );
|
||||||
fprintf ( stderr, "The following modi are enabled and keys can be specified:\n" );
|
fprintf ( stderr, "The following modi are enabled and keys can be specified:\n" );
|
||||||
for ( unsigned int i = 0; i < num_switchers; i++ ) {
|
for ( unsigned int i = 0; i < num_switchers; i++ ) {
|
||||||
fprintf ( stderr, "\t* "color_bold "%*s"color_reset ": -key-%s <key>\n",
|
fprintf ( stderr, "\t* "color_bold "%s"color_reset ": -key-%s <key>\n",
|
||||||
key_length, switchers[i]->name, switchers[i]->name );
|
switchers[i]->name, switchers[i]->name );
|
||||||
}
|
}
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
@ -1996,12 +2030,12 @@ int main ( int argc, char *argv[] )
|
||||||
fprintf ( stdout, "listening to the following keys:\n" );
|
fprintf ( stdout, "listening to the following keys:\n" );
|
||||||
for ( unsigned int i = 0; i < num_switchers; i++ ) {
|
for ( unsigned int i = 0; i < num_switchers; i++ ) {
|
||||||
if ( switchers[i]->keystr != NULL ) {
|
if ( switchers[i]->keystr != NULL ) {
|
||||||
fprintf ( stdout, "\t* "color_bold "%*s"color_reset " on %s\n",
|
fprintf ( stdout, "\t* "color_bold "%s"color_reset " on %s\n",
|
||||||
key_length, switchers[i]->name, switchers[i]->keystr );
|
switchers[i]->name, switchers[i]->keystr );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
fprintf ( stdout, "\t* "color_bold "%*s"color_reset " on <unspecified>\n",
|
fprintf ( stdout, "\t* "color_bold "%s"color_reset " on <unspecified>\n",
|
||||||
key_length, switchers[i]->name );
|
switchers[i]->name );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2057,7 +2091,13 @@ int main ( int argc, char *argv[] )
|
||||||
// Reload configuration.
|
// Reload configuration.
|
||||||
if ( c == 'c' ) {
|
if ( c == 'c' ) {
|
||||||
fprintf ( stdout, "Reload configuration\n" );
|
fprintf ( stdout, "Reload configuration\n" );
|
||||||
|
// Release the keybindings.
|
||||||
|
release_global_keybindings ();
|
||||||
|
// Reload config
|
||||||
reload_configuration ();
|
reload_configuration ();
|
||||||
|
// Grab the possibly new keybindings.
|
||||||
|
grab_global_keybindings ();
|
||||||
|
XFlush ( display );
|
||||||
}
|
}
|
||||||
// Got message to quit.
|
// Got message to quit.
|
||||||
else if ( c == 'q' ) {
|
else if ( c == 'q' ) {
|
||||||
|
@ -2071,6 +2111,8 @@ int main ( int argc, char *argv[] )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
release_global_keybindings ();
|
||||||
// Join the signal process thread. (at this point it should have exited).
|
// Join the signal process thread. (at this point it should have exited).
|
||||||
// this also unrefs (de-allocs) the GThread object.
|
// this also unrefs (de-allocs) the GThread object.
|
||||||
g_thread_join ( pid_signal_proc );
|
g_thread_join ( pid_signal_proc );
|
||||||
|
|
|
@ -276,6 +276,21 @@ void x11_grab_key ( Display *display, unsigned int modmask, KeySym key )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void x11_ungrab_key ( Display *display, unsigned int modmask, KeySym key )
|
||||||
|
{
|
||||||
|
Screen *screen = DefaultScreenOfDisplay ( display );
|
||||||
|
Window root = RootWindow ( display, XScreenNumberOfScreen ( screen ) );
|
||||||
|
KeyCode keycode = XKeysymToKeycode ( display, key );
|
||||||
|
|
||||||
|
// unbind to combinations of mod and lock masks, so caps and numlock don't confuse people
|
||||||
|
XUngrabKey ( display, keycode, modmask, root );
|
||||||
|
XUngrabKey ( display, keycode, modmask | LockMask, root );
|
||||||
|
|
||||||
|
if ( NumlockMask ) {
|
||||||
|
XUngrabKey ( display, keycode, modmask | NumlockMask, root );
|
||||||
|
XUngrabKey ( display, keycode, modmask | NumlockMask | LockMask, root );
|
||||||
|
}
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* @param display The connection to the X server.
|
* @param display The connection to the X server.
|
||||||
*
|
*
|
||||||
|
@ -345,8 +360,8 @@ void x11_parse_key ( char *combo, unsigned int *mod, KeySym *key )
|
||||||
KeySym sym = XStringToKeysym ( combo + i );
|
KeySym sym = XStringToKeysym ( combo + i );
|
||||||
|
|
||||||
if ( sym == NoSymbol || ( !modmask && ( strchr ( combo, '-' ) || strchr ( combo, '+' ) ) ) ) {
|
if ( sym == NoSymbol || ( !modmask && ( strchr ( combo, '-' ) || strchr ( combo, '+' ) ) ) ) {
|
||||||
|
// TODO popup
|
||||||
fprintf ( stderr, "sorry, cannot understand key combination: %s\n", combo );
|
fprintf ( stderr, "sorry, cannot understand key combination: %s\n", combo );
|
||||||
exit ( EXIT_FAILURE );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
*key = sym;
|
*key = sym;
|
||||||
|
|
Loading…
Reference in New Issue