wip: threading, window, etc.

This commit is contained in:
Gergely Polonkai 2018-12-29 07:40:52 +01:00
parent b960a591cb
commit 661867e0ba
12 changed files with 211 additions and 10 deletions

View File

@ -0,0 +1,7 @@
[Desktop Entry]
Name=SSB-GTK+
Exec=ssb-gtk
Terminal=false
Type=Application
Categories=GTK;
StartupNotify=true

19
data/meson.build Normal file
View File

@ -0,0 +1,19 @@
ssb_resources = gnome.compile_resources(
'ssb-resources',
join_paths('resources', 'eu.polonkai.gergely.SsbGtk.gresource.xml'),
source_dir: 'resources',
c_name: 'ssb')
desktop_file = i18n.merge_file(
input: 'eu.polonkai.gergely.SsbGtk.desktop.in',
output: 'eu.polonkai.gergely.SsbGtk.desktop',
type: 'desktop',
po_dir: '../po',
install: true,
install_dir: join_paths(get_option('datadir'), 'applications'))
desktop_utils = find_program('desktop-file-validate', required: false)
if desktop_utils.found()
test('Validate desktop file', desktop_utils,
args: [desktop_file])
endif

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<gresources>
<gresource prefix="/eu/polonkai/gergely/SsbGtk">
<file>ui/ssb-window.ui</file>
</gresource>
</gresources>

View File

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<template class="SsbWindow" parent="GtkApplicationWindow">
<property name="can_focus">False</property>
<child type="titlebar">
<object class="GtkHeaderBar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="title" translatable="yes">Secure Scuttlebutt</property>
<property name="show_close_button">True</property>
</object>
</child>
<child>
<object class="GtkGrid">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkListBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="GtkListBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">0</property>
</packing>
</child>
</object>
</child>
</template>
</interface>

View File

@ -1,9 +1,13 @@
project('ssb-gtk', 'c', version: '0.0.1') project('ssb-gtk', 'c', version: '0.0.1')
gnome = import('gnome')
i18n = import('i18n')
glib_required = '>= 2.40' glib_required = '>= 2.40'
gtk_required = '>= 3.20' gtk_required = '>= 3.20'
glib = dependency('glib-2.0', version: glib_required) glib = dependency('glib-2.0', version: glib_required)
gtk = dependency('gtk+-3.0', version: gtk_required) gtk = dependency('gtk+-3.0', version: gtk_required)
subdir('data')
subdir('ssb-gtk') subdir('ssb-gtk')

0
po/LINGUAS Normal file
View File

View File

@ -1,8 +1,10 @@
sources = [ sources = [
'main.c', 'main.c',
'ssb-app.c', 'ssb-app.c',
'ssb-window.c',
'sbot.c',
] ]
executable('ssb-gtk', sources, executable('ssb-gtk', sources, ssb_resources,
dependencies: [glib, gtk], dependencies: [glib, gtk],
install: true) install: true)

22
ssb-gtk/sbot.c Normal file
View File

@ -0,0 +1,22 @@
#include <glib.h>
gboolean do_scuttling = TRUE;
gpointer
scuttle(gchar *ssb_dir)
{
gchar *config_file = g_strdup_printf("%s/config", ssb_dir);
g_print("Read config file %s\n", config_file);
g_free(config_file);
g_print("Starting scuttle\n");
while (do_scuttling) {
g_usleep(G_USEC_PER_SEC);
g_print("Scuttle…\n");
}
g_print("Scuttling stopped\n");
return NULL;
}

10
ssb-gtk/sbot.h Normal file
View File

@ -0,0 +1,10 @@
#ifndef __SBOT_H__
# define __SBOT_H__
# include <glib.h>
extern gboolean do_scuttling;
gpointer scuttle(gchar *ssb_dir);
#endif /* __SBOT_H__ */

View File

