@ -4,13 +4,14 @@
# include <stdint.h>
# include <stdbool.h>
# include <unistd.h>
# include <sys/select.h>
# include <errno.h>
# include <json-c/json.h>
# include <sys/un.h>
# include <sys/socket.h>
# include <sys/ioctl.h>
# include <getopt.h>
# include "ipc-client.h"
# include "readline.h"
# include "client/registry.h"
# include "client/window.h"
# include "client/pango.h"
@ -50,7 +51,8 @@ int socketfd;
pid_t pid ;
int pipefd [ 2 ] ;
FILE * command ;
char * line , * output , * status_command ;
char line [ 1024 ] ;
char * output , * status_command ;
struct registry * registry ;
struct window * window ;
bool dirty = true ;
@ -106,7 +108,6 @@ void sway_terminate(void) {
close ( pipefd [ 0 ] ) ;
}
free ( line ) ;
exit ( EXIT_FAILURE ) ;
}
@ -304,29 +305,6 @@ void bar_ipc_init(int outputi, const char *bar_id) {
ipc_update_workspaces ( ) ;
}
void update ( ) {
int pending ;
// If no command is set, we don't have to update anything
if ( status_command ) {
if ( ioctl ( fileno ( command ) , FIONREAD , & pending ) ! = - 1 & & pending > 0 ) {
free ( line ) ;
line = read_line ( command ) ;
int l = strlen ( line ) - 1 ;
if ( line [ l ] = = ' \n ' ) {
line [ l ] = ' \0 ' ;
}
dirty = true ;
}
}
if ( ioctl ( socketfd , FIONREAD , & pending ) ! = - 1 & & pending > 0 ) {
uint32_t len ;
char * buf = ipc_recv_response ( socketfd , & len ) ;
free ( buf ) ;
ipc_update_workspaces ( ) ;
dirty = true ;
}
}
void render ( ) {
// Clear
cairo_save ( window - > cairo ) ;
@ -379,6 +357,51 @@ void render() {
}
}
void poll_for_update ( ) {
fd_set readfds ;
int activity ;
while ( 1 ) {
if ( dirty & & window_prerender ( window ) & & window - > cairo ) {
render ( ) ;
window_render ( window ) ;
}
if ( wl_display_dispatch ( registry - > display ) = = - 1 ) {
break ;
}
dirty = false ;
FD_ZERO ( & readfds ) ;
FD_SET ( socketfd , & readfds ) ;
FD_SET ( pipefd [ 0 ] , & readfds ) ;
activity = select ( FD_SETSIZE , & readfds , NULL , NULL , NULL ) ;
if ( activity < 0 ) {
sway_log ( L_ERROR , " polling failed: %d " , errno ) ;
}
if ( FD_ISSET ( socketfd , & readfds ) ) {
sway_log ( L_DEBUG , " Got workspace update. " ) ;
uint32_t len ;
char * buf = ipc_recv_response ( socketfd , & len ) ;
free ( buf ) ;
ipc_update_workspaces ( ) ;
dirty = true ;
}
if ( status_command & & FD_ISSET ( pipefd [ 0 ] , & readfds ) ) {
sway_log ( L_DEBUG , " Got update from status command. " ) ;
fgets ( line , sizeof ( line ) , command ) ;
int l = strlen ( line ) - 1 ;
if ( line [ l ] = = ' \n ' ) {
line [ l ] = ' \0 ' ;
}
dirty = true ;
}
}
}
int main ( int argc , char * * argv ) {
init_log ( L_INFO ) ;
@ -465,7 +488,6 @@ int main(int argc, char **argv) {
close ( pipefd [ 1 ] ) ;
command = fdopen ( pipefd [ 0 ] , " r " ) ;
line = malloc ( 1024 ) ;
line [ 0 ] = ' \0 ' ;
}
@ -479,13 +501,7 @@ int main(int argc, char **argv) {
get_text_size ( window , & width , & height , " Test string for measuring purposes " ) ;
window - > height = height + MARGIN * 2 ;
do {
update ( ) ;
if ( dirty & & window_prerender ( window ) & & window - > cairo ) {
render ( ) ;
window_render ( window ) ;
}
} while ( wl_display_dispatch ( registry - > display ) ! = - 1 ) ;
poll_for_update ( ) ;
window_teardown ( window ) ;
registry_teardown ( registry ) ;
@ -493,7 +509,6 @@ int main(int argc, char **argv) {
// terminate status_command process
kill ( pid , SIGTERM ) ;
close ( pipefd [ 0 ] ) ;
free ( line ) ;
return 0 ;
}