2
* nvidia-settings: A tool for configuring the NVIDIA X driver on Unix
5
* Copyright (C) 2004 NVIDIA Corporation.
7
* This program is free software; you can redistribute it and/or
8
* modify it under the terms of Version 2 of the GNU General Public
9
* License as published by the Free Software Foundation.
11
* This program is distributed in the hope that it will be useful, but
12
* WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See Version 2
14
* of the GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the:
19
* Free Software Foundation, Inc.
20
* 59 Temple Place - Suite 330
21
* Boston, MA 02111-1307, USA
29
#include "ctkconstants.h"
31
#include "help_banner.h"
35
static GtkTextTagTable *create_tag_table(void);
36
static GtkTextBuffer *create_default_help(CtkHelp *ctk_help);
37
static void close_button_clicked(GtkButton *button, gpointer user_data);
38
static gboolean window_destroy(GtkWidget *widget, GdkEvent *event,
43
GType ctk_help_get_type(
47
static GType ctk_help_type = 0;
50
static const GTypeInfo ctk_help_info = {
51
sizeof (CtkHelpClass),
53
NULL, /* base_finalize */
54
NULL, /* class_init */
55
NULL, /* class_finalize */
56
NULL, /* class_data */
59
NULL, /* instance_init */
62
ctk_help_type = g_type_register_static
63
(GTK_TYPE_WINDOW, "CtkHelp", &ctk_help_info, 0);
69
GtkWidget* ctk_help_new(GtkWidget *toggle_button)
73
GtkWidget *vbox, *hbox;
74
GtkWidget *hseparator;
82
guint8 *image_buffer = NULL;
83
const nv_image_t *img;
85
object = g_object_new(CTK_TYPE_HELP, NULL);
87
ctk_help = CTK_HELP(object);
89
ctk_help->toggle_button = toggle_button;
91
gtk_window_set_title(GTK_WINDOW(ctk_help),
92
"NVIDIA X Server Settings Help");
94
gtk_window_set_default_size(GTK_WINDOW(ctk_help), -1, 400);
96
gtk_container_set_border_width(GTK_CONTAINER(ctk_help), CTK_WINDOW_PAD);
98
vbox = gtk_vbox_new(FALSE, 5);
99
gtk_container_add(GTK_CONTAINER(ctk_help), vbox);
101
/* create the banner */
103
hbox = gtk_hbox_new(FALSE, 0);
104
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
106
frame = gtk_frame_new(NULL);
107
gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, FALSE, 0);
109
gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN);
111
img = &help_banner_image;
113
image_buffer = decompress_image_data(img);
115
image = gtk_image_new_from_pixbuf
116
(gdk_pixbuf_new_from_data(image_buffer, GDK_COLORSPACE_RGB,
117
FALSE, 8, img->width, img->height,
118
img->width * img->bytes_per_pixel,
119
free_decompressed_image, NULL));
121
gtk_container_add(GTK_CONTAINER(frame), image);
123
/* create the scroll window to hold the text viewer */
125
frame = gtk_frame_new(NULL);
126
gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0);
128
gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN);
130
sw = gtk_scrolled_window_new(NULL, NULL);
132
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw),
133
GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
135
gtk_container_add(GTK_CONTAINER(frame), sw);
137
/* create the text viewer */
139
textview = gtk_text_view_new();
140
gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(textview), FALSE);
141
gtk_text_view_set_editable(GTK_TEXT_VIEW(textview), FALSE);
142
ctk_help->text_viewer = textview;
143
gtk_container_add(GTK_CONTAINER(sw), ctk_help->text_viewer);
145
g_object_set(G_OBJECT(ctk_help->text_viewer),
146
"pixels-inside-wrap", 10, NULL);
148
/* create the tag table */
150
ctk_help->tag_table = create_tag_table();
152
/* create the default help text */
154
ctk_help->default_help = create_default_help(ctk_help);
155
gtk_text_view_set_buffer
156
(GTK_TEXT_VIEW(ctk_help->text_viewer), ctk_help->default_help);
158
/* place a horizontal separator */
160
hseparator = gtk_hseparator_new();
161
gtk_box_pack_start(GTK_BOX(vbox), hseparator, FALSE, FALSE, 0);
163
/* create and place the close button */
165
hbox = gtk_hbox_new(FALSE, 5);
167
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
169
button = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
171
alignment = gtk_alignment_new(1, 1, 0, 0);
172
gtk_container_add(GTK_CONTAINER(alignment), button);
173
gtk_box_pack_start(GTK_BOX(hbox), alignment, TRUE, TRUE, 0);
175
g_signal_connect(G_OBJECT(button), "clicked",
176
G_CALLBACK(close_button_clicked),
177
(gpointer) ctk_help);
179
/* handle destructive events to the window */
181
g_signal_connect(G_OBJECT(ctk_help), "destroy-event",
182
G_CALLBACK(window_destroy), (gpointer) ctk_help);
183
g_signal_connect(G_OBJECT(ctk_help), "delete-event",
184
G_CALLBACK(window_destroy), (gpointer) ctk_help);
186
return GTK_WIDGET(ctk_help);
189
void ctk_help_set_page(CtkHelp *ctk_help, GtkTextBuffer *buffer)
199
b = ctk_help->default_help;
202
view = GTK_TEXT_VIEW(ctk_help->text_viewer);
204
/* set the buffer in the TextView */
206
gtk_text_view_set_buffer(view, b);
208
/* ensure that the top of the buffer is displayed */
210
gtk_text_buffer_get_start_iter(b, &iter);
211
mark = gtk_text_buffer_create_mark(b, NULL, &iter, TRUE);
212
gtk_text_view_scroll_to_mark(view, mark, 0.0, TRUE, 0.0, 0.0);
213
gtk_text_buffer_place_cursor(b, &iter);
217
static GtkTextBuffer *create_default_help(CtkHelp *ctk_help)
219
GtkTextIter iter, start, end;
220
GtkTextBuffer *buffer;
222
buffer = gtk_text_buffer_new(ctk_help->tag_table);
224
gtk_text_buffer_get_iter_at_offset(buffer, &iter, 0);
226
gtk_text_buffer_insert_with_tags_by_name
227
(buffer, &iter, "\nNVIDIA X Server Settings Help", -1,
228
CTK_HELP_TITLE_TAG, NULL);
230
gtk_text_buffer_insert(buffer, &iter, "\n\nThere is no help available "
231
"for this page.", -1);
234
* Apply CTK_HELP_HEADING_NOT_EDITABLE_TAG and
235
* CTK_HELP_WORD_WRAP_TAG to the whole buffer
238
gtk_text_buffer_get_bounds(buffer, &start, &end);
239
gtk_text_buffer_apply_tag_by_name
240
(buffer, CTK_HELP_HEADING_NOT_EDITABLE_TAG, &start, &end);
241
gtk_text_buffer_apply_tag_by_name
242
(buffer, CTK_HELP_WORD_WRAP_TAG, &start, &end);
243
gtk_text_buffer_apply_tag_by_name
244
(buffer, CTK_HELP_MARGIN_TAG, &start, &end);
250
static GtkTextTagTable *create_tag_table(void)
252
GtkTextTagTable *table;
255
table = gtk_text_tag_table_new();
257
/* CTK_HELP_TITLE_TAG */
259
tag = gtk_text_tag_new(CTK_HELP_TITLE_TAG);
261
g_object_set(G_OBJECT(tag),
262
"weight", PANGO_WEIGHT_BOLD,
263
"size", 15 * PANGO_SCALE,
266
gtk_text_tag_table_add(table, tag);
268
/* CTK_HELP_HEADING_TAG */
270
tag = gtk_text_tag_new(CTK_HELP_HEADING_TAG);
272
g_object_set(G_OBJECT(tag),
273
"weight", PANGO_WEIGHT_BOLD,
274
"size", 12 * PANGO_SCALE,
277
gtk_text_tag_table_add(table, tag);
279
/* CTK_HELP_HEADING_NOT_EDITABLE */
281
tag = gtk_text_tag_new(CTK_HELP_HEADING_NOT_EDITABLE_TAG);
283
g_object_set(G_OBJECT(tag), "editable", FALSE, NULL);
285
gtk_text_tag_table_add(table, tag);
287
/* CTK_HELP_WORD_WRAP_TAG */
289
tag = gtk_text_tag_new(CTK_HELP_WORD_WRAP_TAG);
291
g_object_set(G_OBJECT(tag), "wrap_mode", GTK_WRAP_WORD, NULL);
293
gtk_text_tag_table_add(table, tag);
295
/* CTK_HELP_MARGIN_TAG */
297
tag = gtk_text_tag_new(CTK_HELP_MARGIN_TAG);
299
g_object_set(G_OBJECT(tag), "left_margin", 10, "right_margin", 10, NULL);
301
gtk_text_tag_table_add(table, tag);
303
/* CTK_HELP_SINGLE_SPACE_TAG */
305
tag = gtk_text_tag_new(CTK_HELP_SINGLE_SPACE_TAG);
307
g_object_set(G_OBJECT(tag), "pixels_inside_wrap", 0, NULL);
309
gtk_text_tag_table_add(table, tag);
311
/* CTK_HELP_BOLD_TAG */
313
tag = gtk_text_tag_new(CTK_HELP_BOLD_TAG);
315
g_object_set(G_OBJECT(tag), "weight", PANGO_WEIGHT_BOLD, NULL);
317
gtk_text_tag_table_add(table, tag);
324
static void close_button_clicked(GtkButton *button, gpointer user_data)
326
CtkHelp *ctk_help = CTK_HELP(user_data);
328
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ctk_help->toggle_button),
331
} /* close_button_clicked() */
334
static gboolean window_destroy(GtkWidget *widget, GdkEvent *event,
337
CtkHelp *ctk_help = CTK_HELP(user_data);
339
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ctk_help->toggle_button),
346
/*****************************************************************************/
349
* Utility functions for building a help GtkTextBuffer.
352
void ctk_help_title(GtkTextBuffer *buffer, GtkTextIter *iter,
353
const gchar *fmt, ...)
359
a = nv_build_vararg_string(fmt, ap);
362
b = g_strconcat("\n", a, "\n", NULL);
364
gtk_text_buffer_insert_with_tags_by_name(buffer, iter, b, -1,
365
CTK_HELP_TITLE_TAG, NULL);
370
void ctk_help_para(GtkTextBuffer *buffer, GtkTextIter *iter,
371
const gchar *fmt, ...)
377
a = nv_build_vararg_string(fmt, ap);
380
b = g_strconcat("\n", a, "\n", NULL);
382
gtk_text_buffer_insert(buffer, iter, b, -1);
388
void ctk_help_heading(GtkTextBuffer *buffer, GtkTextIter *iter,
389
const gchar *fmt, ...)
395
a = nv_build_vararg_string(fmt, ap);
398
b = g_strconcat("\n", a, "\n", NULL);
400
gtk_text_buffer_insert_with_tags_by_name(buffer, iter, b, -1,
401
CTK_HELP_HEADING_TAG, NULL);
406
void ctk_help_term(GtkTextBuffer *buffer, GtkTextIter *iter,
407
const gchar *fmt, ...)
413
a = nv_build_vararg_string(fmt, ap);
416
b = g_strconcat("\n", a, NULL);
418
gtk_text_buffer_insert_with_tags_by_name(buffer, iter, b, -1,
419
CTK_HELP_BOLD_TAG, NULL);
424
void ctk_help_finish(GtkTextBuffer *buffer)
426
GtkTextIter start, end;
428
gtk_text_buffer_get_bounds(buffer, &start, &end);
430
gtk_text_buffer_apply_tag_by_name
431
(buffer, CTK_HELP_HEADING_NOT_EDITABLE_TAG, &start, &end);
432
gtk_text_buffer_apply_tag_by_name
433
(buffer, CTK_HELP_WORD_WRAP_TAG, &start, &end);
434
gtk_text_buffer_apply_tag_by_name
435
(buffer, CTK_HELP_MARGIN_TAG, &start, &end);
436
gtk_text_buffer_apply_tag_by_name
437
(buffer, CTK_HELP_SINGLE_SPACE_TAG, &start, &end);