X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkcellrendereraccel.c;h=32f385ea59556f7e2803257a0c4e402407e5726f;hb=a89d420270d1a856e072ed87c365b0176f102e6c;hp=04d5d6de08868107720a693c3789361ec73cada7;hpb=920e8b434367f9aa8aab306721cc024e66892e2e;p=~andy%2Fgtk diff --git a/gtk/gtkcellrendereraccel.c b/gtk/gtkcellrendereraccel.c index 04d5d6de0..32f385ea5 100644 --- a/gtk/gtkcellrendereraccel.c +++ b/gtk/gtkcellrendereraccel.c @@ -12,9 +12,7 @@ * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ #include "config.h" @@ -32,6 +30,21 @@ #include "gtkprivate.h" +/** + * SECTION:gtkcellrendereraccel + * @Short_description: Renders a keyboard accelerator in a cell + * @Title: GtkCellRendererAccel + * + * #GtkCellRendererAccel displays a keyboard accelerator (i.e. a + * key combination like Controla. + * If the cell renderer is editable, the accelerator can be changed by + * simply typing the new combination. + * + * The #GtkCellRendererAccel cell renderer was added in GTK+ 2.10. + */ + + + static void gtk_cell_renderer_accel_get_property (GObject *object, guint param_id, GValue *value, @@ -40,13 +53,11 @@ static void gtk_cell_renderer_accel_set_property (GObject *object, guint param_id, const GValue *value, GParamSpec *pspec); -static void gtk_cell_renderer_accel_get_size (GtkCellRenderer *cell, - GtkWidget *widget, - const GdkRectangle *cell_area, - gint *x_offset, - gint *y_offset, - gint *width, - gint *height); +static void gtk_cell_renderer_accel_get_preferred_width + (GtkCellRenderer *cell, + GtkWidget *widget, + gint *minimum_size, + gint *natural_size); static GtkCellEditable * gtk_cell_renderer_accel_start_editing (GtkCellRenderer *cell, GdkEvent *event, @@ -76,8 +87,6 @@ enum { struct _GtkCellRendererAccelPrivate { - GtkCellRendererAccelMode accel_mode; - GtkWidget *edit_widget; GtkWidget *grab_widget; GtkWidget *sizing_label; @@ -85,6 +94,8 @@ struct _GtkCellRendererAccelPrivate GdkDevice *grab_keyboard; GdkDevice *grab_pointer; + GtkCellRendererAccelMode accel_mode; + GdkModifierType accel_mods; guint accel_key; @@ -121,7 +132,7 @@ gtk_cell_renderer_accel_class_init (GtkCellRendererAccelClass *cell_accel_class) object_class->set_property = gtk_cell_renderer_accel_set_property; object_class->get_property = gtk_cell_renderer_accel_get_property; - cell_renderer_class->get_size = gtk_cell_renderer_accel_get_size; + cell_renderer_class->get_preferred_width = gtk_cell_renderer_accel_get_preferred_width; cell_renderer_class->start_editing = gtk_cell_renderer_accel_start_editing; /** @@ -286,18 +297,9 @@ convert_keysym_state_to_string (GtkCellRendererAccel *accel, { gchar *name; - name = gtk_accelerator_get_label (keysym, mask); + name = gtk_accelerator_get_label_with_keycode (NULL, keysym, keycode, mask); if (name == NULL) - name = gtk_accelerator_name (keysym, mask); - - if (keysym == 0) - { - gchar *tmp; - - tmp = name; - name = g_strdup_printf ("%s0x%02x", tmp, keycode); - g_free (tmp); - } + name = gtk_accelerator_name_with_keycode (NULL, keysym, keycode, mask); return name; } @@ -401,31 +403,28 @@ gtk_cell_renderer_accel_set_property (GObject *object, } static void -gtk_cell_renderer_accel_get_size (GtkCellRenderer *cell, - GtkWidget *widget, - const GdkRectangle *cell_area, - gint *x_offset, - gint *y_offset, - gint *width, - gint *height) +gtk_cell_renderer_accel_get_preferred_width (GtkCellRenderer *cell, + GtkWidget *widget, + gint *minimum_size, + gint *natural_size) { GtkCellRendererAccelPrivate *priv = GTK_CELL_RENDERER_ACCEL (cell)->priv; - GtkRequisition requisition; + GtkRequisition min_req, nat_req; if (priv->sizing_label == NULL) - priv->sizing_label = gtk_label_new (_("New accelerator...")); + priv->sizing_label = gtk_label_new (_("New accelerator…")); - gtk_widget_get_preferred_size (priv->sizing_label, &requisition, NULL); + gtk_widget_get_preferred_size (priv->sizing_label, &min_req, &nat_req); - GTK_CELL_RENDERER_CLASS (gtk_cell_renderer_accel_parent_class)->get_size (cell, widget, cell_area, - x_offset, y_offset, width, height); + GTK_CELL_RENDERER_CLASS (gtk_cell_renderer_accel_parent_class)->get_preferred_width (cell, widget, + minimum_size, natural_size); /* FIXME: need to take the cell_area et al. into account */ - if (width) - *width = MAX (*width, requisition.width); - if (height) - *height = MAX (*height, requisition.height); + if (minimum_size) + *minimum_size = MAX (*minimum_size, min_req.width); + if (natural_size) + *natural_size = MAX (*natural_size, nat_req.width); } static gboolean @@ -436,6 +435,7 @@ grab_key_callback (GtkWidget *widget, GtkCellRendererAccelPrivate *priv = accel->priv; GdkModifierType accel_mods = 0; guint accel_key; + guint keyval; gchar *path; gboolean edited; gboolean cleared; @@ -450,17 +450,32 @@ grab_key_callback (GtkWidget *widget, edited = FALSE; cleared = FALSE; - gdk_keymap_translate_keyboard_state (gdk_keymap_get_for_display (display), - event->hardware_keycode, - event->state, - event->group, - NULL, NULL, NULL, &consumed_modifiers); + accel_mods = event->state; + + if (event->keyval == GDK_KEY_Sys_Req && + (accel_mods & GDK_MOD1_MASK) != 0) + { + /* HACK: we don't want to use SysRq as a keybinding (but we do + * want Alt+Print), so we avoid translation from Alt+Print to SysRq + */ + keyval = GDK_KEY_Print; + consumed_modifiers = 0; + } + else + { + _gtk_translate_keyboard_accel_state (gdk_keymap_get_for_display (display), + event->hardware_keycode, + event->state, + gtk_accelerator_get_default_mod_mask (), + event->group, + &keyval, NULL, NULL, &consumed_modifiers); + } - accel_key = gdk_keyval_to_lower (event->keyval); + accel_key = gdk_keyval_to_lower (keyval); if (accel_key == GDK_KEY_ISO_Left_Tab) accel_key = GDK_KEY_Tab; - accel_mods = event->state & gtk_accelerator_get_default_mod_mask (); + accel_mods &= gtk_accelerator_get_default_mod_mask (); /* Filter consumed modifiers */ @@ -469,22 +484,22 @@ grab_key_callback (GtkWidget *widget, /* Put shift back if it changed the case of the key, not otherwise. */ - if (accel_key != event->keyval) + if (accel_key != keyval) accel_mods |= GDK_SHIFT_MASK; if (accel_mods == 0) { - switch (event->keyval) - { - case GDK_KEY_Escape: - goto out; /* cancel */ - case GDK_KEY_BackSpace: - /* clear the accelerator on Backspace */ - cleared = TRUE; - goto out; - default: - break; - } + switch (keyval) + { + case GDK_KEY_Escape: + goto out; /* cancel */ + case GDK_KEY_BackSpace: + /* clear the accelerator on Backspace */ + cleared = TRUE; + goto out; + default: + break; + } } if (priv->accel_mode == GTK_CELL_RENDERER_ACCEL_MODE_GTK) @@ -564,6 +579,8 @@ struct _GtkCellEditableEventBox gboolean editing_canceled; }; +GType _gtk_cell_editable_event_box_get_type (void); + G_DEFINE_TYPE_WITH_CODE (GtkCellEditableEventBox, _gtk_cell_editable_event_box, GTK_TYPE_EVENT_BOX, { \ G_IMPLEMENT_INTERFACE (GTK_TYPE_CELL_EDITABLE, _gtk_cell_editable_event_box_cell_editable_init) \ }) @@ -641,7 +658,8 @@ gtk_cell_renderer_accel_start_editing (GtkCellRenderer *cell, GtkCellRendererAccelPrivate *priv; GtkCellRendererText *celltext; GtkCellRendererAccel *accel; - GtkStyle *style; + GtkStyleContext *context; + GdkRGBA color; GtkWidget *label; GtkWidget *eventbox; GdkDevice *device, *keyb, *pointer; @@ -659,7 +677,7 @@ gtk_cell_renderer_accel_start_editing (GtkCellRenderer *cell, return NULL; window = gtk_widget_get_window (widget); - style = gtk_widget_get_style (widget); + context = gtk_widget_get_style_context (widget); g_return_val_if_fail (window != NULL, NULL); @@ -713,21 +731,20 @@ gtk_cell_renderer_accel_start_editing (GtkCellRenderer *cell, (gpointer) &priv->edit_widget); label = gtk_label_new (NULL); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - - + gtk_widget_set_halign (label, GTK_ALIGN_START); + gtk_widget_set_valign (label, GTK_ALIGN_CENTER); - gtk_widget_modify_bg (eventbox, GTK_STATE_NORMAL, - &style->bg[GTK_STATE_SELECTED]); + gtk_style_context_get_background_color (context, GTK_STATE_FLAG_SELECTED, &color); + gtk_widget_override_background_color (eventbox, 0, &color); - gtk_widget_modify_fg (label, GTK_STATE_NORMAL, - &style->fg[GTK_STATE_SELECTED]); + gtk_style_context_get_color (context, GTK_STATE_FLAG_SELECTED, &color); + gtk_widget_override_color (label, 0, &color); /* This label is displayed in a treeview cell displaying * an accelerator when the cell is clicked to change the * acelerator. */ - gtk_label_set_text (GTK_LABEL (label), _("New accelerator...")); + gtk_label_set_text (GTK_LABEL (label), _("New accelerator…")); gtk_container_add (GTK_CONTAINER (eventbox), label);