gtk+ r22016 - in trunk: . gtk



Author: matthiasc
Date: Wed Dec 31 02:32:21 2008
New Revision: 22016
URL: http://svn.gnome.org/viewvc/gtk+?rev=22016&view=rev

Log:
Redo the Caps Lock warning using an icon


Modified:
   trunk/ChangeLog
   trunk/gtk/gtkentry.c

Modified: trunk/gtk/gtkentry.c
==============================================================================
--- trunk/gtk/gtkentry.c	(original)
+++ trunk/gtk/gtkentry.c	Wed Dec 31 02:32:21 2008
@@ -124,6 +124,7 @@
   guint real_changed            : 1;
   guint invisible_char_set      : 1;
   guint caps_lock_warning       : 1;
+  guint caps_lock_warning_shown : 1;
   guint change_count            : 8;
   guint progress_pulse_mode     : 1;
   guint progress_pulse_way_back : 1;
@@ -2029,6 +2030,7 @@
   priv->shadow_type = GTK_SHADOW_IN;
   priv->xalign = 0.0;
   priv->caps_lock_warning = TRUE;
+  priv->caps_lock_warning_shown = FALSE;
   priv->progress_fraction = 0.0;
   priv->progress_pulse_fraction = 0.1;
 
@@ -9357,138 +9359,34 @@
 /* Caps Lock warning for password entries */
 
 static void
-capslock_feedback_free (GtkEntryCapslockFeedback *feedback)
+show_capslock_feedback (GtkEntry    *entry,
+                        const gchar *text)
 {
-  if (feedback->window)
-    gtk_widget_destroy (feedback->window);
-
-  g_slice_free (GtkEntryCapslockFeedback, feedback);
-}
-
-static gboolean
-capslock_feedback_expose_event_cb (GtkWidget                *widget,
-                                   GdkEventExpose           *event,
-                                   GtkEntryCapslockFeedback *feedback)
-{
-  gtk_paint_flat_box (feedback->window->style,
-                      feedback->window->window,
-                      GTK_STATE_NORMAL,
-                      GTK_SHADOW_OUT,
-                      NULL,
-                      feedback->window,
-                      "tooltip",
-                      0, 0,
-                      feedback->window->allocation.width,
-                      feedback->window->allocation.height);
-  return FALSE;
-}
-
-static gboolean
-capslock_feedback_enter_notify (GtkWidget                *widget,
-                                GdkEventCrossing         *event,
-                                GtkEntryCapslockFeedback *feedback)
-{
-  remove_capslock_feedback (GTK_ENTRY (feedback->entry));
-  return TRUE;
-}
-
-static void
-create_capslock_feedback_window (GtkEntryCapslockFeedback *feedback)
-{
-  GtkWidget *window;
-  GtkWidget *alignment;
-  GtkWidget *label;
-  
-  /* Keep in sync with gtk_tooltip_init() */
-  window = feedback->window = gtk_window_new (GTK_WINDOW_POPUP);
-  gtk_window_set_type_hint (GTK_WINDOW (window), GDK_WINDOW_TYPE_HINT_TOOLTIP);
-  gtk_widget_set_app_paintable (window, TRUE);
-  gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
-  gtk_widget_set_name (window, "gtk-tooltip");
-
-  alignment = gtk_alignment_new (0.5, 0.5, 1.0, 1.0);
-  gtk_alignment_set_padding (GTK_ALIGNMENT (alignment),
-                             window->style->ythickness, 
-                             window->style->ythickness,
-                             window->style->xthickness,
-                             window->style->xthickness);
-  gtk_container_add (GTK_CONTAINER (window), alignment);
-  gtk_widget_show (alignment);
-
-  g_signal_connect (window, "expose-event",
-                    G_CALLBACK (capslock_feedback_expose_event_cb), feedback);
-  g_signal_connect (window, "enter-notify-event",
-                    G_CALLBACK (capslock_feedback_enter_notify), feedback);
-
-  label = feedback->label = gtk_label_new (NULL);
-  gtk_container_add (GTK_CONTAINER (alignment), label);
-  gtk_widget_show (label);
-}
-
-static void
-show_capslock_feedback_window (GtkEntryCapslockFeedback *feedback)
-{
-  GtkRequisition feedback_req;
-  gint entry_x, entry_y;
-  GtkAllocation *entry_allocation;
-  int feedback_x, feedback_y;
-  GdkScreen *screen;
-  gint monitor_num;
-  GdkRectangle monitor;
-  GtkWidget *entry;
-
-  entry = feedback->entry;
-  screen = gtk_widget_get_screen (entry);
-  monitor_num = gdk_screen_get_monitor_at_window (screen, entry->window);
-  gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor);
-
-  feedback = g_object_get_qdata (G_OBJECT (entry), quark_capslock_feedback);
-
-  gtk_widget_size_request (feedback->window, &feedback_req);
-
-  gdk_window_get_origin (entry->window, &entry_x, &entry_y);
-  entry_allocation = &(entry->allocation);
-
-  if (entry_x + feedback_req.width <= monitor.x + monitor.width)
-      feedback_x = MAX (entry_x, monitor.x);
-  else
-    feedback_x = monitor.x + monitor.width - feedback_req.width;
-
-  if (entry_y + entry_allocation->height + feedback_req.height <= monitor.y + monitor.height)
-    feedback_y = entry_y + entry_allocation->height;
-  else
-    feedback_y = MAX (entry_y - feedback_req.height, monitor.y);
-
-  gtk_window_move (GTK_WINDOW (feedback->window), feedback_x, feedback_y);
-  gtk_widget_show (feedback->window);
-}
-
-static void
-pop_up_capslock_feedback (GtkEntry    *entry,
-                          const gchar *text)
-{
-  GtkEntryCapslockFeedback *feedback;
-
-  feedback = g_object_get_qdata (G_OBJECT (entry), quark_capslock_feedback);
+  GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry);
 
