diff options
author | Bea Lam <bea.lam@nokia.com> | 2009-11-19 05:06:49 (GMT) |
---|---|---|
committer | Bea Lam <bea.lam@nokia.com> | 2009-11-19 05:06:49 (GMT) |
commit | f9ee74e207f8604d0d94c5e83e50ae12492930c1 (patch) | |
tree | 11edcfd3ca1c84feb264039b526c0d3a520568c4 /src/gui/styles/qgtkstyle_p.cpp | |
parent | a7493235a70f9e60d5d25d84b0782ee0a2e5c5fd (diff) | |
parent | 3e78ae2e6ec8df4b69845c936f6d4f6d43c15acc (diff) | |
download | Qt-f9ee74e207f8604d0d94c5e83e50ae12492930c1.zip Qt-f9ee74e207f8604d0d94c5e83e50ae12492930c1.tar.gz Qt-f9ee74e207f8604d0d94c5e83e50ae12492930c1.tar.bz2 |
Merge branch 'kinetic-declarativeui' of scm.dev.nokia.troll.no:qt/kinetic into kinetic-declarativeui
Diffstat (limited to 'src/gui/styles/qgtkstyle_p.cpp')
-rw-r--r-- | src/gui/styles/qgtkstyle_p.cpp | 62 |
1 files changed, 38 insertions, 24 deletions
diff --git a/src/gui/styles/qgtkstyle_p.cpp b/src/gui/styles/qgtkstyle_p.cpp index 7119a4f..5f4ebae 100644 --- a/src/gui/styles/qgtkstyle_p.cpp +++ b/src/gui/styles/qgtkstyle_p.cpp @@ -202,12 +202,16 @@ Ptr_gnome_vfs_init QGtkStylePrivate::gnome_vfs_init = 0; typedef int (*x11ErrorHandler)(Display*, XErrorEvent*); -static void gtkStyleSetCallback(GtkWidget*, QGtkStylePrivate* stylePrivate) +Q_DECLARE_METATYPE(QGtkStylePrivate*); + +static void gtkStyleSetCallback(GtkWidget*) { + qRegisterMetaType<QGtkStylePrivate *>(); + // We have to let this function return and complete the event // loop to ensure that all gtk widgets have been styled before // updating - QMetaObject::invokeMethod(styleScheduler(), "updateTheme", Qt::QueuedConnection, Q_ARG(QGtkStylePrivate*, stylePrivate)); + QMetaObject::invokeMethod(styleScheduler(), "updateTheme", Qt::QueuedConnection); } static void update_toolbar_style(GtkWidget *gtkToolBar, GParamSpec *, gpointer) @@ -251,10 +255,18 @@ bool QGtkStyleFilter::eventFilter(QObject *obj, QEvent *e) return QObject::eventFilter(obj, e); } +QList<QGtkStylePrivate *> QGtkStylePrivate::instances; + QGtkStylePrivate::QGtkStylePrivate() : QCleanlooksStylePrivate() , filter(this) { + instances.append(this); +} + +QGtkStylePrivate::~QGtkStylePrivate() +{ + instances.removeOne(this); } void QGtkStylePrivate::init() @@ -285,7 +297,7 @@ GtkStyle* QGtkStylePrivate::gtkStyle(const QString &path) /*! \internal * Get references to gtk functions after we dynamically load the library. */ -void QGtkStylePrivate::resolveGtk() +void QGtkStylePrivate::resolveGtk() const { // enforce the "0" suffix, so we'll open libgtk-x11-2.0.so.0 QLibrary libgtk(QLS("gtk-x11-2.0"), 0, 0); @@ -413,7 +425,7 @@ void QGtkStylePrivate::resolveGtk() * Initializes a number of gtk menu widgets. * The widgets are cached. */ -void QGtkStylePrivate::initGtkMenu() +void QGtkStylePrivate::initGtkMenu() const { // Create menubar GtkWidget *gtkMenuBar = QGtkStylePrivate::gtk_menu_bar_new(); @@ -444,7 +456,7 @@ void QGtkStylePrivate::initGtkMenu() } -void QGtkStylePrivate::initGtkTreeview() +void QGtkStylePrivate::initGtkTreeview() const { GtkWidget *gtkTreeView = gtk_tree_view_new(); gtk_tree_view_append_column((GtkTreeView*)gtkTreeView, gtk_tree_view_column_new()); @@ -458,7 +470,7 @@ void QGtkStylePrivate::initGtkTreeview() * Initializes a number of gtk widgets that we can later on use to determine some of our styles. * The widgets are cached. */ -void QGtkStylePrivate::initGtkWidgets() +void QGtkStylePrivate::initGtkWidgets() const { // From gtkmain.c uid_t ruid = getuid (); @@ -509,7 +521,7 @@ void QGtkStylePrivate::initGtkWidgets() if (!gtkWidgetMap()->contains(QLS("GtkButton"))) { GtkWidget *gtkButton = QGtkStylePrivate::gtk_button_new(); addWidget(gtkButton); - g_signal_connect(gtkButton, "style-set", G_CALLBACK(gtkStyleSetCallback), this); + g_signal_connect(gtkButton, "style-set", G_CALLBACK(gtkStyleSetCallback), 0); addWidget(QGtkStylePrivate::gtk_tool_button_new(NULL, NULL)); addWidget(QGtkStylePrivate::gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_NONE)); addWidget(QGtkStylePrivate::gtk_hbutton_box_new()); @@ -613,7 +625,7 @@ bool QGtkStylePrivate::getGConfBool(const QString &key, bool fallback) return retVal; } -QString QGtkStylePrivate::getThemeName() const +QString QGtkStylePrivate::getThemeName() { QString themeName; // We try to parse the gtkrc file first @@ -730,7 +742,7 @@ void QGtkStylePrivate::addAllSubWidgets(GtkWidget *widget, gpointer v) } // Updates window/windowtext palette based on the indicated gtk widget -QPalette QGtkStylePrivate::gtkWidgetPalette(const QString >kWidgetName) +QPalette QGtkStylePrivate::gtkWidgetPalette(const QString >kWidgetName) const { GtkWidget *gtkWidget = QGtkStylePrivate::gtkWidget(gtkWidgetName); Q_ASSERT(gtkWidget); @@ -751,7 +763,7 @@ QPalette QGtkStylePrivate::gtkWidgetPalette(const QString >kWidgetName) } -void QGtkStyleUpdateScheduler::updateTheme( QGtkStylePrivate* stylePrivate ) +void QGtkStyleUpdateScheduler::updateTheme() { static QString oldTheme(QLS("qt_not_set")); QPixmapCache::clear(); @@ -760,20 +772,22 @@ void QGtkStyleUpdateScheduler::updateTheme( QGtkStylePrivate* stylePrivate ) if (QApplication::font() != font) qApp->setFont(font); - if (oldTheme != stylePrivate->getThemeName()) { - oldTheme = stylePrivate->getThemeName(); - QPalette newPalette = qApp->style()->standardPalette(); - QApplicationPrivate::setSystemPalette(newPalette); - QApplication::setPalette(newPalette); - stylePrivate->initGtkWidgets(); - stylePrivate->applyCustomPaletteHash(); - QList<QWidget*> widgets = QApplication::allWidgets(); - // Notify all widgets that size metrics might have changed - foreach (QWidget *widget, widgets) { - QEvent e(QEvent::StyleChange); - QApplication::sendEvent(widget, &e); - } - } + if (oldTheme != QGtkStylePrivate::getThemeName()) { + oldTheme = QGtkStylePrivate::getThemeName(); + QPalette newPalette = qApp->style()->standardPalette(); + QApplicationPrivate::setSystemPalette(newPalette); + QApplication::setPalette(newPalette); + if (!QGtkStylePrivate::instances.isEmpty()) { + QGtkStylePrivate::instances.last()->initGtkWidgets(); + QGtkStylePrivate::instances.last()->applyCustomPaletteHash(); + } + QList<QWidget*> widgets = QApplication::allWidgets(); + // Notify all widgets that size metrics might have changed + foreach (QWidget *widget, widgets) { + QEvent e(QEvent::StyleChange); + QApplication::sendEvent(widget, &e); + } + } QIconLoader::instance()->updateSystemTheme(); } |