#define DEFAULT_WINDOW_HEIGHT 600
#define CURSOR_INFO_WIDTH 150
-#define ZOOM_INFO_WIDTH 50
+#define ZOOM_INFO_WIDTH 75
/*===========================================================================*/
/*===========================================================================*/
static void gl_window_finalize (GObject *object);
-static void gl_window_destroy (GtkObject *gtk_object);
+static void gl_window_dispose (GObject *object);
static void set_window_title (glWindow *window,
glLabel *label);
static void modified_changed_cb (glLabel *label,
glWindow *window);
+static void clipboard_changed_cb (GtkClipboard *clipboard,
+ GdkEvent *event,
+ glWindow *window);
+
+static void focus_widget_changed_cb(GtkWindow *gtk_window,
+ GtkWidget *widget,
+ glWindow *window);
+
+static void set_copy_paste_sensitivity (glWindow *window,
+ GtkWidget *focus_widget);
+
+static void label_changed_cb (glLabel *label,
+ glWindow *window);
+
/****************************************************************************/
/* Boilerplate Object stuff. */
gl_window_class_init (glWindowClass *class)
{
GObjectClass *object_class = G_OBJECT_CLASS (class);
- GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (class);
gl_debug (DEBUG_WINDOW, "START");
gl_window_parent_class = g_type_class_peek_parent (class);
object_class->finalize = gl_window_finalize;
-
- gtk_object_class->destroy = gl_window_destroy;
+ object_class->dispose = gl_window_dispose;
gl_debug (DEBUG_WINDOW, "END");
}
gtk_box_pack_start (GTK_BOX (vbox1), status_hbox, FALSE, FALSE, 0);
window->status_bar = gtk_statusbar_new ();
- gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (window->status_bar), FALSE);
gtk_box_pack_start (GTK_BOX (status_hbox),
window->status_bar,
TRUE, TRUE, 0);
static void
-gl_window_destroy (GtkObject *gtk_object)
+gl_window_dispose (GObject *object)
{
- glWindow *window;
+ glWindow *window;
+ GtkClipboard *clipboard;
gl_debug (DEBUG_WINDOW, "START");
- g_return_if_fail (gtk_object != NULL);
- g_return_if_fail (GL_IS_WINDOW (gtk_object));
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (GL_IS_WINDOW (object));
- window = GL_WINDOW (gtk_object);
+ window = GL_WINDOW (object);
window_list = g_list_remove (window_list, window);
if (window->ui) {
window->ui = NULL;
}
- if (GTK_OBJECT_CLASS (gl_window_parent_class)->destroy) {
- GTK_OBJECT_CLASS (gl_window_parent_class)->destroy (gtk_object);
+ if (window->label)
+ {
+ clipboard = gtk_widget_get_clipboard (GTK_WIDGET (window),
+ GDK_SELECTION_CLIPBOARD);
+
+ g_signal_handlers_disconnect_by_func (G_OBJECT (clipboard),
+ G_CALLBACK (clipboard_changed_cb),
+ window);
+
+ g_object_unref (window->label);
+ }
+
+ if (G_OBJECT_CLASS (gl_window_parent_class)->dispose) {
+ G_OBJECT_CLASS (gl_window_parent_class)->dispose (object);
}
gl_debug (DEBUG_WINDOW, "END");
gl_window_set_label (glWindow *window,
glLabel *label)
{
- gchar *string;
+ gchar *string;
+ GtkClipboard *clipboard;
+ GtkWidget *focus_widget;
gl_debug (DEBUG_WINDOW, "START");
g_return_if_fail (GL_IS_WINDOW (window));
g_return_if_fail (GL_IS_LABEL (label));
- window->label = label;
+ window->label = g_object_ref (label);
gl_label_clear_modified (label);
gtk_label_set_text (GTK_LABEL(window->zoom_info), string);
g_free (string);
+
+ clipboard = gtk_widget_get_clipboard (GTK_WIDGET (window),
+ GDK_SELECTION_CLIPBOARD);
+
+
g_signal_connect (G_OBJECT(window->label), "selection_changed",
G_CALLBACK(selection_changed_cb), window);
g_signal_connect (G_OBJECT(label), "modified_changed",
G_CALLBACK(modified_changed_cb), window);
+ g_signal_connect (G_OBJECT(clipboard), "owner_change",
+ G_CALLBACK(clipboard_changed_cb), window);
+
+ g_signal_connect (G_OBJECT(window), "set_focus",
+ G_CALLBACK(focus_widget_changed_cb), window);
+
+ /* Initialize "Paste" sensitivity. */
+ focus_widget = gtk_window_get_focus (GTK_WINDOW (window));
+ set_copy_paste_sensitivity (window, focus_widget);
+
+ g_signal_connect (G_OBJECT(label), "changed",
+ G_CALLBACK(label_changed_cb), window);
+
gl_debug (DEBUG_WINDOW, "END");
}
g_return_if_fail (label && GL_IS_LABEL (label));
g_return_if_fail (window && GL_IS_WINDOW (window));
- gl_ui_update_selection_verbs (window->ui, GL_VIEW (window->view));
+ gl_ui_update_selection_verbs (window->ui, GL_VIEW (window->view), TRUE);
gl_debug (DEBUG_WINDOW, "END");
}
}
+/*---------------------------------------------------------------------------*/
+/** PRIVATE. Label "changed" callback. */
+/*---------------------------------------------------------------------------*/
+static void
+label_changed_cb (glLabel *label,
+ glWindow *window)
+{
+ gl_debug (DEBUG_WINDOW, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+ g_return_if_fail (window && GL_IS_WINDOW (window));
+
+ gl_ui_update_undo_redo_verbs (window->ui, label);
+
+ gl_debug (DEBUG_WINDOW, "END");
+}
+
+
+
+/*---------------------------------------------------------------------------*/
+/** PRIVATE. Clipboard "owner change" callback. */
+/*---------------------------------------------------------------------------*/
+static void
+clipboard_changed_cb (GtkClipboard *clipboard,
+ GdkEvent *event,
+ glWindow *window)
+{
+ GtkWidget *focus_widget;
+
+ gl_debug (DEBUG_WINDOW, "START");
+
+ g_return_if_fail (window && GL_IS_WINDOW (window));
+
+ focus_widget = gtk_window_get_focus (GTK_WINDOW (window));
+ set_copy_paste_sensitivity (window, focus_widget);
+
+ gl_debug (DEBUG_WINDOW, "END");
+}
+
+
+/*---------------------------------------------------------------------------*/
+/** PRIVATE. Window "set-focus" callback. */
+/*---------------------------------------------------------------------------*/
+static void
+focus_widget_changed_cb (GtkWindow *gtk_window,
+ GtkWidget *widget,
+ glWindow *window)
+{
+ gl_debug (DEBUG_WINDOW, "START");
+
+ g_return_if_fail (window && GL_IS_WINDOW (window));
+
+ if (widget)
+ {
+ gl_debug (DEBUG_WINDOW, "SET-FOCUS %x %s\n",
+ widget,
+ G_OBJECT_TYPE_NAME (widget));
+
+ set_copy_paste_sensitivity (window, widget);
+ }
+
+ gl_debug (DEBUG_WINDOW, "END");
+}
+
+
+/*---------------------------------------------------------------------------*/
+/** PRIVATE. Set paste sensitivity. */
+/*---------------------------------------------------------------------------*/
+static void
+set_copy_paste_sensitivity (glWindow *window,
+ GtkWidget *focus_widget)
+{
+ gl_debug (DEBUG_WINDOW, "START");
+
+ g_return_if_fail (window && GL_IS_WINDOW (window));
+
+ if ( focus_widget == GL_VIEW(window->view)->canvas )
+ {
+ gl_ui_update_selection_verbs (window->ui, GL_VIEW (window->view), TRUE);
+
+ gl_ui_update_paste_verbs (window->ui, gl_label_can_paste (window->label));
+ }
+ else
+ {
+ gl_ui_update_selection_verbs (window->ui, GL_VIEW (window->view), FALSE);
+ gl_ui_update_paste_verbs (window->ui, FALSE);
+ }
+
+ gl_debug (DEBUG_WINDOW, "END");
+}
+
/*
* Local Variables: -- emacs