aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile1
-rw-r--r--resources/ui/chat_entry.ui119
-rw-r--r--src/chat/messenger.c2
-rw-r--r--src/event.c61
-rw-r--r--src/ui/chat_entry.c55
-rw-r--r--src/ui/chat_entry.h48
-rw-r--r--src/ui/messenger.c7
7 files changed, 285 insertions, 8 deletions
diff --git a/Makefile b/Makefile
index 4f69112..3cd1555 100644
--- a/Makefile
+++ b/Makefile
@@ -7,6 +7,7 @@ SOURCES = messenger_gtk.c\
7 application.c\ 7 application.c\
8 event.c\ 8 event.c\
9 chat/messenger.c\ 9 chat/messenger.c\
10 ui/chat_entry.c\
10 ui/messenger.c 11 ui/messenger.c
11 12
12HEADERS = 13HEADERS =
diff --git a/resources/ui/chat_entry.ui b/resources/ui/chat_entry.ui
new file mode 100644
index 0000000..cb80132
--- /dev/null
+++ b/resources/ui/chat_entry.ui
@@ -0,0 +1,119 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<!-- Generated with glade 3.38.2
3
4Copyright (C) 2021 GNUnet e.V.
5
6GNUnet is free software: you can redistribute it and/or modify it
7under the terms of the GNU Affero General Public License as published
8by the Free Software Foundation, either version 3 of the License,
9or (at your option) any later version.
10
11GNUnet is distributed in the hope that it will be useful, but
12WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14Affero General Public License for more details.
15
16You should have received a copy of the GNU Affero General Public License
17along with this program. If not, see <http://www.gnu.org/licenses/>.
18
19SPDX-License-Identifier: AGPL3.0-or-later
20Author: Tobias Frisch
21
22-->
23<interface>
24 <requires lib="gtk+" version="3.24"/>
25 <requires lib="libhandy" version="1.2"/>
26 <object class="GtkBox" id="entry_box">
27 <property name="visible">True</property>
28 <property name="can-focus">False</property>
29 <property name="spacing">8</property>
30 <child>
31 <object class="HdyAvatar">
32 <property name="visible">True</property>
33 <property name="can-focus">False</property>
34 <property name="size">48</property>
35 </object>
36 <packing>
37 <property name="expand">False</property>
38 <property name="fill">True</property>
39 <property name="position">0</property>
40 </packing>
41 </child>
42 <child>
43 <object class="GtkBox">
44 <property name="visible">True</property>
45 <property name="can-focus">False</property>
46 <property name="orientation">vertical</property>
47 <property name="spacing">2</property>
48 <child>
49 <object class="GtkBox">
50 <property name="visible">True</property>
51 <property name="can-focus">False</property>
52 <property name="spacing">8</property>
53 <child>
54 <object class="GtkLabel">
55 <property name="visible">True</property>
56 <property name="can-focus">False</property>
57 <property name="label" translatable="yes">Chat title</property>
58 <property name="wrap">True</property>
59 <property name="wrap-mode">word-char</property>
60 <property name="ellipsize">end</property>
61 <property name="xalign">0</property>
62 </object>
63 <packing>
64 <property name="expand">False</property>
65 <property name="fill">True</property>
66 <property name="position">0</property>
67 </packing>
68 </child>
69 <child>
70 <object class="GtkLabel">
71 <property name="visible">True</property>
72 <property name="can-focus">False</property>
73 <property name="label" translatable="yes">11.12.13</property>
74 <property name="justify">right</property>
75 </object>
76 <packing>
77 <property name="expand">False</property>
78 <property name="fill">True</property>
79 <property name="pack-type">end</property>
80 <property name="position">1</property>
81 </packing>
82 </child>
83 </object>
84 <packing>
85 <property name="expand">False</property>
86 <property name="fill">True</property>
87 <property name="position">0</property>
88 </packing>
89 </child>
90 <child>
91 <object class="GtkLabel">
92 <property name="visible">True</property>
93 <property name="can-focus">False</property>
94 <property name="label" translatable="yes">My evil comment text is awesome! This is coming to the Pinephone which will be extremely awesome and this text may only cut some borders in certain areas!!!</property>
95 <property name="wrap">True</property>
96 <property name="wrap-mode">word-char</property>
97 <property name="ellipsize">end</property>
98 <property name="max-width-chars">48</property>
99 <property name="xalign">0</property>
100 </object>
101 <packing>
102 <property name="expand">True</property>
103 <property name="fill">True</property>
104 <property name="position">1</property>
105 </packing>
106 </child>
107 </object>
108 <packing>
109 <property name="expand">True</property>
110 <property name="fill">True</property>
111 <property name="pack-type">end</property>
112 <property name="position">1</property>
113 </packing>
114 </child>
115 <style>
116 <class name="chat-entry"/>
117 </style>
118 </object>
119</interface>
diff --git a/src/chat/messenger.c b/src/chat/messenger.c
index 2996af3..62b93e8 100644
--- a/src/chat/messenger.c
+++ b/src/chat/messenger.c
@@ -59,6 +59,8 @@ _chat_messenger_message(void *cls,
59 59
60 if (GNUNET_CHAT_KIND_LOGIN == GNUNET_CHAT_message_get_kind(message)) 60 if (GNUNET_CHAT_KIND_LOGIN == GNUNET_CHAT_message_get_kind(message))
61 application_call_event(app, event_update_profile); 61 application_call_event(app, event_update_profile);
62 else if (GNUNET_CHAT_KIND_TEXT == GNUNET_CHAT_message_get_kind(message))
63 printf("%s\n", GNUNET_CHAT_message_get_text(message));
62 64
63 return GNUNET_YES; 65 return GNUNET_YES;
64} 66}
diff --git a/src/event.c b/src/event.c
index 851536f..e04fe5c 100644
--- a/src/event.c
+++ b/src/event.c
@@ -24,16 +24,73 @@
24 24
25#include "event.h" 25#include "event.h"
26 26
27#include "ui/chat_entry.h"
28
29static int
30_iterate_profile_contacts(void *cls,
31 UNUSED struct GNUNET_CHAT_Handle *handle,
32 UNUSED struct GNUNET_CHAT_Contact *contact)
33{
34 MESSENGER_Application *app = (MESSENGER_Application*) cls;
35
36 UI_MESSENGER_Handle *ui = &(app->ui.messenger);
37
38 UI_CHAT_ENTRY_Handle *entry = ui_chat_entry_new();
39
40 gtk_container_add(GTK_CONTAINER(ui->chats_listbox), entry->entry_box);
41
42 g_free(entry); //TODO: add to a list or similar?
43
44 return GNUNET_YES;
45}
46
47static int
48_iterate_profile_groups(void *cls,
49 UNUSED struct GNUNET_CHAT_Handle *handle,
50 UNUSED struct GNUNET_CHAT_Group *group)
51{
52 MESSENGER_Application *app = (MESSENGER_Application*) cls;
53
54 UI_MESSENGER_Handle *ui = &(app->ui.messenger);
55
56 UI_CHAT_ENTRY_Handle *entry = ui_chat_entry_new();
57
58 gtk_container_add(GTK_CONTAINER(ui->chats_listbox), entry->entry_box);
59
60 g_free(entry); //TODO: add to a list or similar?
61
62 return GNUNET_YES;
63}
64
65static void
66_clear_each_widget(GtkWidget *widget,
67 gpointer user_data)
68{
69 GtkContainer *container = GTK_CONTAINER(user_data);
70
71 gtk_container_remove(container, widget);
72}
73
27void 74void
28event_update_profile(MESSENGER_Application *app) 75event_update_profile(MESSENGER_Application *app)
29{ 76{
30 UI_MESSENGER_Handle* ui = &(app->ui.messenger); 77 UI_MESSENGER_Handle *ui = &(app->ui.messenger);
78 CHAT_MESSENGER_Handle *chat = &(app->chat.messenger);
31 79
32 const char *name = GNUNET_CHAT_get_name(app->chat.messenger.handle); 80 const char *name = GNUNET_CHAT_get_name(chat->handle);
33 81
34 if (name) 82 if (name)
35 { 83 {
36 hdy_avatar_set_text(ui->profile_avatar, name); 84 hdy_avatar_set_text(ui->profile_avatar, name);
37 gtk_label_set_text(ui->profile_label, name); 85 gtk_label_set_text(ui->profile_label, name);
38 } 86 }
87
88 gtk_container_foreach(
89 GTK_CONTAINER(ui->chats_listbox),
90 _clear_each_widget,
91 ui->chats_listbox
92 );
93
94 GNUNET_CHAT_iterate_contacts(chat->handle, _iterate_profile_contacts, app);
95 GNUNET_CHAT_iterate_groups(chat->handle, _iterate_profile_groups, app);
39} 96}
diff --git a/src/ui/chat_entry.c b/src/ui/chat_entry.c
new file mode 100644
index 0000000..5ff7063
--- /dev/null
+++ b/src/ui/chat_entry.c
@@ -0,0 +1,55 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2021 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
20/*
21 * @author Tobias Frisch
22 * @file ui/chat_entry.c
23 */
24
25#include "chat_entry.h"
26
27UI_CHAT_ENTRY_Handle*
28ui_chat_entry_new(void)
29{
30 UI_CHAT_ENTRY_Handle* handle = g_malloc(sizeof(UI_CHAT_ENTRY_Handle));
31
32 GtkBuilder* builder = gtk_builder_new_from_file("resources/ui/chat_entry.ui");
33
34 handle->entry_box = GTK_WIDGET(
35 gtk_builder_get_object(builder, "entry_box")
36 );
37
38 handle->avatar = HDY_AVATAR(
39 gtk_builder_get_object(builder, "avatar")
40 );
41
42 handle->title = GTK_LABEL(
43 gtk_builder_get_object(builder, "title")
44 );
45
46 handle->timestamp = GTK_LABEL(
47 gtk_builder_get_object(builder, "timestamp")
48 );
49
50 handle->text = GTK_LABEL(
51 gtk_builder_get_object(builder, "text")
52 );
53
54 return handle;
55}
diff --git a/src/ui/chat_entry.h b/src/ui/chat_entry.h
new file mode 100644
index 0000000..48f2fb7
--- /dev/null
+++ b/src/ui/chat_entry.h
@@ -0,0 +1,48 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2021 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
20/*
21 * @author Tobias Frisch
22 * @file ui/chat_entry.h
23 */
24
25#ifndef UI_CHAT_ENTRY_H_
26#define UI_CHAT_ENTRY_H_
27
28#include <gtk-3.0/gtk/gtk.h>
29#include <libhandy-1/handy.h>
30
31typedef struct MESSENGER_Application MESSENGER_Application;
32
33typedef struct UI_CHAT_ENTRY_Handle
34{
35 GtkWidget* entry_box;
36
37 HdyAvatar* avatar;
38
39 GtkLabel* title;
40 GtkLabel* timestamp;
41
42 GtkLabel* text;
43} UI_CHAT_ENTRY_Handle;
44
45UI_CHAT_ENTRY_Handle*
46ui_chat_entry_new(void);
47
48#endif /* UI_CHAT_ENTRY_H_ */
diff --git a/src/ui/messenger.c b/src/ui/messenger.c
index ebfde36..46ee362 100644
--- a/src/ui/messenger.c
+++ b/src/ui/messenger.c
@@ -92,12 +92,7 @@ void
92ui_messenger_init(MESSENGER_Application *app, 92ui_messenger_init(MESSENGER_Application *app,
93 UI_MESSENGER_Handle *handle) 93 UI_MESSENGER_Handle *handle)
94{ 94{
95 GtkBuilder* builder = gtk_builder_new(); 95 GtkBuilder* builder = gtk_builder_new_from_file("resources/ui/messenger.ui");
96 gtk_builder_add_from_file(
97 builder,
98 "resources/ui/messenger.ui",
99 NULL
100 );
101 96
102 handle->main_window = GTK_APPLICATION_WINDOW( 97 handle->main_window = GTK_APPLICATION_WINDOW(
103 gtk_builder_get_object(builder, "main_window") 98 gtk_builder_get_object(builder, "main_window")