@ -35,6 +35,22 @@ struct ipc_client {
enum ipc_command_type subscribed_events ;
} ;
static struct modifier_key {
char * name ;
uint32_t mod ;
} modifiers [ ] = {
{ XKB_MOD_NAME_SHIFT , WLC_BIT_MOD_SHIFT } ,
{ XKB_MOD_NAME_CAPS , WLC_BIT_MOD_CAPS } ,
{ XKB_MOD_NAME_CTRL , WLC_BIT_MOD_CTRL } ,
{ " Ctrl " , WLC_BIT_MOD_CTRL } ,
{ XKB_MOD_NAME_ALT , WLC_BIT_MOD_ALT } ,
{ " Alt " , WLC_BIT_MOD_ALT } ,
{ XKB_MOD_NAME_NUM , WLC_BIT_MOD_MOD2 } ,
{ " Mod3 " , WLC_BIT_MOD_MOD3 } ,
{ XKB_MOD_NAME_LOGO , WLC_BIT_MOD_LOGO } ,
{ " Mod5 " , WLC_BIT_MOD_MOD5 } ,
} ;
struct sockaddr_un * ipc_user_sockaddr ( void ) ;
int ipc_handle_connection ( int fd , uint32_t mask , void * data ) ;
int ipc_client_handle_readable ( int client_fd , uint32_t mask , void * data ) ;
@ -295,6 +311,8 @@ void ipc_client_handle_command(struct ipc_client *client) {
client - > subscribed_events | = IPC_EVENT_BARCONFIG_UPDATE ;
} else if ( strcmp ( event_type , " mode " ) = = 0 ) {
client - > subscribed_events | = IPC_EVENT_MODE ;
} else if ( strcmp ( event_type , " modifier " ) = = 0 ) {
client - > subscribed_events | = IPC_EVENT_MODIFIER ;
} else {
ipc_send_reply ( client , " { \" success \" : false} " , 18 ) ;
ipc_client_disconnect ( client ) ;
@ -617,3 +635,24 @@ void ipc_event_mode(const char *mode) {
json_object_put ( obj ) ; // free
}
void ipc_event_modifier ( uint32_t modifier , const char * state ) {
json_object * obj = json_object_new_object ( ) ;
json_object_object_add ( obj , " change " , json_object_new_string ( state ) ) ;
const char * modifier_name = NULL ;
int i ;
for ( i = 0 ; i < ( int ) ( sizeof ( modifiers ) / sizeof ( struct modifier_key ) ) ; + + i ) {
if ( modifiers [ i ] . mod = = modifier ) {
modifier_name = modifiers [ i ] . name ;
break ;
}
}
json_object_object_add ( obj , " modifier " , json_object_new_string ( modifier_name ) ) ;
const char * json_string = json_object_to_json_string ( obj ) ;
ipc_send_event ( json_string , IPC_EVENT_MODIFIER ) ;
json_object_put ( obj ) ; // free
}