Root/eeshow/gui/help.c

1/*
2 * gui/help.c - Online help
3 *
4 * Written 2016 by Werner Almesberger
5 * Copyright 2016 by Werner Almesberger
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 */
12
13#include <stdbool.h>
14
15#include <gtk/gtk.h>
16
17#ifdef USE_WEBKIT
18#include <webkit2/webkit2.h>
19#endif
20
21#include "gui/help.h"
22
23
24static GtkWidget *window = NULL;
25static bool visible;
26
27
28static void destroy_help(GtkWidget *object, gpointer user_data)
29{
30    gtk_widget_destroy(window);
31    window = NULL;
32}
33
34
35static gboolean key_press_event(GtkWidget *widget, GdkEventKey *event,
36    gpointer data)
37{
38    switch (event->keyval) {
39    case GDK_KEY_h:
40    case GDK_KEY_q:
41    case GDK_KEY_Escape:
42        gtk_widget_hide(window);
43        visible = 0;
44        break;
45    }
46    return TRUE;
47}
48
49
50#ifdef USE_WEBKIT
51
52static GtkWidget *help_content(void)
53{
54    GtkWidget *view;
55    WebKitSettings *settings;
56
57    view = webkit_web_view_new();
58
59    settings = webkit_web_view_get_settings(WEBKIT_WEB_VIEW(view));
60    webkit_settings_set_default_font_size(settings, 10);
61
62    webkit_web_view_load_html(WEBKIT_WEB_VIEW(view),
63#include "../help.inc"
64    , NULL);
65
66    return view;
67}
68
69#else /* USE_WEBKIT */
70
71static GtkWidget *help_content(void)
72{
73    GtkWidget *scroll, *label;
74
75    scroll = gtk_scrolled_window_new(NULL, NULL);
76    label = gtk_label_new(NULL);
77
78    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll),
79            GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
80
81    gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
82    gtk_label_set_markup(GTK_LABEL(label),
83#include "../help.inc"
84        );
85
86    gtk_container_add(GTK_CONTAINER(scroll), label);
87
88    return scroll;
89}
90
91#endif /* !USE_WEBKIT */
92
93
94static void new_help_window(void)
95{
96    GtkWidget *content;
97
98    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
99    content = help_content();
100
101    gtk_container_add(GTK_CONTAINER(window), content);
102    gtk_window_set_default_size(GTK_WINDOW(window), 480, 360);
103    gtk_widget_show_all(window);
104
105    gtk_widget_set_can_focus(content, TRUE);
106    gtk_widget_add_events(content, GDK_KEY_PRESS_MASK);
107
108    g_signal_connect(G_OBJECT(content), "key_press_event",
109        G_CALLBACK(key_press_event), NULL);
110    g_signal_connect(window, "destroy", G_CALLBACK(destroy_help), NULL);
111
112    gtk_widget_show_all(window);
113}
114
115
116void help(void)
117{
118    if (!window) {
119        new_help_window();
120        visible = 1;
121    } else {
122        visible = !visible;
123        if (visible)
124            gtk_widget_show(window);
125        else
126            gtk_widget_hide(window);
127    }
128}
129

Archive Download this file

Branches:
master



interactive