4
* Copyright (C) 2006 Anthony Liguori <anthony@codemonkey.ws>
6
* This library is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU Lesser General Public
8
* License as published by the Free Software Foundation; either
9
* version 2.0 of the License, or (at your option) any later version.
11
* This library is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* Lesser General Public License for more details.
16
* You should have received a copy of the GNU Lesser General Public
17
* License along with this library; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23
#include <vncdisplay.h>
25
#ifdef HAVE_PULSEAUDIO
26
#include <vncaudiopulse.h>
29
#include <gdk/gdkkeysyms.h>
35
#include <libview/autoDrawer.h>
39
#define GDK_Return GDK_KEY_Return
42
#define GDK_Escape GDK_KEY_Escape
45
#define GDK_BackSpace GDK_KEY_BackSpace
48
#define GDK_Delete GDK_KEY_Delete
51
#define GDK_Control_L GDK_KEY_Control_L
54
#define GDK_Alt_L GDK_KEY_Alt_L
57
#define GDK_F1 GDK_KEY_F1
60
#define GDK_F2 GDK_KEY_F2
63
#define GDK_F3 GDK_KEY_F3
66
#define GDK_F4 GDK_KEY_F4
69
#define GDK_F5 GDK_KEY_F5
72
#define GDK_F6 GDK_KEY_F6
75
#define GDK_F7 GDK_KEY_F7
78
#define GDK_F8 GDK_KEY_F8
81
#define GDK_F11 GDK_KEY_F11
85
static gchar **args = NULL;
86
static const GOptionEntry options [] =
89
G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_STRING_ARRAY, &args,
90
NULL, "[hostname][:display]" },
91
{ NULL, 0, 0, G_OPTION_ARG_NONE, NULL, NULL, 0 }
94
#ifdef HAVE_PULSEAUDIO
95
static VncAudioPulse *pa = NULL;
98
static GtkWidget *vnc;
108
static void set_title(VncDisplay *vncdisplay, GtkWidget *window,
111
const gchar *name = vnc_display_get_name(VNC_DISPLAY(vncdisplay));
112
VncGrabSequence *seq = vnc_display_get_grab_keys(vncdisplay);
113
gchar *seqstr = vnc_grab_sequence_as_string(seq);
117
title = g_strdup_printf("(Press %s to release pointer) %s - GVncViewer",
120
title = g_strdup_printf("%s - GVncViewer",
123
gtk_window_set_title(GTK_WINDOW(window), title);
129
static gboolean vnc_screenshot(GtkWidget *window G_GNUC_UNUSED,
130
GdkEvent *ev, GtkWidget *vncdisplay)
132
if (ev->key.keyval == GDK_F11) {
133
GdkPixbuf *pix = vnc_display_get_pixbuf(VNC_DISPLAY(vncdisplay));
134
gdk_pixbuf_save(pix, "gvncviewer.png", "png", NULL, "tEXt::Generator App", "gvncviewer", NULL);
136
printf("Screenshot saved to gvncviewer.png\n");
141
static void vnc_grab(GtkWidget *vncdisplay, GtkWidget *window)
143
set_title(VNC_DISPLAY(vncdisplay), window, TRUE);
146
static void vnc_ungrab(GtkWidget *vncdisplay, GtkWidget *window)
148
set_title(VNC_DISPLAY(vncdisplay), window, FALSE);
151
static int connected = 0;
153
static void vnc_connected(GtkWidget *vncdisplay G_GNUC_UNUSED)
155
printf("Connected to server\n");
159
static void vnc_initialized(GtkWidget *vncdisplay, GtkWidget *window)
161
printf("Connection initialized\n");
162
set_title(VNC_DISPLAY(vncdisplay), window, FALSE);
163
gtk_widget_show_all(window);
165
#ifdef HAVE_PULSEAUDIO
167
VncAudioFormat format = {
168
VNC_AUDIO_FORMAT_RAW_S32,
172
conn = vnc_display_get_connection(VNC_DISPLAY(vncdisplay));
173
vnc_connection_set_audio_format(conn, &format);
174
vnc_connection_set_audio(conn, VNC_AUDIO(pa));
175
vnc_connection_audio_enable(conn);
179
static void vnc_auth_failure(GtkWidget *vncdisplay G_GNUC_UNUSED,
182
printf("Authentication failed '%s'\n", msg ? msg : "");
185
static void vnc_desktop_resize(GtkWidget *vncdisplay G_GNUC_UNUSED,
186
int width, int height)
188
printf("Remote desktop size changed to %dx%d\n", width, height);
191
static void vnc_disconnected(GtkWidget *vncdisplay G_GNUC_UNUSED)
194
printf("Disconnected from server\n");
196
printf("Failed to connect to server\n");
200
static void send_caf1(GtkWidget *menu G_GNUC_UNUSED, GtkWidget *vncdisplay)
202
guint keys[] = { GDK_Control_L, GDK_Alt_L, GDK_F1 };
203
printf("Sending Ctrl+Alt+F1\n");
204
vnc_display_send_keys(VNC_DISPLAY(vncdisplay), keys,
205
sizeof(keys)/sizeof(keys[0]));
208
static void send_caf2(GtkWidget *menu G_GNUC_UNUSED, GtkWidget *vncdisplay)
210
guint keys[] = { GDK_Control_L, GDK_Alt_L, GDK_F2 };
211
printf("Sending Ctrl+Alt+F2\n");
212
vnc_display_send_keys(VNC_DISPLAY(vncdisplay), keys,
213
sizeof(keys)/sizeof(keys[0]));
216
static void send_caf3(GtkWidget *menu G_GNUC_UNUSED, GtkWidget *vncdisplay)
218
guint keys[] = { GDK_Control_L, GDK_Alt_L, GDK_F3 };
219
printf("Sending Ctrl+Alt+F3\n");
220
vnc_display_send_keys(VNC_DISPLAY(vncdisplay), keys,
221
sizeof(keys)/sizeof(keys[0]));
224
static void send_caf4(GtkWidget *menu G_GNUC_UNUSED, GtkWidget *vncdisplay)
226
guint keys[] = { GDK_Control_L, GDK_Alt_L, GDK_F4 };
227
printf("Sending Ctrl+Alt+F4\n");
228
vnc_display_send_keys(VNC_DISPLAY(vncdisplay), keys,
229
sizeof(keys)/sizeof(keys[0]));
232
static void send_caf5(GtkWidget *menu G_GNUC_UNUSED, GtkWidget *vncdisplay)
234
guint keys[] = { GDK_Control_L, GDK_Alt_L, GDK_F5 };
235
printf("Sending Ctrl+Alt+F5\n");
236
vnc_display_send_keys(VNC_DISPLAY(vncdisplay), keys,
237
sizeof(keys)/sizeof(keys[0]));
240
static void send_caf6(GtkWidget *menu G_GNUC_UNUSED, GtkWidget *vncdisplay)
242
guint keys[] = { GDK_Control_L, GDK_Alt_L, GDK_F6 };
243
printf("Sending Ctrl+Alt+F6\n");
244
vnc_display_send_keys(VNC_DISPLAY(vncdisplay), keys,
245
sizeof(keys)/sizeof(keys[0]));
248
static void send_caf7(GtkWidget *menu G_GNUC_UNUSED, GtkWidget *vncdisplay)
250
guint keys[] = { GDK_Control_L, GDK_Alt_L, GDK_F7 };
251
printf("Sending Ctrl+Alt+F7\n");
252
vnc_display_send_keys(VNC_DISPLAY(vncdisplay), keys,
253
sizeof(keys)/sizeof(keys[0]));
256
static void send_caf8(GtkWidget *menu G_GNUC_UNUSED, GtkWidget *vncdisplay)
258
guint keys[] = { GDK_Control_L, GDK_Alt_L, GDK_F8 };
259
printf("Sending Ctrl+Alt+F8\n");
260
vnc_display_send_keys(VNC_DISPLAY(vncdisplay), keys,
261
sizeof(keys)/sizeof(keys[0]));
264
static void send_cad(GtkWidget *menu G_GNUC_UNUSED, GtkWidget *vncdisplay)
266
guint keys[] = { GDK_Control_L, GDK_Alt_L, GDK_Delete };
267
printf("Sending Ctrl+Alt+Delete\n");
268
vnc_display_send_keys(VNC_DISPLAY(vncdisplay), keys,
269
sizeof(keys)/sizeof(keys[0]));
272
static void send_cab(GtkWidget *menu G_GNUC_UNUSED, GtkWidget *vncdisplay)
274
guint keys[] = { GDK_Control_L, GDK_Alt_L, GDK_BackSpace };
275
printf("Sending Ctrl+Alt+Backspace\n");
276
vnc_display_send_keys(VNC_DISPLAY(vncdisplay), keys,
277
sizeof(keys)/sizeof(keys[0]));
280
static void do_fullscreen(GtkWidget *menu, GtkWidget *window)
282
if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu)))
283
gtk_window_fullscreen(GTK_WINDOW(window));
285
gtk_window_unfullscreen(GTK_WINDOW(window));
288
static void do_scaling(GtkWidget *menu, GtkWidget *vncdisplay)
290
if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu)))
291
vnc_display_set_scaling(VNC_DISPLAY(vncdisplay), TRUE);
293
vnc_display_set_scaling(VNC_DISPLAY(vncdisplay), FALSE);
296
static void dialog_update_keysyms(GtkWidget *window, guint *keysyms, guint numsyms)
302
for (i = 0; i < numsyms; i++)
304
keys = g_strdup_printf("%s%s%s", keys,
305
(strlen(keys) > 0) ? "+" : " ", gdk_keyval_name(keysyms[i]));
308
gtk_label_set_text( GTK_LABEL(window), keys);
311
static gboolean dialog_key_ignore(int keyval)
322
static gboolean dialog_key_press(GtkWidget *window G_GNUC_UNUSED,
323
GdkEvent *ev, VncGrabDefs *defs)
325
gboolean keySymExists;
328
if (dialog_key_ignore(ev->key.keyval))
331
if (defs->set && defs->curkeys)
334
/* Check whether we already have keysym in array - i.e. it was handler by something else */
335
keySymExists = FALSE;
336
for (i = 0; i < defs->curkeys; i++) {
337
if (defs->keysyms[i] == ev->key.keyval)
342
defs->keysyms = g_renew(guint, defs->keysyms, defs->curkeys + 1);
343
defs->keysyms[defs->curkeys] = ev->key.keyval;
347
dialog_update_keysyms(defs->label, defs->keysyms, defs->curkeys);
349
if (!ev->key.is_modifier) {
351
defs->numkeys = defs->curkeys;
358
static gboolean dialog_key_release(GtkWidget *window G_GNUC_UNUSED,
359
GdkEvent *ev, VncGrabDefs *defs)
363
if (dialog_key_ignore(ev->key.keyval))
367
if (defs->curkeys == 0)
374
for (i = 0; i < defs->curkeys; i++)
376
if (defs->keysyms[i] == ev->key.keyval)
378
defs->keysyms[i] = defs->keysyms[defs->curkeys - 1];
380
defs->keysyms = g_renew(guint, defs->keysyms, defs->curkeys);
384
dialog_update_keysyms(defs->label, defs->keysyms, defs->curkeys);
389
static void do_set_grab_keys(GtkWidget *menu G_GNUC_UNUSED, GtkWidget *window)
392
VncGrabSequence *seq;
393
GtkWidget *dialog, *content_area, *label;
396
dialog = gtk_dialog_new_with_buttons ("Key recorder",
398
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
405
label = gtk_label_new("Please press desired grab key combination");
406
defs = g_new(VncGrabDefs, 1);
412
g_signal_connect(dialog, "key-press-event",
413
G_CALLBACK(dialog_key_press), defs);
414
g_signal_connect(dialog, "key-release-event",
415
G_CALLBACK(dialog_key_release), defs);
416
gtk_widget_set_size_request(dialog, 300, 100);
417
content_area = gtk_dialog_get_content_area( GTK_DIALOG(dialog) );
418
gtk_container_add( GTK_CONTAINER(content_area), label);
419
gtk_widget_show_all(dialog);
421
result = gtk_dialog_run(GTK_DIALOG(dialog));
422
if (result == GTK_RESPONSE_ACCEPT) {
423
/* Accepted so we make a grab sequence from it */
424
seq = vnc_grab_sequence_new(defs->numkeys,
427
vnc_display_set_grab_keys(VNC_DISPLAY(vnc), seq);
428
set_title(VNC_DISPLAY(vnc), window, FALSE);
429
vnc_grab_sequence_free(seq);
432
gtk_widget_destroy(dialog);
435
static void vnc_credential(GtkWidget *vncdisplay, GValueArray *credList)
437
GtkWidget *dialog = NULL;
439
unsigned int i, prompt = 0;
442
printf("Got credential request for %d credential(s)\n", credList->n_values);
444
data = g_new0(const char *, credList->n_values);
446
for (i = 0 ; i < credList->n_values ; i++) {
447
GValue *cred = g_value_array_get_nth(credList, i);
448
switch (g_value_get_enum(cred)) {
449
case VNC_DISPLAY_CREDENTIAL_USERNAME:
450
case VNC_DISPLAY_CREDENTIAL_PASSWORD:
453
case VNC_DISPLAY_CREDENTIAL_CLIENTNAME:
454
data[i] = "gvncviewer";
461
GtkWidget **label, **entry, *box, *vbox;
463
dialog = gtk_dialog_new_with_buttons("Authentication required",
471
gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
473
box = gtk_table_new(credList->n_values, 2, FALSE);
474
label = g_new(GtkWidget *, prompt);
475
entry = g_new(GtkWidget *, prompt);
477
for (i = 0, row =0 ; i < credList->n_values ; i++) {
478
GValue *cred = g_value_array_get_nth(credList, i);
479
entry[row] = gtk_entry_new();
480
switch (g_value_get_enum(cred)) {
481
case VNC_DISPLAY_CREDENTIAL_USERNAME:
482
label[row] = gtk_label_new("Username:");
484
case VNC_DISPLAY_CREDENTIAL_PASSWORD:
485
label[row] = gtk_label_new("Password:");
486
gtk_entry_set_activates_default(GTK_ENTRY(entry[row]), TRUE);
491
if (g_value_get_enum (cred) == VNC_DISPLAY_CREDENTIAL_PASSWORD)
492
gtk_entry_set_visibility (GTK_ENTRY (entry[row]), FALSE);
494
gtk_table_attach(GTK_TABLE(box), label[i], 0, 1, row, row+1, GTK_SHRINK, GTK_SHRINK, 3, 3);
495
gtk_table_attach(GTK_TABLE(box), entry[i], 1, 2, row, row+1, GTK_SHRINK, GTK_SHRINK, 3, 3);
499
vbox = gtk_bin_get_child(GTK_BIN(dialog));
500
gtk_container_add(GTK_CONTAINER(vbox), box);
502
gtk_widget_show_all(dialog);
503
response = gtk_dialog_run(GTK_DIALOG(dialog));
504
gtk_widget_hide(GTK_WIDGET(dialog));
506
if (response == GTK_RESPONSE_OK) {
507
for (i = 0, row = 0 ; i < credList->n_values ; i++) {
508
GValue *cred = g_value_array_get_nth(credList, i);
509
switch (g_value_get_enum(cred)) {
510
case VNC_DISPLAY_CREDENTIAL_USERNAME:
511
case VNC_DISPLAY_CREDENTIAL_PASSWORD:
512
data[i] = gtk_entry_get_text(GTK_ENTRY(entry[row]));
522
for (i = 0 ; i < credList->n_values ; i++) {
523
GValue *cred = g_value_array_get_nth(credList, i);
525
if (vnc_display_set_credential(VNC_DISPLAY(vncdisplay),
526
g_value_get_enum(cred),
528
printf("Failed to set credential type %d\n", g_value_get_enum(cred));
529
vnc_display_close(VNC_DISPLAY(vncdisplay));
532
printf("Unsupported credential type %d\n", g_value_get_enum(cred));
533
vnc_display_close(VNC_DISPLAY(vncdisplay));
539
gtk_widget_destroy(GTK_WIDGET(dialog));
543
static gboolean window_state_event(GtkWidget *widget,
544
GdkEventWindowState *event,
547
ViewAutoDrawer *drawer = VIEW_AUTODRAWER(data);
549
if (event->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) {
550
if (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) {
551
vnc_display_force_grab(VNC_DISPLAY(vnc), TRUE);
552
ViewAutoDrawer_SetActive(drawer, TRUE);
554
vnc_display_force_grab(VNC_DISPLAY(vnc), FALSE);
555
ViewAutoDrawer_SetActive(drawer, FALSE);
563
int main(int argc, char **argv)
566
GOptionContext *context;
567
GError *error = NULL;
568
char port[1024], hostname[1024];
573
GtkWidget *sendkey, *view, *settings;
585
GtkWidget *fullscreen;
587
GtkWidget *showgrabkeydlg;
588
const char *help_msg = "Run 'gvncviewer --help' to see a full list of available command line options";
590
name = g_strdup_printf("- Simple VNC Client on Gtk-VNC %s",
591
vnc_util_get_version_string());
593
/* Setup command line options */
594
context = g_option_context_new (name);
595
g_option_context_add_main_entries (context, options, NULL);
596
g_option_context_add_group (context, gtk_get_option_group (TRUE));
597
g_option_context_add_group (context, vnc_display_get_option_group ());
598
g_option_context_parse (context, &argc, &argv, &error);
603
g_error_free (error);
606
if (!args || (g_strv_length(args) != 1)) {
607
fprintf(stderr, "Usage: gvncviewer [hostname][:display]\n%s\n", help_msg);
611
vnc = vnc_display_new();
613
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
615
layout = ViewAutoDrawer_New();
617
layout = gtk_vbox_new(FALSE, 0);
619
menubar = gtk_menu_bar_new();
622
pa = vnc_audio_pulse_new();
625
gtk_window_set_resizable(GTK_WINDOW(window), TRUE);
627
sendkey = gtk_menu_item_new_with_mnemonic("_Send Key");
628
gtk_menu_shell_append(GTK_MENU_SHELL(menubar), sendkey);
630
submenu = gtk_menu_new();
632
caf1 = gtk_menu_item_new_with_mnemonic("Ctrl+Alt+F_1");
633
caf2 = gtk_menu_item_new_with_mnemonic("Ctrl+Alt+F_2");
634
caf3 = gtk_menu_item_new_with_mnemonic("Ctrl+Alt+F_3");
635
caf4 = gtk_menu_item_new_with_mnemonic("Ctrl+Alt+F_4");
636
caf5 = gtk_menu_item_new_with_mnemonic("Ctrl+Alt+F_5");
637
caf6 = gtk_menu_item_new_with_mnemonic("Ctrl+Alt+F_6");
638
caf7 = gtk_menu_item_new_with_mnemonic("Ctrl+Alt+F_7");
639
caf8 = gtk_menu_item_new_with_mnemonic("Ctrl+Alt+F_8");
640
cad = gtk_menu_item_new_with_mnemonic("Ctrl+Alt+_Del");
641
cab = gtk_menu_item_new_with_mnemonic("Ctrl+Alt+_Backspace");
643
gtk_menu_shell_append(GTK_MENU_SHELL(submenu), caf1);
644
gtk_menu_shell_append(GTK_MENU_SHELL(submenu), caf2);
645
gtk_menu_shell_append(GTK_MENU_SHELL(submenu), caf3);
646
gtk_menu_shell_append(GTK_MENU_SHELL(submenu), caf4);
647
gtk_menu_shell_append(GTK_MENU_SHELL(submenu), caf5);
648
gtk_menu_shell_append(GTK_MENU_SHELL(submenu), caf6);
649
gtk_menu_shell_append(GTK_MENU_SHELL(submenu), caf7);
650
gtk_menu_shell_append(GTK_MENU_SHELL(submenu), caf8);
651
gtk_menu_shell_append(GTK_MENU_SHELL(submenu), cad);
652
gtk_menu_shell_append(GTK_MENU_SHELL(submenu), cab);
654
gtk_menu_item_set_submenu(GTK_MENU_ITEM(sendkey), submenu);
656
view = gtk_menu_item_new_with_mnemonic("_View");
657
gtk_menu_shell_append(GTK_MENU_SHELL(menubar), view);
659
submenu = gtk_menu_new();
661
fullscreen = gtk_check_menu_item_new_with_mnemonic("_Full Screen");
662
scaling = gtk_check_menu_item_new_with_mnemonic("Scaled display");
664
gtk_menu_shell_append(GTK_MENU_SHELL(submenu), fullscreen);
665
gtk_menu_shell_append(GTK_MENU_SHELL(submenu), scaling);
667
gtk_menu_item_set_submenu(GTK_MENU_ITEM(view), submenu);
669
settings = gtk_menu_item_new_with_mnemonic("_Settings");
670
gtk_menu_shell_append(GTK_MENU_SHELL(menubar), settings);
672
submenu = gtk_menu_new();
674
showgrabkeydlg = gtk_menu_item_new_with_mnemonic("_Set grab keys");
675
gtk_menu_shell_append(GTK_MENU_SHELL(submenu), showgrabkeydlg);
677
gtk_menu_item_set_submenu(GTK_MENU_ITEM(settings), submenu);
680
ViewAutoDrawer_SetActive(VIEW_AUTODRAWER(layout), FALSE);
681
ViewOvBox_SetOver(VIEW_OV_BOX(layout), menubar);
682
ViewOvBox_SetUnder(VIEW_OV_BOX(layout), vnc);
684
gtk_box_pack_start(GTK_BOX(layout), menubar, FALSE, TRUE, 0);
685
gtk_box_pack_start(GTK_BOX(layout), vnc, TRUE, TRUE, 0);
687
gtk_container_add(GTK_CONTAINER(window), layout);
688
gtk_widget_realize(vnc);
690
snprintf(hostname, sizeof(hostname), "%s", args[0]);
691
display = strchr(hostname, ':');
695
snprintf(port, sizeof(port), "%d", 5900 + atoi(display + 1));
697
snprintf(port, sizeof(port), "%d", 5900);
700
snprintf(hostname, sizeof(hostname), "%s", "127.0.0.1");
701
vnc_display_open_host(VNC_DISPLAY(vnc), hostname, port);
702
vnc_display_set_keyboard_grab(VNC_DISPLAY(vnc), TRUE);
703
vnc_display_set_pointer_grab(VNC_DISPLAY(vnc), TRUE);
705
if (!gtk_widget_is_composited(window)) {
706
vnc_display_set_scaling(VNC_DISPLAY(vnc), TRUE);
707
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(scaling), TRUE);
710
g_signal_connect(window, "delete-event",
711
G_CALLBACK(gtk_main_quit), NULL);
712
g_signal_connect(vnc, "vnc-connected",
713
G_CALLBACK(vnc_connected), NULL);
714
g_signal_connect(vnc, "vnc-initialized",
715
G_CALLBACK(vnc_initialized), window);
716
g_signal_connect(vnc, "vnc-disconnected",
717
G_CALLBACK(vnc_disconnected), NULL);
718
g_signal_connect(vnc, "vnc-auth-credential",
719
G_CALLBACK(vnc_credential), NULL);
720
g_signal_connect(vnc, "vnc-auth-failure",
721
G_CALLBACK(vnc_auth_failure), NULL);
723
g_signal_connect(vnc, "vnc-desktop-resize",
724
G_CALLBACK(vnc_desktop_resize), NULL);
726
g_signal_connect(vnc, "vnc-pointer-grab",
727
G_CALLBACK(vnc_grab), window);
728
g_signal_connect(vnc, "vnc-pointer-ungrab",
729
G_CALLBACK(vnc_ungrab), window);
731
g_signal_connect(window, "key-press-event",
732
G_CALLBACK(vnc_screenshot), vnc);
734
g_signal_connect(caf1, "activate",
735
G_CALLBACK(send_caf1), vnc);
736
g_signal_connect(caf2, "activate",
737
G_CALLBACK(send_caf2), vnc);
738
g_signal_connect(caf3, "activate",
739
G_CALLBACK(send_caf3), vnc);
740
g_signal_connect(caf4, "activate",
741
G_CALLBACK(send_caf4), vnc);
742
g_signal_connect(caf5, "activate",
743
G_CALLBACK(send_caf5), vnc);
744
g_signal_connect(caf6, "activate",
745
G_CALLBACK(send_caf6), vnc);
746
g_signal_connect(caf7, "activate",
747
G_CALLBACK(send_caf7), vnc);
748
g_signal_connect(caf8, "activate",
749
G_CALLBACK(send_caf8), vnc);
750
g_signal_connect(cad, "activate",
751
G_CALLBACK(send_cad), vnc);
752
g_signal_connect(cab, "activate",
753
G_CALLBACK(send_cab), vnc);
754
g_signal_connect(showgrabkeydlg, "activate",
755
G_CALLBACK(do_set_grab_keys), window);
756
g_signal_connect(fullscreen, "toggled",
757
G_CALLBACK(do_fullscreen), window);
758
g_signal_connect(scaling, "toggled",
759
G_CALLBACK(do_scaling), vnc);
761
g_signal_connect(window, "window-state-event",
762
G_CALLBACK(window_state_event), layout);
774
* indent-tabs-mode: nil