-  if (feedback == NULL)
+  if (gtk_entry_get_storage_type (entry, GTK_ENTRY_ICON_SECONDARY) == GTK_IMAGE_EMPTY)
     {
-      feedback = g_slice_new0 (GtkEntryCapslockFeedback);
-      feedback->entry = GTK_WIDGET (entry);
-      g_object_set_qdata_full (G_OBJECT (entry), quark_capslock_feedback,
-                               feedback,
-                               (GDestroyNotify) capslock_feedback_free);
-      create_capslock_feedback_window (feedback);
+      gtk_entry_set_icon_from_stock (entry, GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_INFO);
+      gtk_entry_set_icon_activatable (entry, GTK_ENTRY_ICON_SECONDARY, FALSE);
+      priv->caps_lock_warning_shown = TRUE;
     }
 
-  gtk_label_set_text (GTK_LABEL (feedback->label), text);
-  show_capslock_feedback_window (feedback);
+  if (priv->caps_lock_warning_shown)
+    gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_SECONDARY, text);
+  else
+    g_warning ("Can't show Caps Lock warning, since secondary icon is set");
 }
 
 static void
 remove_capslock_feedback (GtkEntry *entry)
 {
-  g_object_set_qdata (G_OBJECT (entry), quark_capslock_feedback, NULL);
+  GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry);
+
+  if (priv->caps_lock_warning_shown)
+    {
+      gtk_entry_set_icon_from_stock (entry, GTK_ENTRY_ICON_SECONDARY, NULL);
+      priv->caps_lock_warning_shown = FALSE;
+    } 
 }
 
 static void
@@ -9514,7 +9412,7 @@
     }
 
   if (text)
-    pop_up_capslock_feedback (entry, text);
+    show_capslock_feedback (entry, text);
   else
     remove_capslock_feedback (entry);
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]