improvements

This commit is contained in:
ch1p 2014-11-19 11:33:04 +03:00
parent bdc7ff9d08
commit 2c2744db26
7 changed files with 91 additions and 82 deletions

View File

@ -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

View File

@ -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 {

View File

@ -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

View File

@ -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();

View File

@ -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"
#include "info.h"
#define SERVER_PORT 52178
#define SERVER_HOST "localhost"
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);
}

View File

@ -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();

View File

@ -1,7 +1,3 @@
/**
* Based on https://gist.github.com/EmilHernvall/953968
*/
#ifndef VECTOR_H__
#define VECTOR_H__