diff options
author | ch1p <ch1p@ch1p.com> | 2014-11-19 11:33:04 +0300 |
---|---|---|
committer | ch1p <ch1p@ch1p.com> | 2014-11-19 11:33:04 +0300 |
commit | 2c2744db268f54d301c88963c9d227a3c7c49ac8 (patch) | |
tree | 2e7ab3f216ec8aa2dd292d9b3bf2027a2667bcc4 | |
parent | bdc7ff9d08b2f4030e0c27c7752c4bdf2fed6172 (diff) |
-rw-r--r-- | desktop/Makefile | 12 | ||||
-rw-r--r-- | desktop/grab.h | 5 | ||||
-rw-r--r-- | desktop/info.h | 8 | ||||
-rw-r--r-- | desktop/main.c | 20 | ||||
-rw-r--r-- | desktop/server.c | 112 | ||||
-rw-r--r-- | desktop/server.h | 14 | ||||
-rw-r--r-- | desktop/vector.h | 4 |
7 files changed, 92 insertions, 83 deletions
diff --git a/desktop/Makefile b/desktop/Makefile index 49e6f7a..ea5cfc2 100644 --- a/desktop/Makefile +++ b/desktop/Makefile @@ -1,13 +1,13 @@ -LIBS = gtk+-2.0 glib-2.0 cairo pango gdk-pixbuf-2.0 atk libwebsockets x11 -CC = gcc -CCFLAGS = -Wall -std=c99 -pthread `pkg-config --cflags --libs ${LIBS}` -LDFLAGS = -lm -BINARIES = vkpc +LIBS=gtk+-2.0 glib-2.0 cairo pango gdk-pixbuf-2.0 atk libwebsockets x11 +CC=gcc +CCFLAGS=-Wall -std=c99 -pthread `pkg-config --cflags ${LIBS}` +LDFLAGS=-lm -pthread `pkg-config --libs ${LIBS}` +BINARIES=vkpc all : vkpc vkpc : server.o grab.o vector.o main.o - ${CC} ${CCFLAGS} server.o grab.o vector.o main.o ${LDFLAGS} -o vkpc + ${CC} ${LDFLAGS} server.o grab.o vector.o main.o -o vkpc server.o : server.c ${CC} ${CCFLAGS} -c server.c diff --git a/desktop/grab.h b/desktop/grab.h index 762f9d8..0fbd889 100644 --- a/desktop/grab.h +++ b/desktop/grab.h @@ -2,7 +2,10 @@ #define GRAB_H__ enum HotkeyEvent { - HK_PREV, HK_NEXT, HK_PAUSE, HK_PLAY, + HK_PREV, + HK_NEXT, + HK_PAUSE, + HK_PLAY, HOTKEYS_COUNT }; struct Hotkey { diff --git a/desktop/info.h b/desktop/info.h index f13bbdc..3b82302 100644 --- a/desktop/info.h +++ b/desktop/info.h @@ -3,11 +3,13 @@ #define APP_NAME "VK Player Controller" #define APP_ABOUT "Use media buttons to switch between tracks." -#define APP_VERSION "0.1" -#define APP_AUTHOR "Eugene Z. <ch1p@ch1p.com>" -#define APP_URL "http://ch1p.com/vkpc/" +#define APP_VERSION "0.2" +#define APP_AUTHOR "Eugene Z <me@ch1p.com>" +#define APP_URL "https://ch1p.com/vkpc/?linux" #define SERVER_PORT 52178 #define SERVER_HOST "localhost" +// #define DEBUG 1 + #endif diff --git a/desktop/main.c b/desktop/main.c index 8703991..f67ad41 100644 --- a/desktop/main.c +++ b/desktop/main.c @@ -11,12 +11,9 @@ static GtkStatusIcon *tray_icon; static GtkWidget *menu; -enum server_last_cmd_enum server_last_cmd = NONE; static pthread_t grab_thread; static pthread_t server_thread; -pthread_mutex_t server_last_cmd_mutex; - void tray_icon_on_click(GtkStatusIcon *status_icon, gpointer user_data) { // left-click } @@ -47,7 +44,6 @@ void menu_about(GtkWidget *widget, gpointer data) { } void menu_quit(GtkWidget *widget, gpointer data) { - // quit app exit(0); } @@ -84,28 +80,30 @@ void create_menu() { } void handle_hotkeys(enum HotkeyEvent e) { - pthread_mutex_lock(&server_last_cmd_mutex); + printf("[handle_hotkeys] e: %d\n", e); + + pthread_mutex_lock(&server_command_mutex); switch (e) { case HK_PLAY: - server_last_cmd = PLAY; + server_command = PLAY; break; case HK_PAUSE: - server_last_cmd = PAUSE; + server_command = PAUSE; break; case HK_NEXT: - server_last_cmd = NEXT; + server_command = NEXT; break; case HK_PREV: - server_last_cmd = PREV; + server_command = PREV; break; default: break; } - pthread_mutex_unlock(&server_last_cmd_mutex); + pthread_mutex_unlock(&server_command_mutex); } void start_grab() { @@ -125,7 +123,7 @@ void start_server() { } int main(int argc, char **argv) { - pthread_mutex_init(&server_last_cmd_mutex, NULL); + pthread_mutex_init(&server_command_mutex, NULL); start_grab(); start_server(); diff --git a/desktop/server.c b/desktop/server.c index a3c308f..3bb7aac 100644 --- a/desktop/server.c +++ b/desktop/server.c @@ -1,7 +1,3 @@ -/** - * TODO: logging level - */ - #include <string.h> #include <stdio.h> #include <stdlib.h> @@ -10,50 +6,53 @@ #include "server.h" #include "vector.h" - -#define SERVER_PORT 52178 -#define SERVER_HOST "localhost" +#include "info.h" + +enum { + LWS_LOG_ERR = 1, + LWS_LOG_WARN = 2, + LWS_LOG_NOTICE = 4, + LWS_LOG_INFO = 8, + LWS_LOG_DEBUG = 16, + LWS_LOG_PARSER = 32, + LWS_LOG_HEADER = 64, + LWS_LOG_EXTENSION = 128, + LWS_LOG_CLIENT = 256, + LWS_LOG_LATENCY = 512 +}; static struct libwebsocket_context *context; -static char *server_last_cmd_values[] = { +static const char *server_commands[] = { "none", "play", "pause", "next", "prev" }; -struct per_session_data { - bool established; - char *next_command; -}; -struct session { - struct per_session_data *pss; - struct libwebsocket *wsi; -}; +server_command_t server_command; +pthread_mutex_t server_command_mutex; vector *sessions; -static void add_session(struct libwebsocket *wsi, struct per_session_data *pss) { - struct session *s = malloc(sizeof(struct session)); - s->wsi = wsi; - s->pss = pss; - vector_add(sessions, s); +static void add_session(server_session_t *pss) { + vector_add(sessions, pss); } static void delete_session(struct libwebsocket *wsi) { - for (int i = 0; i < vector_count(sessions); i++) { - struct session *s = vector_get(sessions, i); + int count = vector_count(sessions); + for (int i = 0; i < count; i++) { + server_session_t *s = vector_get(sessions, i); if (s != NULL && s->wsi == wsi) { - printf("(delete_session) found, i=%d\n", i); - free(s); vector_delete(sessions, i); break; } } } -static void send_command_to_all(char *command) { - printf("Got command: %s\n", command); - for (int i = 0; i < vector_count(sessions); i++) { - struct session *s = (struct session *)vector_get(sessions, i); - s->pss->next_command = command; - libwebsocket_callback_on_writable(context, s->wsi); +static void send_command(server_command_t command) { + int count = vector_count(sessions); + for (int i = 0; i < count; i++) { + server_session_t *s = vector_get(sessions, i); + if (s != NULL) { + s->next_command = command; + libwebsocket_callback_on_writable(context, s->wsi); + } } } @@ -64,13 +63,13 @@ static int callback_http(struct libwebsocket_context *this, void *in, size_t len) { + static const char *response = "vkpc, world!"; switch (reason) { case LWS_CALLBACK_HTTP: ; libwebsocket_callback_on_writable(context, wsi); break; case LWS_CALLBACK_HTTP_WRITEABLE: ; - char *response = "vkpc, world!"; libwebsocket_write(wsi, (unsigned char *)response, strlen(response), LWS_WRITE_HTTP); return -1; @@ -87,26 +86,28 @@ static int callback_signaling(struct libwebsocket_context *this, void *in, size_t len) { - struct per_session_data *pss = (struct per_session_data *)user; + server_session_t *pss = (server_session_t *)user; switch (reason) { case LWS_CALLBACK_ESTABLISHED: lwsl_info("Connection established"); - pss->established = true; - pss->next_command = NULL; - add_session(wsi, pss); + pss->next_command = NONE; + pss->wsi = wsi; + add_session(pss); libwebsocket_callback_on_writable(context, wsi); break; case LWS_CALLBACK_SERVER_WRITEABLE: - if (pss->next_command != NULL) { - int length = strlen(pss->next_command); + if (pss->next_command != NONE) { + const char *command = server_commands[pss->next_command]; + int length = strlen(command); + unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + length + LWS_SEND_BUFFER_POST_PADDING]; unsigned char *p = &buf[LWS_SEND_BUFFER_PRE_PADDING]; - strcpy((char *)p, pss->next_command); + strcpy((char *)p, command); int m = libwebsocket_write(wsi, p, length, LWS_WRITE_TEXT); if (m < length) { @@ -114,7 +115,7 @@ static int callback_signaling(struct libwebsocket_context *this, return -1; } - pss->next_command = NULL; + pss->next_command = NONE; } break; @@ -135,13 +136,13 @@ static int callback_signaling(struct libwebsocket_context *this, return 0; } -static struct libwebsocket_protocols protocols[] = { - { "http-only", callback_http, 0, 0 }, - { "signaling-protocol", callback_signaling, sizeof(struct per_session_data), 0 }, - { NULL, NULL, 0 } -}; - void server_init() { + static struct libwebsocket_protocols protocols[] = { + { "http-only", callback_http, 0, 0 }, + { "signaling-protocol", callback_signaling, sizeof(server_session_t), 0 }, + { NULL, NULL, 0 } + }; + sessions = vector_create(); struct lws_context_creation_info info; @@ -157,22 +158,25 @@ void server_init() { info.uid = -1; info.options = 0; +#ifdef DEBUG + lws_set_log_level(LWS_LOG_ERR | LWS_LOG_WARN | LWS_LOG_NOTICE | LWS_LOG_INFO | LWS_LOG_DEBUG | LWS_LOG_HEADER, NULL); +#else + lws_set_log_level(0, NULL); +#endif + context = libwebsocket_create_context(&info); if (context == NULL) { fprintf(stderr, "libwebsocket init failed\n"); return; } - enum server_last_cmd_enum last_cmd = NONE; while (1) { - pthread_mutex_lock(&server_last_cmd_mutex); - last_cmd = server_last_cmd; - server_last_cmd = NONE; - pthread_mutex_unlock(&server_last_cmd_mutex); - - if (last_cmd != NONE) { - send_command_to_all(server_last_cmd_values[last_cmd]); + pthread_mutex_lock(&server_command_mutex); + if (server_command != NONE) { + send_command(server_command); + server_command = NONE; } + pthread_mutex_unlock(&server_command_mutex); libwebsocket_service(context, 50); } diff --git a/desktop/server.h b/desktop/server.h index 1b7af3f..0437d8c 100644 --- a/desktop/server.h +++ b/desktop/server.h @@ -3,11 +3,17 @@ #ifndef SERVER_H__ #define SERVER_H__ -enum server_last_cmd_enum { +typedef enum { NONE = 0, PLAY, PAUSE, NEXT, PREV -}; -extern enum server_last_cmd_enum server_last_cmd; -extern pthread_mutex_t server_last_cmd_mutex; +} server_command_t; + +typedef struct { + server_command_t next_command; + struct libwebsocket *wsi; +} server_session_t; + +extern server_command_t server_command; +extern pthread_mutex_t server_command_mutex; void server_init(); diff --git a/desktop/vector.h b/desktop/vector.h index c9e9c98..845b0d6 100644 --- a/desktop/vector.h +++ b/desktop/vector.h @@ -1,7 +1,3 @@ -/** - * Based on https://gist.github.com/EmilHernvall/953968 - */ - #ifndef VECTOR_H__ #define VECTOR_H__ |