summaryrefslogtreecommitdiff
path: root/gtk.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk.c')
-rw-r--r--gtk.c272
1 files changed, 0 insertions, 272 deletions
diff --git a/gtk.c b/gtk.c
deleted file mode 100644
index af24a73..0000000
--- a/gtk.c
+++ /dev/null
@@ -1,272 +0,0 @@
-
-
-#include <gtk-4.0/gtk/gtk.h>
-#include <stdio.h>
-
-#include "net.h"
-#include "data.h"
-
-
-typedef struct _chat_widget_t {
- GtkWidget* page;
- GtkWidget* content;
- GtkWidget* entry;
-} chat_widget_t;
-
-
-// the GTK application is available as global variable
-static GtkApplication* app;
-
-// all GTK widgets are accessible in this file via global variables
-static GtkWidget* window;
-static GtkWidget* stack;
-
-// connector page
-static GtkStackPage* connector_page;
-static GtkWidget* connector_box;
-static GtkWidget* connector_jid_label;
-static GtkWidget* connector_jid_entry;
-static GtkWidget* connector_pwd_label;
-static GtkWidget* connector_pwd_entry;
-static GtkWidget* connector_button;
-
-// roster page
-static GtkStackPage* roster_page;
-static GtkWidget* roster_layout_box;
-static GtkWidget* roster_scrolled;
-static GtkWidget* roster_content_box;
-static GtkWidget* roster_button;
-
-
-static void quit_cb(void) {
- g_application_quit(G_APPLICATION(app));
-}
-
-static void connect_cb(void) {
-
- const char* jid_text = gtk_editable_get_text(GTK_EDITABLE(connector_jid_entry));
- const char* pwd_text = gtk_editable_get_text(GTK_EDITABLE(connector_pwd_entry));
-
- gtk_stack_set_visible_child(GTK_STACK(stack), roster_layout_box);
-
- // just dummy output
- fprintf(stderr, "Connecting with:\nJID: %s\nPWD: %s\n", jid_text, pwd_text);
-
- net_connect(jid_text, pwd_text);
-}
-
-static void disconnect_cb(void) {
-
- gtk_stack_set_visible_child(GTK_STACK(stack), connector_box);
-
- // just dummy output
- fprintf(stderr, "Disconnected!\n");
-
- net_disconnect();
-}
-
-void send_message(chat_t* chat) {
-
- // cast void* to GUI-specific chat_widget_t*
- chat_widget_t* chat_widget = (chat_widget_t*)chat->widget;
-
- // get text of message and own JID
- const char* text = gtk_editable_get_text(GTK_EDITABLE(chat_widget->entry));
- const char* self = gtk_editable_get_text(GTK_EDITABLE(connector_jid_entry));
-
- // add message to datastructure and send it
- data_add_outgoing_message(self, text, chat);
- net_send_message(self, text, chat->jid);
-
- // clear text input
- GtkEntryBuffer* buffer;
- buffer = gtk_entry_get_buffer(GTK_ENTRY(chat_widget->entry));
- gtk_entry_buffer_delete_text(buffer, 0, -1);
-}
-
-/* Set credentials from environment variables if given */
-static void set_debug_credentials(GtkWidget* user, GtkWidget* pwd) {
-
- char* user_str = getenv("LIMOX_USER");
- if (user_str != NULL) {
- GtkEntryBuffer* buffer;
- buffer = gtk_entry_get_buffer(GTK_ENTRY(user));
- gtk_entry_buffer_set_text(buffer, user_str, -1);
- }
-
- char* pwd_str = getenv("LIMOX_PWD");
- if (pwd_str != NULL) {
- gtk_editable_set_text(GTK_EDITABLE(pwd), pwd_str);
- }
-
-}
-
-static void build_static_widgets(void) {
-
- // main window with stack
- window = gtk_window_new();
- gtk_window_set_title(GTK_WINDOW(window), "LimoX");
- gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);
- stack = gtk_stack_new();
- gtk_window_set_child(GTK_WINDOW(window), stack);
-
- // connector page
- connector_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 20);
- connector_page = gtk_stack_add_child(GTK_STACK(stack), connector_box);
- connector_jid_label = gtk_label_new("XMPP address (JID)");
- gtk_box_append(GTK_BOX(connector_box), connector_jid_label);
- connector_jid_entry = gtk_entry_new();
- gtk_box_append(GTK_BOX(connector_box), connector_jid_entry);
- connector_pwd_label = gtk_label_new("Password");
- gtk_box_append(GTK_BOX(connector_box), connector_pwd_label);
- connector_pwd_entry = gtk_password_entry_new();
- gtk_box_append(GTK_BOX(connector_box), connector_pwd_entry);
- connector_button = gtk_button_new_with_label("Connect");
- gtk_box_append(GTK_BOX(connector_box), connector_button);
- set_debug_credentials(connector_jid_entry, connector_pwd_entry);
-
- // roster page
- roster_layout_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 20);
- roster_page = gtk_stack_add_child(GTK_STACK(stack), roster_layout_box);
- roster_button = gtk_button_new_with_label("Disconnect");
- gtk_box_append(GTK_BOX(roster_layout_box), roster_button);
- roster_scrolled = gtk_scrolled_window_new();
- gtk_widget_set_vexpand(roster_scrolled, TRUE);
- roster_content_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
- gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(roster_scrolled),
- roster_content_box);
- gtk_box_append(GTK_BOX(roster_layout_box), roster_scrolled);
-
-}
-
-static void activate(void) {
-
- build_static_widgets();
-
- // configure widgets
- gtk_window_set_application(GTK_WINDOW(window), app);
- g_signal_connect_swapped(window, "close-request", G_CALLBACK(quit_cb), app);
- g_signal_connect_swapped(
- connector_button, "clicked", G_CALLBACK(connect_cb), NULL);
- g_signal_connect_swapped(
- roster_button, "clicked", G_CALLBACK(disconnect_cb), NULL);
-
- gtk_widget_show(window);
-}
-
-static void idle_cb(void) {
-
- net_run_once();
-
-}
-
-void gui_run(void) {
-
-#ifdef GTK_SRCDIR
- g_chdir(GTK_SRCDIR);
-#endif
-
- app = gtk_application_new("eu.xengineering.limox", G_APPLICATION_DEFAULT_FLAGS);
- g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
- g_idle_add(G_SOURCE_FUNC(idle_cb), NULL);
-
- g_application_run(G_APPLICATION(app), 0, NULL);
- g_object_unref(app);
-
-}
-
-static void to_roster(void) {
-
- gtk_stack_set_visible_child(GTK_STACK(stack), roster_layout_box);
-
-}
-
-void gui_add_chat_widget(chat_t* chat) {
-
- // allocate chat_widget_t and save as void* in given chat_t
- chat_widget_t* chat_widget = malloc(sizeof(chat_widget_t));
- chat->widget = (void*)chat_widget;
-
- // create chat page (GtkBox) and add it to the stack
- GtkWidget* chat_layout_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 20);
- gtk_stack_add_child(GTK_STACK(stack), chat_layout_box);
- chat_widget->page = chat_layout_box;
-
- // create and add back button
- GtkWidget* back = gtk_button_new_with_label("back");
- gtk_box_append(GTK_BOX(chat_layout_box), back);
- g_signal_connect_swapped(back, "clicked", G_CALLBACK(to_roster), NULL);
-
- // create and add scrolled window
- GtkWidget* scrolled = gtk_scrolled_window_new();
- gtk_widget_set_vexpand(scrolled, TRUE);
- gtk_box_append(GTK_BOX(chat_layout_box), scrolled);
-
- // create and add content box for dynamic message widgets
- GtkWidget* chat_content_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
- gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(scrolled),
- chat_content_box);
- chat_widget->content = chat_content_box;
-
- // create and add text input field
- GtkWidget* text_entry = gtk_entry_new();
- gtk_box_append(GTK_BOX(chat_layout_box), text_entry);
- chat_widget->entry = text_entry;
-
- // create and add send button
- GtkWidget* send_button = gtk_button_new_with_label("send");
- gtk_box_append(GTK_BOX(chat_layout_box), send_button);
- g_signal_connect_swapped(send_button, "clicked", G_CALLBACK(send_message),
- chat);
-
-}
-
-void gui_add_message_widget(message_t* message, chat_t* chat) {
-
- const char* connector = "\n";
- char* label_content = malloc(sizeof(char)*(strlen(message->sender_jid)
- + strlen(connector)
- + strlen(message->content)));
- sprintf(label_content, "%s%s%s", message->sender_jid, connector,
- message->content);
- GtkWidget* label = gtk_label_new(label_content);
- gtk_label_set_wrap(GTK_LABEL(label), TRUE);
- gtk_label_set_selectable(GTK_LABEL(label), TRUE);
- message->widget = (void*)label;
- chat_widget_t* chat_widget = (chat_widget_t*)chat->widget;
- gtk_box_append(GTK_BOX(chat_widget->content), label);
- free(label_content);
-
-}
-
-static void to_chat(chat_t* chat) {
-
- chat_widget_t* chat_widget = (chat_widget_t*)chat->widget;
- gtk_stack_set_visible_child(GTK_STACK(stack), chat_widget->page);
-
-}
-
-void gui_add_roster_item_widget(roster_item_t* item) {
-
- // print debug message
- if (item->name) {
- fprintf(stderr, "roster item: %s, %s, sub:%d\n", item->name, item->jid,
- item->sub);
- } else {
- fprintf(stderr, "roster item: (no name), %s, sub:%d\n", item->jid, item->sub);
- }
-
- // create widget for roster item
- GtkWidget* roster_item_widget;
- if (item->name == NULL || strcmp(item->name, "") == 0) {
- roster_item_widget = gtk_button_new_with_label(item->jid);
- } else {
- roster_item_widget = gtk_button_new_with_label(item->name);
- }
-
- // add roster item widget to roster page
- gtk_box_append(GTK_BOX(roster_content_box), roster_item_widget);
- g_signal_connect_swapped(roster_item_widget, "clicked", G_CALLBACK(to_chat),
- item->chat);
-
-}