From a435a928f6f6280761ee8a76225333d98f96a2b2 Mon Sep 17 00:00:00 2001 From: TheJackiMonster Date: Sat, 30 Oct 2021 02:49:42 +0200 Subject: Added second thread to link the ui with gnunet Signed-off-by: TheJackiMonster --- Makefile | 4 +- resources/ui/messenger.ui | 4 +- src/messenger_gtk.c | 138 +++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 141 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 1e512aa..9ffcdae 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ BINARY = messenger-gtk SOURCES = messenger_gtk.c HEADERS = -LIBRARIES = gnunetchat +LIBRARIES = gnunetutil gnunetchat PACKAGES = libhandy-1 gtk+-3.0 libnotify CC ?= gcc @@ -14,7 +14,7 @@ LD ?= gcc RM ?= rm CFLAGS += -pedantic -Wall -Wextra -march=native -ggdb3 -LDFLAGS += +LDFLAGS += -pthread DEBUGFLAGS = -O0 -D _DEBUG RELEASEFLAGS = -O2 -D NDEBUG -fwhole-program diff --git a/resources/ui/messenger.ui b/resources/ui/messenger.ui index 50b68b7..d0487fa 100644 --- a/resources/ui/messenger.ui +++ b/resources/ui/messenger.ui @@ -254,7 +254,7 @@ Author: Tobias Frisch vertical 16 - + True False start @@ -267,7 +267,7 @@ Author: Tobias Frisch - + True False Profile name diff --git a/src/messenger_gtk.c b/src/messenger_gtk.c index a07e6b3..7106645 100644 --- a/src/messenger_gtk.c +++ b/src/messenger_gtk.c @@ -22,9 +22,15 @@ * @file messenger_gtk.c */ +#include +#include + +#include + #include #include +#include #include void handle_user_details_button_click(GtkButton* button, @@ -76,7 +82,123 @@ void handle_back_button_click(GtkButton* button, } } -int main(int argc, char** argv) { +struct main_program +{ + int argc; + char** argv; + + bool exit; + + struct GNUNET_CHAT_Handle *chat; + + HdyAvatar *profile_avatar; + GtkLabel *profile_label; + + struct GNUNET_SCHEDULER_Task *idle; +}; + +gboolean gtk_set_profile_name(gpointer user_data) +{ + struct main_program *program = (struct main_program*) user_data; + + const char *name = GNUNET_CHAT_get_name(program->chat); + + if (name) + { + hdy_avatar_set_text(program->profile_avatar, name); + gtk_label_set_text(program->profile_label, name); + } + + return FALSE; +} + +int gnunet_chat_message(void *cls, + struct GNUNET_CHAT_Context *context, + const struct GNUNET_CHAT_Message *message) +{ + struct main_program *program = (struct main_program*) cls; + + printf("Hello world\n"); + + if (GNUNET_CHAT_KIND_LOGIN == GNUNET_CHAT_message_get_kind(message)) + g_idle_add(gtk_set_profile_name, program); + + return GNUNET_YES; +} + +void gnunet_idle(void *cls) +{ + struct main_program *program = (struct main_program*) cls; + + if (program->exit) + { + GNUNET_CHAT_stop(program->chat); + program->chat = NULL; + + GNUNET_SCHEDULER_shutdown(); + return; + } + + program->idle = GNUNET_SCHEDULER_add_delayed_with_priority( + GNUNET_TIME_relative_get_second_(), + GNUNET_SCHEDULER_PRIORITY_IDLE, + gnunet_idle, + program + ); +} + +void gnunet_task(void *cls, + char *const *args, + const char *cfgfile, + const struct GNUNET_CONFIGURATION_Handle *cfg) +{ + struct main_program *program = (struct main_program*) cls; + + program->chat = GNUNET_CHAT_start( + cfg, + "messenger-gtk", + "test", + &gnunet_chat_message, + program + ); + + program->idle = GNUNET_SCHEDULER_add_delayed_with_priority( + GNUNET_TIME_relative_get_zero_(), + GNUNET_SCHEDULER_PRIORITY_IDLE, + gnunet_idle, + program + ); +} + +void *gnunet_thread(void *args) +{ + struct main_program *program = (struct main_program*) args; + + struct GNUNET_GETOPT_CommandLineOption options[] = { + GNUNET_GETOPT_OPTION_END + }; + + GNUNET_PROGRAM_run( + program->argc, + program->argv, + "messenger-gtk", + gettext_noop("A GTK based GUI for the Messenger service of GNUnet."), + options, + &gnunet_task, + program + ); + + return NULL; +} + +int main(int argc, char **argv) { + struct main_program program; + program.argc = argc; + program.argv = argv; + + program.exit = FALSE; + + pthread_t gnunet_tid; gtk_init(&argc, &argv); GtkBuilder* builder = gtk_builder_new(); @@ -90,6 +212,14 @@ int main(int argc, char** argv) { gtk_builder_get_object(builder, "main_window") ); + program.profile_avatar = HDY_AVATAR( + gtk_builder_get_object(builder, "profile_avatar") + ); + + program.profile_label = GTK_LABEL( + gtk_builder_get_object(builder, "profile_label") + ); + GdkScreen* screen = gdk_screen_get_default(); GtkCssProvider* provider = gtk_css_provider_new(); @@ -198,6 +328,12 @@ int main(int argc, char** argv) { g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); + pthread_create(&gnunet_tid, NULL, gnunet_thread, &program); + gtk_main(); + + program.exit = TRUE; + + pthread_join(gnunet_tid, NULL); return 0; } -- cgit v1.2.3