messenger-gtk

Gtk+3 graphical user interfaces for GNUnet Messenger
Log | Files | Refs | Submodules | README | LICENSE

commit a435a928f6f6280761ee8a76225333d98f96a2b2
parent 4a223f890d2bed4a29843b15d5d5e5f91e43bc20
Author: TheJackiMonster <thejackimonster@gmail.com>
Date:   Sat, 30 Oct 2021 02:49:42 +0200

Added second thread to link the ui with gnunet

Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>

Diffstat:
MMakefile | 4++--
Mresources/ui/messenger.ui | 4++--
Msrc/messenger_gtk.c | 138++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
3 files changed, 141 insertions(+), 5 deletions(-)

diff --git 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 @@ -254,7 +254,7 @@ Author: Tobias Frisch <property name="orientation">vertical</property> <property name="spacing">16</property> <child> - <object class="HdyAvatar"> + <object class="HdyAvatar" id="profile_avatar"> <property name="visible">True</property> <property name="can-focus">False</property> <property name="halign">start</property> @@ -267,7 +267,7 @@ Author: Tobias Frisch </packing> </child> <child> - <object class="GtkLabel"> + <object class="GtkLabel" id="profile_label"> <property name="visible">True</property> <property name="can-focus">False</property> <property name="label" translatable="yes">Profile name</property> diff --git a/src/messenger_gtk.c b/src/messenger_gtk.c @@ -22,9 +22,15 @@ * @file messenger_gtk.c */ +#include <stdbool.h> +#include <stdio.h> + +#include <pthread.h> + #include <gtk-3.0/gtk/gtk.h> #include <libhandy-1/handy.h> +#include <gnunet/gnunet_program_lib.h> #include <gnunet/gnunet_chat_lib.h> 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; }