diff options
Diffstat (limited to 'src/widgets')
-rw-r--r-- | src/widgets/styles/qgtkstyle.cpp | 41 | ||||
-rw-r--r-- | src/widgets/styles/qgtkstyle_p.cpp | 33 | ||||
-rw-r--r-- | src/widgets/styles/qgtkstyle_p.h | 16 |
3 files changed, 70 insertions, 20 deletions
diff --git a/src/widgets/styles/qgtkstyle.cpp b/src/widgets/styles/qgtkstyle.cpp index 4a7f972436..dc79e45e13 100644 --- a/src/widgets/styles/qgtkstyle.cpp +++ b/src/widgets/styles/qgtkstyle.cpp @@ -1056,7 +1056,7 @@ void QGtkStyle::drawPrimitive(PrimitiveElement element, if (isActive ) { // Required for active/non-active window appearance key = QLS("a"); - GTK_WIDGET_SET_FLAGS(gtkTreeView, GTK_HAS_FOCUS); + QGtkStylePrivate::gtkWidgetSetFocus(gtkTreeView, true); } bool isEnabled = (widget ? widget->isEnabled() : (vopt->state & QStyle::State_Enabled)); gtkPainter.paintFlatBox(gtkTreeView, detail, option->rect, @@ -1064,7 +1064,7 @@ void QGtkStyle::drawPrimitive(PrimitiveElement element, isEnabled ? GTK_STATE_NORMAL : GTK_STATE_INSENSITIVE, GTK_SHADOW_OUT, d->gtk_widget_get_style(gtkTreeView), key); if (isActive ) - GTK_WIDGET_UNSET_FLAGS(gtkTreeView, GTK_HAS_FOCUS); + QGtkStylePrivate::gtkWidgetSetFocus(gtkTreeView, false); } } break; @@ -1193,7 +1193,7 @@ void QGtkStyle::drawPrimitive(PrimitiveElement element, rect.adjust(focus_line_width, focus_line_width, -focus_line_width, -focus_line_width); if (option->state & State_HasFocus) - GTK_WIDGET_SET_FLAGS(gtkEntry, GTK_HAS_FOCUS); + QGtkStylePrivate::gtkWidgetSetFocus(gtkEntry, true); gtkPainter.paintShadow(gtkEntry, "entry", rect, option->state & State_Enabled ? GTK_STATE_NORMAL : GTK_STATE_INSENSITIVE, GTK_SHADOW_IN, d->gtk_widget_get_style(gtkEntry), @@ -1204,7 +1204,7 @@ void QGtkStyle::drawPrimitive(PrimitiveElement element, GTK_SHADOW_IN, d->gtk_widget_get_style(gtkEntry), QLS("GtkEntryShadowIn")); if (option->state & State_HasFocus) - GTK_WIDGET_UNSET_FLAGS(gtkEntry, GTK_HAS_FOCUS); + QGtkStylePrivate::gtkWidgetSetFocus(gtkEntry, false); } break; @@ -1292,7 +1292,8 @@ void QGtkStyle::drawPrimitive(PrimitiveElement element, QString key; if (isDefault) { key += QLS("def"); - GTK_WIDGET_SET_FLAGS(gtkButton, GTK_HAS_DEFAULT); + QGtkStylePrivate::gtk_widget_set_can_default(gtkButton, true); + QGtkStylePrivate::gtk_window_set_default((GtkWindow*)QGtkStylePrivate::gtk_widget_get_toplevel(gtkButton), gtkButton); gtkPainter.paintBox(gtkButton, "buttondefault", buttonRect, state, GTK_SHADOW_IN, style, isDefault ? QLS("d") : QString()); } @@ -1301,7 +1302,7 @@ void QGtkStyle::drawPrimitive(PrimitiveElement element, if (hasFocus) { key += QLS("def"); - GTK_WIDGET_SET_FLAGS(gtkButton, GTK_HAS_FOCUS); + QGtkStylePrivate::gtkWidgetSetFocus(gtkButton, true); } if (!interiorFocus) @@ -1313,9 +1314,9 @@ void QGtkStyle::drawPrimitive(PrimitiveElement element, gtkPainter.paintBox(gtkButton, "button", buttonRect, state, shadow, style, key); if (isDefault) - GTK_WIDGET_UNSET_FLAGS(gtkButton, GTK_HAS_DEFAULT); + QGtkStylePrivate::gtk_window_set_default((GtkWindow*)QGtkStylePrivate::gtk_widget_get_toplevel(gtkButton), 0); if (hasFocus) - GTK_WIDGET_UNSET_FLAGS(gtkButton, GTK_HAS_FOCUS); + QGtkStylePrivate::gtkWidgetSetFocus(gtkButton, false); } break; @@ -1344,11 +1345,11 @@ void QGtkStyle::drawPrimitive(PrimitiveElement element, QString key(QLS("radiobutton")); if (option->state & State_HasFocus) { // Themes such as Nodoka check this flag key += QLatin1Char('f'); - GTK_WIDGET_SET_FLAGS(gtkCheckButton, GTK_HAS_FOCUS); + QGtkStylePrivate::gtkWidgetSetFocus(gtkCheckButton, true); } gtkPainter.paintOption(gtkCheckButton , buttonRect, state, shadow, d->gtk_widget_get_style(gtkRadioButton), key); if (option->state & State_HasFocus) - GTK_WIDGET_UNSET_FLAGS(gtkCheckButton, GTK_HAS_FOCUS); + QGtkStylePrivate::gtkWidgetSetFocus(gtkCheckButton, false); } break; @@ -1372,7 +1373,7 @@ void QGtkStyle::drawPrimitive(PrimitiveElement element, QString key(QLS("checkbutton")); if (option->state & State_HasFocus) { // Themes such as Nodoka checks this flag key += QLatin1Char('f'); - GTK_WIDGET_SET_FLAGS(gtkCheckButton, GTK_HAS_FOCUS); + QGtkStylePrivate::gtkWidgetSetFocus(gtkCheckButton, true); } // Some styles such as aero-clone assume they can paint in the spacing area @@ -1385,7 +1386,7 @@ void QGtkStyle::drawPrimitive(PrimitiveElement element, gtkPainter.paintCheckbox(gtkCheckButton, checkRect, state, shadow, d->gtk_widget_get_style(gtkCheckButton), key); if (option->state & State_HasFocus) - GTK_WIDGET_UNSET_FLAGS(gtkCheckButton, GTK_HAS_FOCUS); + QGtkStylePrivate::gtkWidgetSetFocus(gtkCheckButton, false); } break; @@ -1848,7 +1849,7 @@ void QGtkStyle::drawComplexControl(ComplexControl control, const QStyleOptionCom d->gtk_widget_set_direction(gtkToggleButton, reverse ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR); if (gtkToggleButton && (appears_as_list || comboBox->editable)) { if (focus) - GTK_WIDGET_SET_FLAGS(gtkToggleButton, GTK_HAS_FOCUS); + QGtkStylePrivate::gtkWidgetSetFocus(gtkToggleButton, true); // Draw the combo box as a line edit with a button next to it if (comboBox->editable || appears_as_list) { GtkStateType frameState = (state == GTK_STATE_PRELIGHT) ? GTK_STATE_NORMAL : state; @@ -1870,7 +1871,7 @@ void QGtkStyle::drawComplexControl(ComplexControl control, const QStyleOptionCom -gtkEntryStyle->xthickness, -gtkEntryStyle->ythickness); // Required for inner blue highlight with clearlooks if (focus) - GTK_WIDGET_SET_FLAGS(gtkEntry, GTK_HAS_FOCUS); + QGtkStylePrivate::gtkWidgetSetFocus(gtkEntry, true); if (widget && widget->testAttribute(Qt::WA_SetPalette) && resolve_mask & (1 << QPalette::Base)) // Palette overridden by user @@ -1886,7 +1887,7 @@ void QGtkStyle::drawComplexControl(ComplexControl control, const QStyleOptionCom QString::number(focus) + QString::number(comboBox->editable) + QString::number(option->direction)); if (focus) - GTK_WIDGET_UNSET_FLAGS(gtkEntry, GTK_HAS_FOCUS); + QGtkStylePrivate::gtkWidgetSetFocus(gtkEntry, false); } GtkStateType buttonState = GTK_STATE_NORMAL; @@ -1903,20 +1904,20 @@ void QGtkStyle::drawComplexControl(ComplexControl control, const QStyleOptionCom shadow, d->gtk_widget_get_style(gtkToggleButton), buttonPath.toString() + QString::number(focus) + QString::number(option->direction)); if (focus) - GTK_WIDGET_UNSET_FLAGS(gtkToggleButton, GTK_HAS_FOCUS); + QGtkStylePrivate::gtkWidgetSetFocus(gtkToggleButton, false); } else { // Draw combo box as a button QRect buttonRect = option->rect; GtkStyle *gtkToggleButtonStyle = d->gtk_widget_get_style(gtkToggleButton); if (focus) // Clearlooks actually check the widget for the default state - GTK_WIDGET_SET_FLAGS(gtkToggleButton, GTK_HAS_FOCUS); + QGtkStylePrivate::gtkWidgetSetFocus(gtkToggleButton, true); gtkCachedPainter.paintBox(gtkToggleButton, "button", buttonRect, state, shadow, gtkToggleButtonStyle, buttonPath.toString() + QString::number(focus)); if (focus) - GTK_WIDGET_UNSET_FLAGS(gtkToggleButton, GTK_HAS_FOCUS); + QGtkStylePrivate::gtkWidgetSetFocus(gtkToggleButton, false); // Draw the separator between label and arrows @@ -2329,7 +2330,7 @@ void QGtkStyle::drawComplexControl(ComplexControl control, const QStyleOptionCom if (option->state & State_HasFocus) { key += QLatin1Char('f'); - GTK_WIDGET_SET_FLAGS(gtkSpinButton, GTK_HAS_FOCUS); + QGtkStylePrivate::gtkWidgetSetFocus(gtkSpinButton, true); } uint resolve_mask = option->palette.resolve(); @@ -2366,7 +2367,7 @@ void QGtkStyle::drawComplexControl(ComplexControl control, const QStyleOptionCom gtkPainter.paintBox( gtkSpinButton, "spinbutton_down", downRect, GTK_STATE_NORMAL, GTK_SHADOW_OUT, style, key); if (option->state & State_HasFocus) - GTK_WIDGET_UNSET_FLAGS(gtkSpinButton, GTK_HAS_FOCUS); + QGtkStylePrivate::gtkWidgetSetFocus(gtkSpinButton, false); } } diff --git a/src/widgets/styles/qgtkstyle_p.cpp b/src/widgets/styles/qgtkstyle_p.cpp index 3bd5688f31..be0dbdb1db 100644 --- a/src/widgets/styles/qgtkstyle_p.cpp +++ b/src/widgets/styles/qgtkstyle_p.cpp @@ -175,11 +175,18 @@ Ptr_gtk_window_get_type QGtkStylePrivate::gtk_window_get_type = 0; Ptr_gtk_widget_get_type QGtkStylePrivate::gtk_widget_get_type = 0; Ptr_gtk_widget_get_parent QGtkStylePrivate::gtk_widget_get_parent = 0; Ptr_gtk_widget_is_toplevel QGtkStylePrivate::gtk_widget_is_toplevel = 0; +Ptr_gtk_widget_get_toplevel QGtkStylePrivate::gtk_widget_get_toplevel = 0; Ptr_gtk_rc_get_style_by_paths QGtkStylePrivate::gtk_rc_get_style_by_paths = 0; Ptr_gtk_check_version QGtkStylePrivate::gtk_check_version = 0; Ptr_gtk_border_free QGtkStylePrivate::gtk_border_free = 0; Ptr_gtk_widget_get_allocation QGtkStylePrivate::gtk_widget_get_allocation = 0; Ptr_gtk_widget_set_allocation QGtkStylePrivate::gtk_widget_set_allocation = 0; +Ptr_gtk_widget_set_can_default QGtkStylePrivate::gtk_widget_set_can_default = 0; +Ptr_gtk_window_set_default QGtkStylePrivate::gtk_window_set_default = 0; + +Ptr_gdk_event_new QGtkStylePrivate::gdk_event_new = 0; +Ptr_gdk_event_free QGtkStylePrivate::gdk_event_free = 0; +Ptr_gtk_widget_send_focus_change QGtkStylePrivate::gtk_widget_send_focus_change = 0; Ptr_pango_font_description_get_size QGtkStylePrivate::pango_font_description_get_size = 0; Ptr_pango_font_description_get_weight QGtkStylePrivate::pango_font_description_get_weight = 0; @@ -324,6 +331,24 @@ GtkStyle* QGtkStylePrivate::gtkStyle(const QHashableLatin1Literal &path) return 0; } +void QGtkStylePrivate::gtkWidgetSetFocus(GtkWidget *widget, bool focus) +{ + if (QGtkStylePrivate::gtk_widget_send_focus_change) { + GdkEvent *event = QGtkStylePrivate::gdk_event_new(GDK_FOCUS_CHANGE); + event->focus_change.type = GDK_FOCUS_CHANGE; + event->focus_change.in = focus; + QGtkStylePrivate::gtk_widget_send_focus_change(widget, event); + QGtkStylePrivate::gdk_event_free(event); + } else { +#if defined(GTK_WIDGET_SET_FLAGS) && defined(GTK_WIDGET_UNSET_FLAGS) + if (focus) + GTK_WIDGET_SET_FLAGS(widget, GTK_HAS_FOCUS); + else + GTK_WIDGET_UNSET_FLAGS(widget, GTK_HAS_FOCUS); +#endif + } +} + /*! \internal * Get references to gtk functions after we dynamically load the library. */ @@ -445,6 +470,7 @@ void QGtkStylePrivate::resolveGtk() const gtk_widget_get_type =(Ptr_gtk_widget_get_type)libgtk.resolve("gtk_widget_get_type"); gtk_widget_get_parent =(Ptr_gtk_widget_get_parent)libgtk.resolve("gtk_widget_get_parent"); gtk_widget_is_toplevel =(Ptr_gtk_widget_is_toplevel)libgtk.resolve("gtk_widget_is_toplevel"); + gtk_widget_get_toplevel =(Ptr_gtk_widget_get_toplevel)libgtk.resolve("gtk_widget_get_toplevel"); gtk_rc_get_style_by_paths =(Ptr_gtk_rc_get_style_by_paths)libgtk.resolve("gtk_rc_get_style_by_paths"); gtk_check_version =(Ptr_gtk_check_version)libgtk.resolve("gtk_check_version"); @@ -452,6 +478,13 @@ void QGtkStylePrivate::resolveGtk() const gtk_widget_get_allocation = (Ptr_gtk_widget_get_allocation)libgtk.resolve("gtk_widget_get_allocation"); gtk_widget_set_allocation = (Ptr_gtk_widget_set_allocation)libgtk.resolve("gtk_widget_set_allocation"); + gtk_widget_set_can_default = (Ptr_gtk_widget_set_can_default)libgtk.resolve("gtk_widget_set_can_default"); + gtk_window_set_default = (Ptr_gtk_window_set_default)libgtk.resolve("gtk_window_set_default"); + + gdk_event_new = (Ptr_gdk_event_new)libgtk.resolve("gdk_event_new"); + gdk_event_free = (Ptr_gdk_event_free)libgtk.resolve("gdk_event_free"); + gtk_widget_send_focus_change = (Ptr_gtk_widget_send_focus_change)libgtk.resolve("gtk_widget_send_focus_change"); + pango_font_description_get_size = (Ptr_pango_font_description_get_size)libgtk.resolve("pango_font_description_get_size"); pango_font_description_get_weight = (Ptr_pango_font_description_get_weight)libgtk.resolve("pango_font_description_get_weight"); pango_font_description_get_family = (Ptr_pango_font_description_get_family)libgtk.resolve("pango_font_description_get_family"); diff --git a/src/widgets/styles/qgtkstyle_p.h b/src/widgets/styles/qgtkstyle_p.h index 71c70c41f1..6283ff4d47 100644 --- a/src/widgets/styles/qgtkstyle_p.h +++ b/src/widgets/styles/qgtkstyle_p.h @@ -218,6 +218,7 @@ typedef GtkType (*Ptr_gtk_window_get_type) (void); typedef GtkType (*Ptr_gtk_widget_get_type) (void); typedef GtkWidget* (*Ptr_gtk_widget_get_parent) (GtkWidget *); typedef gboolean (*Ptr_gtk_widget_is_toplevel) (GtkWidget *); +typedef GtkWidget* (*Ptr_gtk_widget_get_toplevel) (GtkWidget *); typedef GtkStyle* (*Ptr_gtk_rc_get_style_by_paths) (GtkSettings *, const char *, const char *, GType); typedef gint (*Ptr_pango_font_description_get_size) (const PangoFontDescription *); typedef PangoWeight (*Ptr_pango_font_description_get_weight) (const PangoFontDescription *); @@ -244,6 +245,13 @@ typedef void (*Ptr_gtk_border_free)(GtkBorder *); typedef void (*Ptr_gtk_widget_get_allocation) (GtkWidget*, GtkAllocation*); typedef void (*Ptr_gtk_widget_set_allocation) (GtkWidget*, const GtkAllocation*); +typedef void (*Ptr_gtk_widget_set_can_default) (GtkWidget*, gboolean); +typedef void (*Ptr_gtk_window_set_default) (GtkWindow*, GtkWidget*); + +typedef GdkEvent* (*Ptr_gdk_event_new) (GdkEventType); +typedef void (*Ptr_gdk_event_free) (GdkEvent*); +typedef void (*Ptr_gtk_widget_send_focus_change) (GtkWidget*, GdkEvent*); + typedef guchar* (*Ptr_gdk_pixbuf_get_pixels) (const GdkPixbuf *pixbuf); typedef int (*Ptr_gdk_pixbuf_get_width) (const GdkPixbuf *pixbuf); typedef void (*Ptr_gdk_color_free) (const GdkColor *); @@ -328,6 +336,7 @@ public: static GtkWidget* gtkWidget(const QHashableLatin1Literal &path); static GtkStyle* gtkStyle(const QHashableLatin1Literal &path = QHashableLatin1Literal("GtkWindow")); + static void gtkWidgetSetFocus(GtkWidget *widget, bool focus); virtual void resolveGtk() const; virtual void initGtkMenu() const; @@ -444,11 +453,18 @@ public: static Ptr_gtk_widget_get_type gtk_widget_get_type; static Ptr_gtk_widget_get_parent gtk_widget_get_parent; static Ptr_gtk_widget_is_toplevel gtk_widget_is_toplevel; + static Ptr_gtk_widget_get_toplevel gtk_widget_get_toplevel; static Ptr_gtk_rc_get_style_by_paths gtk_rc_get_style_by_paths; static Ptr_gtk_check_version gtk_check_version; static Ptr_gtk_border_free gtk_border_free; static Ptr_gtk_widget_get_allocation gtk_widget_get_allocation; static Ptr_gtk_widget_set_allocation gtk_widget_set_allocation; + static Ptr_gtk_widget_set_can_default gtk_widget_set_can_default; + static Ptr_gtk_window_set_default gtk_window_set_default; + + static Ptr_gdk_event_new gdk_event_new; + static Ptr_gdk_event_free gdk_event_free; + static Ptr_gtk_widget_send_focus_change gtk_widget_send_focus_change; static Ptr_pango_font_description_get_size pango_font_description_get_size; static Ptr_pango_font_description_get_weight pango_font_description_get_weight; |