aboutsummaryrefslogtreecommitdiff
path: root/src/slide_window.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/slide_window.c')
-rw-r--r--src/slide_window.c80
1 files changed, 39 insertions, 41 deletions
diff --git a/src/slide_window.c b/src/slide_window.c
index c4aa948..7904f6e 100644
--- a/src/slide_window.c
+++ b/src/slide_window.c
@@ -45,15 +45,7 @@
#include "narrative_window.h"
-struct _slidewindow
-{
- GtkWidget *window;
- Narrative *n;
- Slide *slide;
- GtkWidget *sv;
- NarrativeWindow *parent;
-};
-
+G_DEFINE_TYPE_WITH_CODE(SlideWindow, gtk_slide_window, GTK_TYPE_APPLICATION_WINDOW, NULL)
static void insert_slidetitle_sig(GSimpleAction *action, GVariant *parameter,
gpointer vp)
@@ -278,13 +270,6 @@ static void last_slide_sig(GSimpleAction *action, GVariant *parameter,
}
-static gboolean sw_close_sig(GtkWidget *w, SlideWindow *sw)
-{
- narrative_window_sw_closed(sw->parent, sw);
- return FALSE;
-}
-
-
static gboolean sw_key_press_sig(GtkWidget *da, GdkEventKey *event,
SlideWindow *sw)
{
@@ -307,13 +292,20 @@ static gboolean sw_key_press_sig(GtkWidget *da, GdkEventKey *event,
static void sw_about_sig(GSimpleAction *action, GVariant *parameter, gpointer vp)
{
SlideWindow *sw = vp;
- open_about_dialog(sw->window);
+ open_about_dialog(GTK_WIDGET(sw));
+}
+
+static void sw_save_sig(GSimpleAction *action, GVariant *parameter, gpointer vp)
+{
+ SlideWindow *sw = vp;
+ g_action_group_activate_action(G_ACTION_GROUP(sw->parent), "save", parameter);
}
GActionEntry sw_entries[] = {
{ "about", sw_about_sig, NULL, NULL, NULL },
+ { "save", sw_save_sig, NULL, NULL, NULL },
{ "paste", paste_sig, NULL, NULL, NULL },
{ "copyframe", copy_frame_sig, NULL, NULL, NULL },
{ "deleteframe", delete_frame_sig, NULL, NULL, NULL },
@@ -327,45 +319,57 @@ GActionEntry sw_entries[] = {
};
-SlideWindow *slide_window_open(Narrative *n, Slide *slide,
- NarrativeWindow *nw, GApplication *papp)
+static void sw_emit_change_sig(GtkWidget *sv, SlideWindow *sw)
+{
+ g_signal_emit_by_name(sw, "changed");
+}
+
+
+static void gtk_slide_window_class_init(SlideWindowClass *klass)
+{
+ g_signal_new("changed", GTK_TYPE_SLIDE_WINDOW, G_SIGNAL_RUN_LAST, 0,
+ NULL, NULL, NULL, G_TYPE_NONE, 0);
+}
+
+
+static void gtk_slide_window_init(SlideWindow *sw)
+{
+}
+
+
+SlideWindow *slide_window_new(Narrative *n, Slide *slide,
+ NarrativeWindow *nw, GApplication *papp)
{
- GtkWidget *window;
SlideWindow *sw;
double w, h;
Colloquium *app = COLLOQUIUM(papp);
- sw = calloc(1, sizeof(SlideWindow));
- if ( sw == NULL ) return NULL;
+ sw = g_object_new(GTK_TYPE_SLIDE_WINDOW, "application", app, NULL);
+ gtk_window_set_role(GTK_WINDOW(sw), "slide");
- window = gtk_application_window_new(GTK_APPLICATION(app));
- gtk_window_set_role(GTK_WINDOW(window), "slide");
- sw->window = window;
sw->n = n;
sw->slide = slide;
sw->parent = nw;
slide_window_update_titlebar(sw);
- g_action_map_add_action_entries(G_ACTION_MAP(window), sw_entries,
+ g_action_map_add_action_entries(G_ACTION_MAP(sw), sw_entries,
G_N_ELEMENTS(sw_entries), sw);
- g_signal_connect(G_OBJECT(window), "destroy",
- G_CALLBACK(sw_close_sig), sw);
-
sw->sv = gtk_slide_view_new(n, slide);
g_signal_connect(G_OBJECT(sw->sv), "key-press-event",
G_CALLBACK(sw_key_press_sig), sw);
- slide_get_logical_size(slide, narrative_get_stylesheet(n), &w, &h);
- gtk_window_set_default_size(GTK_WINDOW(window), w, h);
+ g_signal_connect(G_OBJECT(sw->sv), "changed",
+ G_CALLBACK(sw_emit_change_sig), sw);
- gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(sw->sv));
+ slide_get_logical_size(slide, narrative_get_stylesheet(n), &w, &h);
+ gtk_window_set_default_size(GTK_WINDOW(sw), w, h);
- gtk_window_set_resizable(GTK_WINDOW(sw->window), TRUE);
+ gtk_container_add(GTK_CONTAINER(sw), GTK_WIDGET(sw->sv));
- gtk_widget_show_all(window);
+ gtk_window_set_resizable(GTK_WINDOW(sw), TRUE);
return sw;
}
@@ -390,11 +394,5 @@ void slide_window_update_titlebar(SlideWindow *sw)
1+narrative_get_slide_number_for_slide(sw->n, sw->slide));
if ( narrative_get_unsaved(sw->n) ) strcat(title, " *");
- gtk_window_set_title(GTK_WINDOW(sw->window), title);
-}
-
-
-void slide_window_destroy(SlideWindow *sw)
-{
- gtk_widget_destroy(sw->window);
+ gtk_window_set_title(GTK_WINDOW(sw), title);
}