summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--desktop/Makefile12
-rw-r--r--desktop/grab.h5
-rw-r--r--desktop/info.h8
-rw-r--r--desktop/main.c20
-rw-r--r--desktop/server.c112
-rw-r--r--desktop/server.h14
-rw-r--r--desktop/vector.h4
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__