diff options
author | kraxel <kraxel> | 2007-08-20 11:07:05 +0000 |
---|---|---|
committer | kraxel <kraxel> | 2007-08-20 11:07:05 +0000 |
commit | 01af1cbcc50199d9f7e6e4756500e5cab2382747 (patch) | |
tree | 6ff2434acdd0d0860396b62a5996b412a62ccca5 | |
parent | 93e83f3cdbcd4d9dc31960f6934db89777d4d594 (diff) | |
download | xenwatch-01af1cbcc50199d9f7e6e4756500e5cab2382747.tar.gz |
a bunch of gtk-vnc tweaks
-rw-r--r-- | vnc-old.c | 1 | ||||
-rw-r--r-- | vnc.c | 215 |
2 files changed, 158 insertions, 58 deletions
@@ -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, @@ -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; |