43
43
vnc_connected (GtkWidget *vnc G_GNUC_UNUSED, void *Thisv)
45
PluginInstance *This = (PluginInstance *) Thisv;
45
PluginInstance *This = (PluginInstance *) Thisv;
47
debug ("vnc_connected, This=%p", This);
47
debug ("vnc_connected, This=%p", This);
51
51
vnc_disconnected (GtkWidget *vnc G_GNUC_UNUSED, void *Thisv)
53
PluginInstance *This = (PluginInstance *) Thisv;
53
PluginInstance *This = (PluginInstance *) Thisv;
55
debug ("vnc_disconnected, This=%p", This);
55
debug ("vnc_disconnected, This=%p", This);
59
59
vnc_auth_credential (GtkWidget *vnc, GValueArray *creds, void *Thisv)
61
GtkWidget *dlg = NULL;
62
PluginInstance *This = (PluginInstance *) Thisv;
63
unsigned i, prompt = 0;
66
debug ("vnc_auth_credential, This=%p", This);
68
data = g_new0 (const char *, creds->n_values);
70
for (i = 0; i < creds->n_values; ++i) {
71
GValue *cred = g_value_array_get_nth (creds, i);
72
switch (g_value_get_enum (cred)) {
73
case VNC_DISPLAY_CREDENTIAL_USERNAME:
74
case VNC_DISPLAY_CREDENTIAL_PASSWORD:
77
case VNC_DISPLAY_CREDENTIAL_CLIENTNAME:
78
data[i] = "gvncviewer";
83
/* Prompt user for username and password. */
85
GtkWidget **label, **entry, *box, *vbox;
88
dlg = gtk_dialog_new_with_buttons
89
("Gtk-VNC: Authentication required",
90
GTK_WINDOW (This->container),
91
GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
92
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
93
GTK_STOCK_OK, GTK_RESPONSE_OK,
95
gtk_dialog_set_default_response (GTK_DIALOG(dlg), GTK_RESPONSE_OK);
97
box = gtk_table_new (creds->n_values, 2, FALSE);
98
label = g_new (GtkWidget *, prompt);
99
entry = g_new (GtkWidget *, prompt);
101
for (i = 0, row = 0; i < creds->n_values; ++i) {
102
GValue *cred = g_value_array_get_nth (creds, i);
103
switch (g_value_get_enum(cred)) {
104
case VNC_DISPLAY_CREDENTIAL_USERNAME:
105
label[row] = gtk_label_new("Username:");
107
case VNC_DISPLAY_CREDENTIAL_PASSWORD:
108
label[row] = gtk_label_new("Password:");
113
entry[row] = gtk_entry_new();
114
if (g_value_get_enum (cred) == VNC_DISPLAY_CREDENTIAL_PASSWORD)
115
gtk_entry_set_visibility (GTK_ENTRY (entry[row]), FALSE);
117
gtk_table_attach(GTK_TABLE(box), label[i], 0, 1, row, row+1, GTK_SHRINK, GTK_SHRINK, 3, 3);
118
gtk_table_attach(GTK_TABLE(box), entry[i], 1, 2, row, row+1, GTK_SHRINK, GTK_SHRINK, 3, 3);
122
vbox = gtk_bin_get_child(GTK_BIN(dlg));
123
gtk_container_add(GTK_CONTAINER(vbox), box);
125
gtk_widget_show_all(dlg);
126
response = gtk_dialog_run(GTK_DIALOG(dlg));
127
gtk_widget_hide(GTK_WIDGET(dlg));
129
if (response == GTK_RESPONSE_OK) {
130
for (i = 0, row = 0 ; i < creds->n_values ; i++) {
131
GValue *cred = g_value_array_get_nth(creds, i);
132
switch (g_value_get_enum(cred)) {
133
case VNC_DISPLAY_CREDENTIAL_USERNAME:
134
case VNC_DISPLAY_CREDENTIAL_PASSWORD:
135
data[i] = gtk_entry_get_text(GTK_ENTRY(entry[row]));
143
/* Set the credentials. */
144
for (i = 0 ; i < creds->n_values ; i++) {
145
GValue *cred = g_value_array_get_nth(creds, i);
147
if (vnc_display_set_credential(VNC_DISPLAY(vnc),
148
g_value_get_enum(cred),
150
debug ("Failed to set credential type %d", g_value_get_enum(cred));
151
vnc_display_close(VNC_DISPLAY(vnc));
154
debug ("Unsupported credential type %d", g_value_get_enum(cred));
155
vnc_display_close(VNC_DISPLAY(vnc));
161
gtk_widget_destroy (GTK_WIDGET(dlg));
61
GtkWidget *dlg = NULL;
62
PluginInstance *This = (PluginInstance *) Thisv;
63
unsigned i, prompt = 0;
66
debug ("vnc_auth_credential, This=%p", This);
68
data = g_new0 (const char *, creds->n_values);
70
for (i = 0; i < creds->n_values; ++i) {
71
GValue *cred = g_value_array_get_nth (creds, i);
72
switch (g_value_get_enum (cred)) {
73
case VNC_DISPLAY_CREDENTIAL_USERNAME:
74
case VNC_DISPLAY_CREDENTIAL_PASSWORD:
77
case VNC_DISPLAY_CREDENTIAL_CLIENTNAME:
78
data[i] = "gvncviewer";
83
/* Prompt user for username and password. */
85
GtkWidget **label, **entry, *box, *vbox;
88
dlg = gtk_dialog_new_with_buttons
89
("Gtk-VNC: Authentication required",
90
GTK_WINDOW (This->container),
91
GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
92
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
93
GTK_STOCK_OK, GTK_RESPONSE_OK,
95
gtk_dialog_set_default_response (GTK_DIALOG(dlg), GTK_RESPONSE_OK);
97
box = gtk_table_new (creds->n_values, 2, FALSE);
98
label = g_new (GtkWidget *, prompt);
99
entry = g_new (GtkWidget *, prompt);
101
for (i = 0, row = 0; i < creds->n_values; ++i) {
102
GValue *cred = g_value_array_get_nth (creds, i);
103
switch (g_value_get_enum(cred)) {
104
case VNC_DISPLAY_CREDENTIAL_USERNAME:
105
label[row] = gtk_label_new("Username:");
107
case VNC_DISPLAY_CREDENTIAL_PASSWORD:
108
label[row] = gtk_label_new("Password:");
113
entry[row] = gtk_entry_new();
114
if (g_value_get_enum (cred) == VNC_DISPLAY_CREDENTIAL_PASSWORD)
115
gtk_entry_set_visibility (GTK_ENTRY (entry[row]), FALSE);
117
gtk_table_attach(GTK_TABLE(box), label[i], 0, 1, row, row+1, GTK_SHRINK, GTK_SHRINK, 3, 3);
118
gtk_table_attach(GTK_TABLE(box), entry[i], 1, 2, row, row+1, GTK_SHRINK, GTK_SHRINK, 3, 3);
122
vbox = gtk_bin_get_child(GTK_BIN(dlg));
123
gtk_container_add(GTK_CONTAINER(vbox), box);
125
gtk_widget_show_all(dlg);
126
response = gtk_dialog_run(GTK_DIALOG(dlg));
127
gtk_widget_hide(GTK_WIDGET(dlg));
129
if (response == GTK_RESPONSE_OK) {
130
for (i = 0, row = 0 ; i < creds->n_values ; i++) {
131
GValue *cred = g_value_array_get_nth(creds, i);
132
switch (g_value_get_enum(cred)) {
133
case VNC_DISPLAY_CREDENTIAL_USERNAME:
134
case VNC_DISPLAY_CREDENTIAL_PASSWORD:
135
data[i] = gtk_entry_get_text(GTK_ENTRY(entry[row]));
143
/* Set the credentials. */
144
for (i = 0 ; i < creds->n_values ; i++) {
145
GValue *cred = g_value_array_get_nth(creds, i);
147
if (vnc_display_set_credential(VNC_DISPLAY(vnc),
148
g_value_get_enum(cred),
150
debug ("Failed to set credential type %d", g_value_get_enum(cred));
151
vnc_display_close(VNC_DISPLAY(vnc));
154
debug ("Unsupported credential type %d", g_value_get_enum(cred));
155
vnc_display_close(VNC_DISPLAY(vnc));
161
gtk_widget_destroy (GTK_WIDGET(dlg));
165
165
GtkVNCXSetWindow (NPP instance, NPWindow *window)
167
PluginInstance *This;
168
NPSetWindowCallbackStruct *ws_info;
170
if (instance == NULL)
171
return NPERR_INVALID_INSTANCE_ERROR;
173
This = (PluginInstance*) instance->pdata;
175
debug ("GtkVNCXSetWindow, This=%p", This);
178
return NPERR_INVALID_INSTANCE_ERROR;
180
ws_info = (NPSetWindowCallbackStruct *)window->ws_info;
182
/* Mozilla likes to re-run its greatest hits */
183
if (window == This->window &&
184
window->x == This->x &&
185
window->y == This->y &&
186
window->width == This->width &&
187
window->height == This->height) {
188
debug ("gtk-vnc-plugin: window re-run; returning");
167
PluginInstance *This;
168
NPSetWindowCallbackStruct *ws_info;
170
if (instance == NULL)
171
return NPERR_INVALID_INSTANCE_ERROR;
173
This = (PluginInstance*) instance->pdata;
175
debug ("GtkVNCXSetWindow, This=%p", This);
178
return NPERR_INVALID_INSTANCE_ERROR;
180
ws_info = (NPSetWindowCallbackStruct *)window->ws_info;
182
/* Mozilla likes to re-run its greatest hits */
183
if (window == This->window &&
184
window->x == This->x &&
185
window->y == This->y &&
186
window->width == This->width &&
187
window->height == This->height) {
188
debug ("gtk-vnc-plugin: window re-run; returning");
189
return NPERR_NO_ERROR;
192
This->window = window;
195
This->width = window->width;
196
This->height = window->height;
198
/* Create a GtkPlug container and a Gtk-VNC widget inside it. */
199
This->container = gtk_plug_new ((GdkNativeWindow)(long)window->window);
200
This->vnc = vnc_display_new ();
202
/* Make sure the canvas is capable of receiving focus. */
203
GTK_WIDGET_SET_FLAGS (GTK_WIDGET(This->vnc), GTK_CAN_FOCUS);
205
/* All the events that our canvas wants to receive */
206
gtk_widget_add_events
208
GDK_BUTTON_PRESS_MASK |
209
GDK_BUTTON_RELEASE_MASK |
211
GDK_KEY_RELEASE_MASK |
212
GDK_POINTER_MOTION_MASK |
215
GDK_VISIBILITY_NOTIFY_MASK |
216
GDK_ENTER_NOTIFY_MASK |
217
GDK_LEAVE_NOTIFY_MASK |
218
GDK_FOCUS_CHANGE_MASK);
220
/* Connect up the signals. */
221
g_signal_connect (G_OBJECT(This->vnc), "vnc-connected",
222
G_CALLBACK(vnc_connected), This);
223
g_signal_connect (G_OBJECT(This->vnc), "vnc-disconnected",
224
G_CALLBACK(vnc_disconnected), This);
226
g_signal_connect (G_OBJECT(This->vnc), "vnc-initialized",
227
G_CALLBACK(vnc_initialized), This);
229
g_signal_connect (G_OBJECT(This->vnc), "vnc-auth-credential",
230
G_CALLBACK(vnc_auth_credential), This);
232
g_signal_connect (G_OBJECT(This->vnc), "vnc-auth-failure",
233
G_CALLBACK(vnc_auth_failure), This);
234
g_signal_connect (G_OBJECT(This->vnc), "vnc-desktop-resize",
235
G_CALLBACK(vnc_desktop_resize), This);
236
g_signal_connect (G_OBJECT(This->vnc), "vnc-pointer-grab",
237
G_CALLBACK(vnc_pointer_grab), This);
238
g_signal_connect (G_OBJECT(This->vnc), "vnc-pointer-ungrab",
239
G_CALLBACK(vnc_pointer_ungrab), This);
240
g_signal_connect (G_OBJECT(This->vnc), "key-press-event",
241
G_CALLBACK(vnc_screenshow), This);
244
gtk_widget_show (This->vnc);
246
gtk_container_add (GTK_CONTAINER(This->container), This->vnc);
248
gtk_widget_show (This->container);
250
/*gtk_widget_realize (This->vnc);*/
252
/* Start connection to remote host. */
253
if (This->host && This->port) {
254
debug ("starting connection to %s:%s", This->host, This->port);
255
vnc_display_open_host (VNC_DISPLAY(This->vnc), This->host, This->port);
189
258
return NPERR_NO_ERROR;
192
This->window = window;
195
This->width = window->width;
196
This->height = window->height;
198
/* Create a GtkPlug container and a Gtk-VNC widget inside it. */
199
This->container = gtk_plug_new ((GdkNativeWindow)(long)window->window);
200
This->vnc = vnc_display_new ();
202
/* Make sure the canvas is capable of receiving focus. */
203
GTK_WIDGET_SET_FLAGS (GTK_WIDGET(This->vnc), GTK_CAN_FOCUS);
205
/* All the events that our canvas wants to receive */
206
gtk_widget_add_events
208
GDK_BUTTON_PRESS_MASK |
209
GDK_BUTTON_RELEASE_MASK |
211
GDK_KEY_RELEASE_MASK |
212
GDK_POINTER_MOTION_MASK |
215
GDK_VISIBILITY_NOTIFY_MASK |
216
GDK_ENTER_NOTIFY_MASK |
217
GDK_LEAVE_NOTIFY_MASK |
218
GDK_FOCUS_CHANGE_MASK);
220
/* Connect up the signals. */
221
g_signal_connect (G_OBJECT(This->vnc), "vnc-connected",
222
G_CALLBACK(vnc_connected), This);
223
g_signal_connect (G_OBJECT(This->vnc), "vnc-disconnected",
224
G_CALLBACK(vnc_disconnected), This);
226
g_signal_connect (G_OBJECT(This->vnc), "vnc-initialized",
227
G_CALLBACK(vnc_initialized), This);
229
g_signal_connect (G_OBJECT(This->vnc), "vnc-auth-credential",
230
G_CALLBACK(vnc_auth_credential), This);
232
g_signal_connect (G_OBJECT(This->vnc), "vnc-auth-failure",
233
G_CALLBACK(vnc_auth_failure), This);
234
g_signal_connect (G_OBJECT(This->vnc), "vnc-desktop-resize",
235
G_CALLBACK(vnc_desktop_resize), This);
236
g_signal_connect (G_OBJECT(This->vnc), "vnc-pointer-grab",
237
G_CALLBACK(vnc_pointer_grab), This);
238
g_signal_connect (G_OBJECT(This->vnc), "vnc-pointer-ungrab",
239
G_CALLBACK(vnc_pointer_ungrab), This);
240
g_signal_connect (G_OBJECT(This->vnc), "key-press-event",
241
G_CALLBACK(vnc_screenshow), This);
244
gtk_widget_show (This->vnc);
246
gtk_container_add (GTK_CONTAINER(This->container), This->vnc);
248
gtk_widget_show (This->container);
250
/*gtk_widget_realize (This->vnc);*/
252
/* Start connection to remote host. */
253
if (This->host && This->port) {
254
debug ("starting connection to %s:%s", This->host, This->port);
255
vnc_display_open_host (VNC_DISPLAY(This->vnc), This->host, This->port);
258
return NPERR_NO_ERROR;
262
262
GtkVNCDestroyWindow (NPP instance)
264
PluginInstance *This = (PluginInstance*) instance->pdata;
266
debug ("GtkVNCDestroyWindow, This=%p", This);
268
if (This && This->container) {
269
gtk_widget_destroy (This->container);
270
This->container = This->vnc = NULL;
273
return NPERR_NO_ERROR;
264
PluginInstance *This = (PluginInstance*) instance->pdata;
266
debug ("GtkVNCDestroyWindow, This=%p", This);
268
if (This && This->container) {
269
gtk_widget_destroy (This->container);
270
This->container = This->vnc = NULL;
273
return NPERR_NO_ERROR;
276
276
static NPWindow windowlessWindow;