Merge pull request #4 from c00kiemon5ter/client

Rework Client
This commit is contained in:
Bastien Dejean 2012-10-03 10:40:02 -07:00
commit 1c404cc3f6
11 changed files with 99 additions and 85 deletions

View file

@ -8,8 +8,8 @@ LDFLAGS = $(LIBS)
PREFIX ?= /usr/local
BINPREFIX = $(PREFIX)/bin
WM_SRC = bspwm.c events.c messages.c ewmh.c settings.c misc.c tree.c types.c rules.c window.c
CL_SRC = bspc.c
WM_SRC = bspwm.c events.c messages.c ewmh.c settings.c helpers.c tree.c types.c rules.c window.c
CL_SRC = bspc.c helpers.c
WM_OBJ = $(WM_SRC:.c=.o)
CL_OBJ = $(CL_SRC:.c=.o)

63
bspc.c
View file

@ -1,52 +1,59 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include "helpers.h"
#include "common.h"
int main(int argc, char *argv[])
{
int sock_fd, nbr, i;
int sock_fd;
struct sockaddr_un sock_address;
char socket_path[BUFSIZ];
size_t msglen = 0;
char msg[BUFSIZ];
char rsp[BUFSIZ];
if (argc < 2)
return -1;
die("no arguments given\n");
char *sp = getenv(SOCKET_ENV_VAR);
strncpy(socket_path, (sp == NULL ? DEFAULT_SOCKET_PATH : sp), sizeof(socket_path));
msg[0] = '\0';
int max = sizeof(msg);
for (i = 1; max > 0 && i < argc; i++) {
strncat(msg, argv[i], max);
max -= strlen(argv[i]);
if (i < (argc - 1)) {
strncat(msg, TOKEN_SEP, max);
max -= strlen(TOKEN_SEP);
}
}
char *sock_path = getenv(SOCKET_ENV_VAR);
if (sock_path == NULL || strlen(sock_path) == 0)
warn("environmental variable '%s' is not set or empty - using default value: %s\n", SOCKET_ENV_VAR, DEFAULT_SOCKET_PATH);
else if (sizeof(sock_address.sun_path) <= strlen(sock_path))
die("value too long for environmental variable '%s'\n", SOCKET_ENV_VAR);
sock_address.sun_family = AF_UNIX;
strncpy(sock_address.sun_path, socket_path, sizeof(sock_address.sun_path));
strncpy(sock_address.sun_path, (sock_path == NULL ? DEFAULT_SOCKET_PATH: sock_path), sizeof(sock_address.sun_path));
sock_address.sun_path[sizeof(sock_address.sun_path) - 1] = 0;
for (int offset = 0, len = BUFSIZ, n = 0; --argc && ++argv && len > 0; offset += n, len -= n)
n = snprintf(msg + offset, len, "%s ", *argv);
msglen = strlen(msg);
if (msg[msglen - 1] == ' ')
msg[--msglen] = '\0';
sock_fd = socket(AF_UNIX, SOCK_STREAM, 0);
connect(sock_fd, (struct sockaddr *) &sock_address, sizeof(sock_address));
if (sock_fd == -1)
die("failed to create socket\n");
send(sock_fd, msg, strlen(msg), 0);
if (connect(sock_fd, (struct sockaddr *) &sock_address, sizeof(sock_address)) == -1)
die("failed to connect to socket\n");
if ((nbr = recv(sock_fd, rsp, sizeof(rsp), 0)) > 0) {
rsp[nbr] = '\0';
if (strcmp(rsp, EMPTY_RESPONSE) != 0)
printf("%s", rsp);
if (send(sock_fd, msg, msglen, 0) == -1)
die("failed to send data\n");
int n = recv(sock_fd, rsp, sizeof(rsp), 0);
if (n == -1)
die("failed to get response\n");
else if (n > 0) {
rsp[n] = '\0';
printf("%s\n", rsp);
}
close(sock_fd);
return 0;
if (sock_fd)
close(sock_fd);
return EXIT_SUCCESS;
}

16
bspwm.c
View file

@ -18,7 +18,7 @@
#include "rules.h"
#include "events.h"
#include "common.h"
#include "misc.h"
#include "helpers.h"
#include "bspwm.h"
#include "tree.h"
#include "ewmh.h"
@ -53,7 +53,7 @@ void setup(void)
screen_height = screen->height_in_pixels;
root_depth = screen->root_depth;
xcb_atom_t net_atoms[] = {ewmh->_NET_SUPPORTED,
xcb_atom_t net_atoms[] = {ewmh->_NET_SUPPORTED,
ewmh->_NET_DESKTOP_NAMES,
ewmh->_NET_NUMBER_OF_DESKTOPS,
ewmh->_NET_CURRENT_DESKTOP,
@ -85,9 +85,10 @@ int main(void)
{
fd_set descriptors;
char socket_path[BUFSIZ];
int sock_fd, ret_fd, dpy_fd, sel, nbr;
int sock_fd, ret_fd, dpy_fd, sel, n;
struct sockaddr_un sock_address;
char msg[BUFSIZ], rsp[BUFSIZ];
char msg[BUFSIZ] = {0};
char rsp[BUFSIZ] = {0};
xcb_generic_event_t *event;
@ -113,7 +114,7 @@ int main(void)
sock_fd = socket(AF_UNIX, SOCK_STREAM, 0);
if (sock_fd == -1)
if (sock_fd == -1)
die("error: could not create socket\n");
bind(sock_fd, (struct sockaddr *) &sock_address, sizeof(sock_address));
@ -138,9 +139,8 @@ int main(void)
if (FD_ISSET(sock_fd, &descriptors)) {
ret_fd = accept(sock_fd, NULL, 0);
if (ret_fd > 0 && (nbr = recv(ret_fd, msg, sizeof(msg), 0)) > 0) {
msg[nbr] = '\0';
strncpy(rsp, EMPTY_RESPONSE, sizeof(rsp));
if (ret_fd > 0 && (n = recv(ret_fd, msg, sizeof(msg), 0)) > 0) {
msg[n] = '\0';
process_message(msg, rsp);
send(ret_fd, rsp, strlen(rsp), 0);
close(ret_fd);

View file

@ -3,7 +3,6 @@
#define DEFAULT_SOCKET_PATH "/tmp/bspwm-socket"
#define SOCKET_ENV_VAR "BSPWM_SOCKET"
#define EMPTY_RESPONSE ""
#define TOKEN_SEP " "
#endif

View file

@ -7,7 +7,7 @@
#include "types.h"
#include "bspwm.h"
#include "settings.h"
#include "misc.h"
#include "helpers.h"
#include "window.h"
#include "events.h"
#include "tree.h"

View file

@ -1,16 +1,26 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <xcb/xcb.h>
#include <xcb/xcb_event.h>
#include "bspwm.h"
#include "misc.h"
#include "helpers.h"
void die(const char *errstr, ...) {
void logmsg(FILE *stream, char *fmt, va_list ap) {
vfprintf(stream, fmt, ap);
}
void warn(char *fmt, ...) {
va_list ap;
va_start(ap, errstr);
vfprintf(stderr, errstr, ap);
va_start(ap, fmt);
logmsg(stderr, fmt, ap);
va_end(ap);
}
__attribute__((noreturn))
void die(char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
logmsg(stderr, fmt, ap);
va_end(ap);
exit(EXIT_FAILURE);
}

View file

@ -1,6 +1,10 @@
#ifndef _HELPERS_H
#define _HELPERS_H
#include <stdarg.h>
#include <stdio.h>
#include <stdint.h>
#define LENGTH(x) (sizeof(x) / sizeof(*x))
#define MAX(A, B) ((A) > (B) ? (A) : (B))
#define MIN(A, B) ((A) < (B) ? (A) : (B))
@ -18,4 +22,10 @@
# define PRINTF(x) ;
#endif
void logmsg(FILE *, char *, va_list);
void warn(char *, ...);
__attribute__((noreturn))
void die(char *, ...);
uint32_t get_color(char *);
#endif

View file

@ -7,7 +7,7 @@
#include "types.h"
#include "bspwm.h"
#include "ewmh.h"
#include "misc.h"
#include "helpers.h"
#include "window.h"
#include "tree.h"
@ -18,11 +18,11 @@ void process_message(char *msg, char *rsp)
if (cmd == NULL)
return;
if (strcmp(cmd, "get") == 0) {
if (strncmp(cmd, "get", 4) == 0) {
char *name = strtok(NULL, TOKEN_SEP);
get_setting(name, rsp);
return;
} else if (strcmp(cmd, "set") == 0) {
} else if (strncmp(cmd, "set", 4) == 0) {
char *name = strtok(NULL, TOKEN_SEP);
char *value = strtok(NULL, TOKEN_SEP);
set_setting(name, value, rsp);
@ -204,7 +204,7 @@ void process_message(char *msg, char *rsp)
quit();
return;
} else {
snprintf(rsp, BUFSIZ, "unknown command: %s\n", cmd);
snprintf(rsp, BUFSIZ, "unknown command: %s", cmd);
return;
}
@ -273,7 +273,7 @@ void set_setting(char *name, char *value, char *rsp)
ewmh_update_wm_name();
return;
} else {
snprintf(rsp, BUFSIZ, "unknown setting: %s\n", name);
snprintf(rsp, BUFSIZ, "unknown setting: %s", name);
return;
}
@ -286,45 +286,45 @@ void get_setting(char *name, char* rsp)
return;
if (strcmp(name, "inner_border_width") == 0)
sprintf(rsp, "%u\n", inner_border_width);
sprintf(rsp, "%u", inner_border_width);
else if (strcmp(name, "main_border_width") == 0)
sprintf(rsp, "%u\n", main_border_width);
sprintf(rsp, "%u", main_border_width);
else if (strcmp(name, "outer_border_width") == 0)
sprintf(rsp, "%u\n", outer_border_width);
sprintf(rsp, "%u", outer_border_width);
else if (strcmp(name, "border_width") == 0)
sprintf(rsp, "%u\n", border_width);
sprintf(rsp, "%u", border_width);
else if (strcmp(name, "window_gap") == 0)
sprintf(rsp, "%i\n", window_gap);
sprintf(rsp, "%i", window_gap);
else if (strcmp(name, "left_padding") == 0)
sprintf(rsp, "%i\n", left_padding);
sprintf(rsp, "%i", left_padding);
else if (strcmp(name, "right_padding") == 0)
sprintf(rsp, "%i\n", right_padding);
sprintf(rsp, "%i", right_padding);
else if (strcmp(name, "top_padding") == 0)
sprintf(rsp, "%i\n", top_padding);
sprintf(rsp, "%i", top_padding);
else if (strcmp(name, "bottom_padding") == 0)
sprintf(rsp, "%i\n", bottom_padding);
sprintf(rsp, "%i", bottom_padding);
else if (strcmp(name, "active_border_color") == 0)
sprintf(rsp, "%s (%06X)\n", active_border_color, active_border_color_pxl);
sprintf(rsp, "%s (%06X)", active_border_color, active_border_color_pxl);
else if (strcmp(name, "normal_border_color") == 0)
sprintf(rsp, "%s (%06X)\n", normal_border_color, normal_border_color_pxl);
sprintf(rsp, "%s (%06X)", normal_border_color, normal_border_color_pxl);
else if (strcmp(name, "inner_border_color") == 0)
sprintf(rsp, "%s (%06X)\n", inner_border_color, inner_border_color_pxl);
sprintf(rsp, "%s (%06X)", inner_border_color, inner_border_color_pxl);
else if (strcmp(name, "outer_border_color") == 0)
sprintf(rsp, "%s (%06X)\n", outer_border_color, outer_border_color_pxl);
sprintf(rsp, "%s (%06X)", outer_border_color, outer_border_color_pxl);
else if (strcmp(name, "presel_border_color") == 0)
sprintf(rsp, "%s (%06X)\n", presel_border_color, presel_border_color_pxl);
sprintf(rsp, "%s (%06X)", presel_border_color, presel_border_color_pxl);
else if (strcmp(name, "active_locked_border_color") == 0)
sprintf(rsp, "%s (%06X)\n", active_locked_border_color, active_locked_border_color_pxl);
sprintf(rsp, "%s (%06X)", active_locked_border_color, active_locked_border_color_pxl);
else if (strcmp(name, "normal_locked_border_color") == 0)
sprintf(rsp, "%s (%06X)\n", normal_locked_border_color, normal_locked_border_color_pxl);
sprintf(rsp, "%s (%06X)", normal_locked_border_color, normal_locked_border_color_pxl);
else if (strcmp(name, "urgent_border_color") == 0)
sprintf(rsp, "%s (%06X)\n", urgent_border_color, urgent_border_color_pxl);
sprintf(rsp, "%s (%06X)", urgent_border_color, urgent_border_color_pxl);
else if (strcmp(name, "borderless_monocle") == 0)
sprintf(rsp, "%s\n", BOOLSTR(borderless_monocle));
sprintf(rsp, "%s", BOOLSTR(borderless_monocle));
else if (strcmp(name, "wm_name") == 0)
sprintf(rsp, "%s\n", wm_name);
sprintf(rsp, "%s", wm_name);
else
snprintf(rsp, BUFSIZ, "unknown setting: %s\n", name);
snprintf(rsp, BUFSIZ, "unknown setting: %s", name);
}

12
misc.h
View file

@ -1,12 +0,0 @@
#ifndef _UTILS_H
#define _UTILS_H
#include <stdarg.h>
#include <xcb/xcb.h>
#include <xcb/xcb_event.h>
#include "types.h"
void die(const char *, ...);
uint32_t get_color(char *);
#endif

View file

@ -5,7 +5,7 @@
#include <xcb/xcb.h>
#include <xcb/xcb_event.h>
#include "bspwm.h"
#include "misc.h"
#include "helpers.h"
#include "common.h"
#include "settings.h"

2
tree.c
View file

@ -5,7 +5,7 @@
#include <xcb/xcb.h>
#include <xcb/xcb_event.h>
#include "settings.h"
#include "misc.h"
#include "helpers.h"
#include "window.h"
#include "types.h"
#include "bspwm.h"