@ -1,9 +1,13 @@
#include "ssb-app.h" #include "ssb-app.h"
#include "ssb-window.h"
#include "sbot.h"
struct _SsbApp { struct _SsbApp {
GtkApplication parent_instance; GtkApplication parent_instance;
gchar *ssb_dir; gchar *ssb_dir;
SsbWindow *window;
GThread *scuttle_thread;
}; };
G_DEFINE_TYPE(SsbApp, ssb_app, GTK_TYPE_APPLICATION); G_DEFINE_TYPE(SsbApp, ssb_app, GTK_TYPE_APPLICATION);
@ -18,7 +22,7 @@ static GOptionEntry entries[] = {
{"socket", 'u', 0, G_OPTION_ARG_FILENAME, NULL, "Unix socket path to connect to instead of a TCP socket. Conflicts with -s and -p", "PATH"}, {"socket", 'u', 0, G_OPTION_ARG_FILENAME, NULL, "Unix socket path to connect to instead of a TCP socket. Conflicts with -s and -p", "PATH"},
{"key", 'k', 0, G_OPTION_ARG_STRING, NULL, "The key to connect to. Default is your public key as read from the private key file", "KEY"}, {"key", 'k', 0, G_OPTION_ARG_STRING, NULL, "The key to connect to. Default is your public key as read from the private key file", "KEY"},
{"keypair-seed", 'K', 0, G_OPTION_ARG_STRING, NULL, "Private key seed to use for the secret handshake. Default is to use the private key from your privace key file.", "SEED"}, {"keypair-seed", 'K', 0, G_OPTION_ARG_STRING, NULL, "Private key seed to use for the secret handshake. Default is to use the private key from your privace key file.", "SEED"},
{"version", 'v', NULL, } {"version", 'v', 0, G_OPTION_ARG_NONE, NULL, "Print version information and exit", NULL},
{NULL} {NULL}
}; };
@ -29,7 +33,7 @@ print_version(void) {
} }
static int static int
local_options(GApplication *app, GVriantDict *options, gpointer user_data) local_options(GApplication *app, GVariantDict *options, gpointer user_data)
{ {
gboolean version = FALSE; gboolean version = FALSE;
@ -64,27 +68,58 @@ ssb_app_finalize(GObject *gobject)
SsbApp *app = SSB_APP(gobject); SsbApp *app = SSB_APP(gobject);
app->ssb_dir = (g_free(app->ssb_dir), NULL); app->ssb_dir = (g_free(app->ssb_dir), NULL);
G_OBJECT_CLASS(ssb_app_parent_class)->finalize(gobject);
} }
static void static void
ssb_app_startup(GApplication *app) ssb_app_dispose(GObject *gobject)
{ {
G_APPLICATION_CLASS(ssb_app_parent_class)->startup(app); SsbApp *app = SSB_APP(gobject);
g_print("Starting up!\n");
g_clear_object(&(app->window));
G_OBJECT_CLASS(ssb_app_parent_class)->dispose(gobject);
}
static void
ssb_app_startup(GApplication *gapp)
{
SsbApp *app = SSB_APP(gapp);
G_APPLICATION_CLASS(ssb_app_parent_class)->startup(gapp);
if (app->scuttle_thread == NULL) {
app->scuttle_thread = g_thread_new("scuttler", (GThreadFunc)scuttle, app->ssb_dir);
}
}
static SsbWindow *
ssb_app_get_or_create_window(SsbApp *app)
{
SsbWindow *window = ssb_window_new(app);
return window;
} }
static void static void
ssb_app_activate(GApplication *app) ssb_app_activate(GApplication *app)
{ {
G_APPLICATION_CLASS(ssb_app_parent_class)->activate(app); G_APPLICATION_CLASS(ssb_app_parent_class)->activate(app);
g_print("Activate!\n");
SsbWindow *window = ssb_app_get_or_create_window(SSB_APP(app));
gtk_window_present(GTK_WINDOW(window));
} }
static void static void
ssb_app_shutdown(GApplication *app) ssb_app_shutdown(GApplication *gapp)
{ {
g_print("Shutting down…\n"); SsbApp *app = SSB_APP(gapp);
G_APPLICATION_CLASS(ssb_app_parent_class)->shutdown(app);
do_scuttling = FALSE;
(void)g_thread_join(app->scuttle_thread);
G_APPLICATION_CLASS(ssb_app_parent_class)->shutdown(gapp);
} }
static void static void
@ -94,6 +129,8 @@ ssb_app_init(SsbApp *app)
const gchar *app_dir_path = g_environ_getenv(envp, "ssb_path"); const gchar *app_dir_path = g_environ_getenv(envp, "ssb_path");
app->ssb_dir = NULL; app->ssb_dir = NULL;
app->window = NULL;
app->scuttle_thread = NULL;
if (app_dir_path != NULL) { if (app_dir_path != NULL) {
app->ssb_dir = g_strdup(app_dir_path); app->ssb_dir = g_strdup(app_dir_path);
@ -124,6 +161,7 @@ ssb_app_class_init(SsbAppClass *klass)
GApplicationClass *app_class = G_APPLICATION_CLASS(klass); GApplicationClass *app_class = G_APPLICATION_CLASS(klass);
gobject_class->finalize = ssb_app_finalize; gobject_class->finalize = ssb_app_finalize;
gobject_class->dispose = ssb_app_dispose;
app_class->activate = ssb_app_activate; app_class->activate = ssb_app_activate;
app_class->startup = ssb_app_startup; app_class->startup = ssb_app_startup;
app_class->shutdown = ssb_app_shutdown; app_class->shutdown = ssb_app_shutdown;

32
ssb-gtk/ssb-window.c Normal file
View File

@ -0,0 +1,32 @@
#include "ssb-window.h"\
struct _SsbWindow {
GtkApplicationWindow parent_instance;
};
G_DEFINE_TYPE(SsbWindow, ssb_window, GTK_TYPE_APPLICATION_WINDOW);
SsbWindow *
ssb_window_new(SsbApp *app)
{
SsbWindow *window = g_object_new(SSB_TYPE_WINDOW, NULL);
gtk_window_set_application(GTK_WINDOW(window), GTK_APPLICATION(app));
gtk_window_set_icon_name(GTK_WINDOW(window), "ssb-gtk");
return window;
}
static void
ssb_window_init(SsbWindow *window)
{
gtk_widget_init_template(GTK_WIDGET(window));
}
static void
ssb_window_class_init(SsbWindowClass *klass)
{
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
gtk_widget_class_set_template_from_resource(widget_class, "/eu/polonkai/gergely/SsbGtk/ui/ssb-window.ui");
}

19
ssb-gtk/ssb-window.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef __SSB_WINDOW_H__
# define __SSB_WINDOW_H__
# include <glib-object.h>
# include <gtk/gtk.h>
# include "ssb-app.h"
#define SSB_TYPE_WINDOW ssb_window_get_type()
G_DECLARE_FINAL_TYPE(SsbWindow, ssb_window, SSB, WINDOW, GtkApplicationWindow)
G_BEGIN_DECLS
SsbWindow *ssb_window_new(SsbApp *app);
G_END_DECLS
#endif /* __SSB_WINDOW_H__ */