aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkraxel <kraxel>2007-08-20 11:07:05 +0000
committerkraxel <kraxel>2007-08-20 11:07:05 +0000
commit01af1cbcc50199d9f7e6e4756500e5cab2382747 (patch)
tree6ff2434acdd0d0860396b62a5996b412a62ccca5
parent93e83f3cdbcd4d9dc31960f6934db89777d4d594 (diff)
downloadxenwatch-01af1cbcc50199d9f7e6e4756500e5cab2382747.tar.gz
a bunch of gtk-vnc tweaks
-rw-r--r--vnc-old.c1
-rw-r--r--vnc.c215
2 files changed, 158 insertions, 58 deletions
diff --git a/vnc-old.c b/vnc-old.c
index 3fc3d65..d1c25e0 100644
--- a/vnc-old.c
+++ b/vnc-old.c
@@ -106,7 +106,6 @@ static void vnc_window_texts(struct vnc_window *vnc);
/* ------------------------------------------------------------------ */
/* opengl bits */
-
static int gl_error;
static int gl_attrib[] = { GLX_RGBA,
GLX_RED_SIZE, 1,
diff --git a/vnc.c b/vnc.c
index eb490cf..bfc0745 100644
--- a/vnc.c
+++ b/vnc.c
@@ -7,14 +7,7 @@
#include <locale.h>
#include <signal.h>
-#include <X11/X.h>
-#include <X11/Xlib.h>
-
-#include <GL/gl.h>
-#include <GL/glx.h>
-
#include <gdk/gdk.h>
-#include <gdk/gdkx.h>
#include <gtk/gtk.h>
#include "x11.h"
@@ -26,6 +19,13 @@
/* ------------------------------------------------------------------ */
+enum vnc_state {
+ CONN_NONE = 0,
+ CONN_CONNECTING,
+ CONN_CONNECTED,
+ CONN_DISCONNECTED,
+};
+
struct vnc_window {
/* gtk */
GtkAccelGroup *ac;
@@ -42,13 +42,14 @@ struct vnc_window {
/* state */
int input_grabbed;
- int connected;
+ enum vnc_state conn_state;
/* config */
int fullscreen;
- int standalone;
int showpointer;
- int viewonly;
+ int grab_pointer;
+ int grab_keyboard;
+ int standalone;
int debug;
};
@@ -58,31 +59,37 @@ struct vnc_window {
static void vnc_window_texts(struct vnc_window *vnc)
{
const char *name = vnc_display_get_name(VNC_DISPLAY(vnc->vnc));
- char textline[256];
-
- if (vnc->connected) {
- gtk_window_set_title(GTK_WINDOW(vnc->win), name);
- } else {
- snprintf(textline, sizeof(textline), "connecting to %s ...",
- vnc->display);
- gtk_window_set_title(GTK_WINDOW(vnc->win), textline);
- }
+ char ti[256] = "vnc";
+ char st[256];
+ char si[16] = "-";
- if (vnc->input_grabbed) {
- gtk_label_set_text(GTK_LABEL(vnc->line),
- "Press Ctrl-Alt to release input grab.");
- } else if (vnc->connected) {
- snprintf(textline, sizeof(textline), "VNC: \"%s\" at %s",
+ switch (vnc->conn_state) {
+ case CONN_NONE:
+ snprintf(st, sizeof(st), "VNC: idle");
+ break;
+ case CONN_CONNECTING:
+ snprintf(ti, sizeof(ti), "connecting");
+ snprintf(st, sizeof(st), "VNC: connecting to %s ...", vnc->display);
+ break;
+ case CONN_CONNECTED:
+ snprintf(ti, sizeof(ti), "%s", name);
+ snprintf(st, sizeof(st), "VNC: \"%s\" at %s",
name ?: "", vnc->display);
- gtk_label_set_text(GTK_LABEL(vnc->line), textline);
- } else {
- gtk_label_set_text(GTK_LABEL(vnc->line), "VNC: disconnected");
+ snprintf(si, sizeof(si), "%dx%d",
+ vnc_display_get_width(VNC_DISPLAY(vnc->vnc)),
+ vnc_display_get_height(VNC_DISPLAY(vnc->vnc)));
+ break;
+ case CONN_DISCONNECTED:
+ snprintf(st, sizeof(st), "VNC: disconnected from %s.", vnc->display);
+ break;
}
- snprintf(textline, sizeof(textline), "%dx%d",
- vnc_display_get_width(VNC_DISPLAY(vnc->vnc)),
- vnc_display_get_height(VNC_DISPLAY(vnc->vnc)));
- gtk_label_set_text(GTK_LABEL(vnc->res), textline);
+ if (vnc->input_grabbed)
+ snprintf(st, sizeof(st), "Press Ctrl-Alt to release input grab.");
+
+ gtk_window_set_title(GTK_WINDOW(vnc->win), ti);
+ gtk_label_set_text(GTK_LABEL(vnc->line), st);
+ gtk_label_set_text(GTK_LABEL(vnc->res), si);
}
static void vnc_release(struct vnc_window *vnc)
@@ -165,7 +172,7 @@ static void vnc_initialized(GtkWidget *vncdisplay, void *data)
if (vnc->debug)
fprintf(stderr, "%s\n", __FUNCTION__);
- vnc->connected = 1;
+ vnc->conn_state = CONN_CONNECTED;
vnc_window_texts(vnc);
}
@@ -175,7 +182,7 @@ static void vnc_disconnected(GtkWidget *vncdisplay, void *data)
if (vnc->debug)
fprintf(stderr, "%s\n", __FUNCTION__);
- vnc->connected = 0;
+ vnc->conn_state = CONN_DISCONNECTED;
vnc_window_texts(vnc);
}
@@ -201,9 +208,10 @@ static void vnc_ungrab(GtkWidget *vncdisplay, void *data)
static void vnc_credential(GtkWidget *vncdisplay, void *data)
{
-// struct vnc_window *vnc = data;
+ struct vnc_window *vnc = data;
- fprintf(stderr, "%s: not implemented yet\n", __FUNCTION__);
+ if (1 || vnc->debug)
+ fprintf(stderr, "%s: not implemented yet\n", __FUNCTION__);
}
/* ------------------------------------------------------------------ */
@@ -250,8 +258,11 @@ static void menu_btn(GtkWidget *widget, gpointer data)
static void menu_cb_full_screen(GtkToggleAction *action, gpointer user_data)
{
struct vnc_window *vnc = user_data;
+ gboolean state = gtk_toggle_action_get_active(action);
- vnc->fullscreen = gtk_toggle_action_get_active(action);
+ vnc->fullscreen = state;
+ if (vnc->debug)
+ fprintf(stderr, "%s: %s\n", __FUNCTION__, state ? "on" : "off");
if (vnc->fullscreen)
gtk_window_fullscreen(GTK_WINDOW(vnc->win));
else
@@ -261,20 +272,71 @@ static void menu_cb_full_screen(GtkToggleAction *action, gpointer user_data)
static void menu_cb_show_pointer(GtkToggleAction *action, gpointer user_data)
{
struct vnc_window *vnc = user_data;
+ gboolean state = gtk_toggle_action_get_active(action);
- vnc->showpointer = gtk_toggle_action_get_active(action);
-#if 0
- if (vnc->draw->window)
- gdk_window_set_cursor(vnc->draw->window,
- vnc->showpointer ? vnc->on : vnc->off);
-#endif
+ if (vnc->debug)
+ fprintf(stderr, "%s: %s\n", __FUNCTION__, state ? "on" : "off");
+ vnc->showpointer = state;
+ vnc_display_set_pointer_local(VNC_DISPLAY(vnc->vnc), state);
+}
+
+static void menu_cb_grab_pointer(GtkToggleAction *action, gpointer user_data)
+{
+ struct vnc_window *vnc = user_data;
+ gboolean state = gtk_toggle_action_get_active(action);
+
+ if (vnc->debug)
+ fprintf(stderr, "%s: %s\n", __FUNCTION__, state ? "on" : "off");
+ vnc->grab_pointer = state;
+ vnc_display_set_pointer_grab(VNC_DISPLAY(vnc->vnc), state);
}
-static void menu_cb_view_only(GtkToggleAction *action, gpointer user_data)
+static void menu_cb_grab_keyboard(GtkToggleAction *action, gpointer user_data)
{
struct vnc_window *vnc = user_data;
+ gboolean state = gtk_toggle_action_get_active(action);
- vnc->viewonly = gtk_toggle_action_get_active(action);
+ if (vnc->debug)
+ fprintf(stderr, "%s: %s\n", __FUNCTION__, state ? "on" : "off");
+ vnc->grab_keyboard = state;
+ vnc_display_set_keyboard_grab(VNC_DISPLAY(vnc->vnc), state);
+}
+
+static void menu_cb_connect(GtkToggleAction *action, gpointer user_data)
+{
+ struct vnc_window *vnc = user_data;
+
+ if (vnc->conn_state == CONN_CONNECTED)
+ return;
+ if (1 || vnc->debug)
+ fprintf(stderr, "%s: not implemented yet\n", __FUNCTION__);
+}
+
+static void menu_cb_reconnect(GtkToggleAction *action, gpointer user_data)
+{
+ struct vnc_window *vnc = user_data;
+
+ if (vnc->conn_state != CONN_DISCONNECTED)
+ return;
+
+ if (vnc->debug)
+ fprintf(stderr, "%s: %s %s\n", __FUNCTION__,
+ vnc->hostname, vnc->tcpport);
+ vnc->conn_state = CONN_CONNECTING;
+ vnc_window_texts(vnc);
+ vnc_display_open_host(VNC_DISPLAY(vnc->vnc), vnc->hostname, vnc->tcpport);
+}
+
+static void menu_cb_disconnect(GtkToggleAction *action, gpointer user_data)
+{
+ struct vnc_window *vnc = user_data;
+
+ if (vnc->conn_state != CONN_CONNECTED)
+ return;
+
+ if (vnc->debug)
+ fprintf(stderr, "%s\n", __FUNCTION__);
+ vnc_display_close(VNC_DISPLAY(vnc->vnc));
}
static void menu_cb_about(GtkMenuItem *item, void *user_data)
@@ -309,6 +371,20 @@ static const GtkActionEntry entries[] = {
.label = "Config",
},{
/* menu items */
+ .name = "Connect",
+ .stock_id = GTK_STOCK_CONNECT,
+ .label = "Connect ...",
+ .callback = G_CALLBACK(menu_cb_connect),
+ },{
+ .name = "Reconnect",
+ .label = "Reconnect",
+ .callback = G_CALLBACK(menu_cb_reconnect),
+ },{
+ .name = "Disconnect",
+ .stock_id = GTK_STOCK_DISCONNECT,
+ .label = "Disconnect",
+ .callback = G_CALLBACK(menu_cb_disconnect),
+ },{
.name = "About",
.stock_id = GTK_STOCK_ABOUT,
.label = "_About ...",
@@ -317,7 +393,6 @@ static const GtkActionEntry entries[] = {
.name = "Close",
.stock_id = GTK_STOCK_QUIT,
.label = "_Close",
-// .accelerator = "<control>Q",
.tooltip = "Quit the job",
.callback = G_CALLBACK(menu_cb_quit),
}
@@ -334,9 +409,13 @@ static const GtkToggleActionEntry tentries[] = {
.label = "Show _Pointer",
.callback = G_CALLBACK(menu_cb_show_pointer),
},{
- .name = "ViewOnly",
- .label = "_View only",
- .callback = G_CALLBACK(menu_cb_view_only),
+ .name = "GrabPointer",
+ .label = "Grab Pointer",
+ .callback = G_CALLBACK(menu_cb_grab_pointer),
+ },{
+ .name = "GrabKeyboard",
+ .label = "Grab Keyboard",
+ .callback = G_CALLBACK(menu_cb_grab_keyboard),
}
};
@@ -345,7 +424,12 @@ static char ui_xml[] =
" <popup action='ConfMenu'>"
" <menuitem action='FullScreen'/>"
" <menuitem action='ShowPointer'/>"
-" <menuitem action='ViewOnly'/>"
+" <menuitem action='GrabPointer'/>"
+" <menuitem action='GrabKeyboard'/>"
+" <separator/>"
+" <menuitem action='Connect'/>"
+" <menuitem action='Reconnect'/>"
+" <menuitem action='Disconnect'/>"
" <separator/>"
" <menuitem action='About'/>"
" <menuitem action='Close'/>"
@@ -359,6 +443,8 @@ GtkWidget *vnc_open(char *hostname, int tcpport, unsigned long flags,
int debug_level)
{
GtkWidget *vbox, *hbox, *frame, *item;
+ GtkWidget *ebox, *align;
+ GdkColor bg;
GError *err;
struct vnc_window *vnc;
@@ -368,7 +454,6 @@ GtkWidget *vnc_open(char *hostname, int tcpport, unsigned long flags,
memset(vnc,0,sizeof(*vnc));
vnc->standalone = (flags & VNC_FLAG_STANDALONE);
vnc->showpointer = (flags & VNC_FLAG_SHOW_MOUSE);
- vnc->viewonly = (flags & VNC_FLAG_VIEW_ONLY);
vnc->debug = debug_level;
snprintf(vnc->display, sizeof(vnc->display), "%s:%d",
@@ -382,6 +467,7 @@ GtkWidget *vnc_open(char *hostname, int tcpport, unsigned long flags,
G_CALLBACK(destroy_cb), vnc);
g_signal_connect(G_OBJECT(vnc->win), "window-state-event",
G_CALLBACK(window_state_cb), vnc);
+ gtk_window_set_default_size(GTK_WINDOW(vnc->win), 320, 200);
/* vnc display widget */
vnc->vnc = vnc_display_new();
@@ -397,9 +483,13 @@ GtkWidget *vnc_open(char *hostname, int tcpport, unsigned long flags,
GTK_SIGNAL_FUNC(vnc_ungrab), vnc);
gtk_signal_connect(GTK_OBJECT(vnc->vnc), "vnc-auth-credential",
GTK_SIGNAL_FUNC(vnc_credential), NULL);
- vnc_display_set_pointer_grab(VNC_DISPLAY(vnc->vnc), TRUE);
-// vnc_display_set_keyboard_grab(VNC_DISPLAY(vnc->vnc), TRUE);
-// vnc_display_set_pointer_local(VNC_DISPLAY(vnc->vnc), TRUE);
+
+ ebox = gtk_event_box_new();
+ gtk_event_box_set_visible_window(GTK_EVENT_BOX(ebox), TRUE);
+ gdk_color_parse("darkgray", &bg);
+ gtk_widget_modify_bg(ebox, GTK_STATE_NORMAL, &bg);
+
+ align = gtk_alignment_new(0.5, 0.5, 0,0);
/* popup menu */
vnc->ui = gtk_ui_manager_new();
@@ -423,8 +513,15 @@ GtkWidget *vnc_open(char *hostname, int tcpport, unsigned long flags,
/* popup menu: initial state */
item = gtk_ui_manager_get_widget(vnc->ui, "/ConfMenu/ShowPointer");
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), vnc->showpointer);
- item = gtk_ui_manager_get_widget(vnc->ui, "/ConfMenu/ViewOnly");
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), vnc->viewonly);
+ vnc_display_set_pointer_local(VNC_DISPLAY(vnc->vnc), vnc->showpointer);
+
+ item = gtk_ui_manager_get_widget(vnc->ui, "/ConfMenu/GrabPointer");
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), vnc->grab_pointer);
+ vnc_display_set_pointer_grab(VNC_DISPLAY(vnc->vnc), vnc->grab_pointer);
+
+ item = gtk_ui_manager_get_widget(vnc->ui, "/ConfMenu/GrabKeyboard");
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), vnc->grab_keyboard);
+ vnc_display_set_keyboard_grab(VNC_DISPLAY(vnc->vnc), vnc->grab_keyboard);
/* labels for the status line */
vnc->line = gtk_label_new("status line");
@@ -438,7 +535,9 @@ GtkWidget *vnc_open(char *hostname, int tcpport, unsigned long flags,
vbox = gtk_vbox_new(FALSE, 0);
hbox = gtk_hbox_new(FALSE, 1);
gtk_container_add(GTK_CONTAINER(vnc->win), vbox);
- gtk_box_pack_start(GTK_BOX(vbox), vnc->vnc, TRUE, TRUE, 0);
+ gtk_container_add(GTK_CONTAINER(ebox), align);
+ gtk_container_add(GTK_CONTAINER(align), vnc->vnc);
+ gtk_box_pack_start(GTK_BOX(vbox), ebox, TRUE, TRUE, 0);
gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);
frame = gtk_frame_new(NULL);
@@ -459,8 +558,10 @@ GtkWidget *vnc_open(char *hostname, int tcpport, unsigned long flags,
vnc_window_texts(vnc);
if (flags & VNC_FLAG_FULLSCREEN)
gtk_window_fullscreen(GTK_WINDOW(vnc->win));
-
+
/* connect */
+ vnc->conn_state = CONN_CONNECTING;
+ vnc_window_texts(vnc);
vnc_display_open_host(VNC_DISPLAY(vnc->vnc), vnc->hostname, vnc->tcpport);
return vnc->win;