File indexing completed on 2024-04-28 05:46:49

0001 /*****************************************************************************
0002  *   Copyright 2014 - 2015 Yichao Yu <yyc1992@gmail.com>                     *
0003  *                                                                           *
0004  *   This program is free software; you can redistribute it and/or modify    *
0005  *   it under the terms of the GNU Lesser General Public License as          *
0006  *   published by the Free Software Foundation; either version 2.1 of the    *
0007  *   License, or (at your option) version 3, or any later version accepted   *
0008  *   by the membership of KDE e.V. (or its successor approved by the         *
0009  *   membership of KDE e.V.), which shall act as a proxy defined in          *
0010  *   Section 6 of version 3 of the license.                                  *
0011  *                                                                           *
0012  *   This program is distributed in the hope that it will be useful,         *
0013  *   but WITHOUT ANY WARRANTY; without even the implied warranty of          *
0014  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU       *
0015  *   Lesser General Public License for more details.                         *
0016  *                                                                           *
0017  *   You should have received a copy of the GNU Lesser General Public        *
0018  *   License along with this library. If not,                                *
0019  *   see <http://www.gnu.org/licenses/>.                                     *
0020  *****************************************************************************/
0021 
0022 #ifndef __QTC_UTILS_GTK_PROPS_H__
0023 #define __QTC_UTILS_GTK_PROPS_H__
0024 
0025 #include "gtkutils.h"
0026 
0027 namespace QtCurve {
0028 
0029 class GtkWidgetProps {
0030     struct Props {
0031         GtkWidget *m_w;
0032         Props() = default;
0033         template<typename T>
0034         Props(T *w)
0035             : Props()
0036         {
0037             m_w = (GtkWidget*)w;
0038         }
0039         template<typename ObjGetter>
0040         class SigConn {
0041             SigConn(const SigConn&) = delete;
0042         public:
0043             SigConn() : m_id(0)
0044             {
0045                 static_assert(sizeof(SigConn) == sizeof(int), "");
0046             }
0047             inline
0048             ~SigConn()
0049             {
0050                 disconn();
0051             }
0052             template<typename Ret, typename... Args>
0053             inline void
0054             conn(const char *name, Ret(*cb)(Args...), void *data=nullptr)
0055             {
0056                 if (qtcLikely(!m_id)) {
0057                     m_id = g_signal_connect(ObjGetter()(this),
0058                                             name, G_CALLBACK(cb), data);
0059                 }
0060             }
0061             inline void
0062             disconn()
0063             {
0064                 if (qtcLikely(m_id)) {
0065                     GObject *obj = ObjGetter()(this);
0066                     if (g_signal_handler_is_connected(obj, m_id)) {
0067                         g_signal_handler_disconnect(obj, m_id);
0068                     }
0069                     m_id = 0;
0070                 }
0071             }
0072         private:
0073             int m_id;
0074         };
0075 #define DEF_WIDGET_SIG_CONN_PROPS(name)                                 \
0076         struct _SigConn_##name##_ObjGetter {                            \
0077             inline GObject*                                             \
0078             operator()(SigConn<_SigConn_##name##_ObjGetter> *p) const   \
0079             {                                                           \
0080                 return (GObject*)qtcContainerOf(p, Props, name)->m_w;   \
0081             }                                                           \
0082         };                                                              \
0083         SigConn<_SigConn_##name##_ObjGetter> name
0084 
0085         int blurBehind: 2;
0086         bool shadowSet: 1;
0087         bool tabHacked: 1;
0088         bool entryHacked: 1;
0089         bool statusBarSet: 1;
0090         bool wmMoveHacked: 1;
0091         bool windowHacked: 1;
0092         bool comboBoxHacked: 1;
0093         bool tabChildHacked: 1;
0094         bool treeViewHacked: 1;
0095         bool menuShellHacked: 1;
0096         bool scrollBarHacked: 1;
0097         bool buttonOrderHacked: 1;
0098         bool shadeActiveMBHacked: 1;
0099         unsigned widgetMapHacked: 2;
0100         bool scrolledWindowHacked: 1;
0101 
0102         unsigned short windowOpacity;
0103 
0104         int widgetMask;
0105         DEF_WIDGET_SIG_CONN_PROPS(shadowDestroy);
0106 
0107         DEF_WIDGET_SIG_CONN_PROPS(entryEnter);
0108         DEF_WIDGET_SIG_CONN_PROPS(entryLeave);
0109         DEF_WIDGET_SIG_CONN_PROPS(entryDestroy);
0110         DEF_WIDGET_SIG_CONN_PROPS(entryUnrealize);
0111         DEF_WIDGET_SIG_CONN_PROPS(entryStyleSet);
0112 
0113         DEF_WIDGET_SIG_CONN_PROPS(comboBoxDestroy);
0114         DEF_WIDGET_SIG_CONN_PROPS(comboBoxUnrealize);
0115         DEF_WIDGET_SIG_CONN_PROPS(comboBoxStyleSet);
0116         DEF_WIDGET_SIG_CONN_PROPS(comboBoxEnter);
0117         DEF_WIDGET_SIG_CONN_PROPS(comboBoxLeave);
0118         DEF_WIDGET_SIG_CONN_PROPS(comboBoxStateChange);
0119 
0120         unsigned menuBarSize;
0121         DEF_WIDGET_SIG_CONN_PROPS(menuShellMotion);
0122         DEF_WIDGET_SIG_CONN_PROPS(menuShellLeave);
0123         DEF_WIDGET_SIG_CONN_PROPS(menuShellDestroy);
0124         DEF_WIDGET_SIG_CONN_PROPS(menuShellStyleSet);
0125         DEF_WIDGET_SIG_CONN_PROPS(menuShellButtonPress);
0126         DEF_WIDGET_SIG_CONN_PROPS(menuShellButtonRelease);
0127 
0128         DEF_WIDGET_SIG_CONN_PROPS(scrollBarDestroy);
0129         DEF_WIDGET_SIG_CONN_PROPS(scrollBarUnrealize);
0130         DEF_WIDGET_SIG_CONN_PROPS(scrollBarStyleSet);
0131         DEF_WIDGET_SIG_CONN_PROPS(scrollBarValueChanged);
0132 
0133         DEF_WIDGET_SIG_CONN_PROPS(scrolledWindowDestroy);
0134         DEF_WIDGET_SIG_CONN_PROPS(scrolledWindowUnrealize);
0135         DEF_WIDGET_SIG_CONN_PROPS(scrolledWindowStyleSet);
0136         DEF_WIDGET_SIG_CONN_PROPS(scrolledWindowEnter);
0137         DEF_WIDGET_SIG_CONN_PROPS(scrolledWindowLeave);
0138         DEF_WIDGET_SIG_CONN_PROPS(scrolledWindowFocusIn);
0139         DEF_WIDGET_SIG_CONN_PROPS(scrolledWindowFocusOut);
0140 
0141         DEF_WIDGET_SIG_CONN_PROPS(tabDestroy);
0142         DEF_WIDGET_SIG_CONN_PROPS(tabUnrealize);
0143         DEF_WIDGET_SIG_CONN_PROPS(tabStyleSet);
0144         DEF_WIDGET_SIG_CONN_PROPS(tabMotion);
0145         DEF_WIDGET_SIG_CONN_PROPS(tabLeave);
0146         DEF_WIDGET_SIG_CONN_PROPS(tabPageAdded);
0147 
0148         DEF_WIDGET_SIG_CONN_PROPS(tabChildDestroy);
0149         DEF_WIDGET_SIG_CONN_PROPS(tabChildStyleSet);
0150         DEF_WIDGET_SIG_CONN_PROPS(tabChildEnter);
0151         DEF_WIDGET_SIG_CONN_PROPS(tabChildLeave);
0152         DEF_WIDGET_SIG_CONN_PROPS(tabChildAdd);
0153 
0154         DEF_WIDGET_SIG_CONN_PROPS(wmMoveDestroy);
0155         DEF_WIDGET_SIG_CONN_PROPS(wmMoveStyleSet);
0156         DEF_WIDGET_SIG_CONN_PROPS(wmMoveMotion);
0157         DEF_WIDGET_SIG_CONN_PROPS(wmMoveLeave);
0158         DEF_WIDGET_SIG_CONN_PROPS(wmMoveButtonPress);
0159 
0160         DEF_WIDGET_SIG_CONN_PROPS(treeViewDestroy);
0161         DEF_WIDGET_SIG_CONN_PROPS(treeViewUnrealize);
0162         DEF_WIDGET_SIG_CONN_PROPS(treeViewStyleSet);
0163         DEF_WIDGET_SIG_CONN_PROPS(treeViewMotion);
0164         DEF_WIDGET_SIG_CONN_PROPS(treeViewLeave);
0165 
0166         DEF_WIDGET_SIG_CONN_PROPS(widgetMapDestroy);
0167         DEF_WIDGET_SIG_CONN_PROPS(widgetMapUnrealize);
0168         DEF_WIDGET_SIG_CONN_PROPS(widgetMapStyleSet);
0169 
0170         DEF_WIDGET_SIG_CONN_PROPS(windowConfigure);
0171         DEF_WIDGET_SIG_CONN_PROPS(windowDestroy);
0172         DEF_WIDGET_SIG_CONN_PROPS(windowStyleSet);
0173         DEF_WIDGET_SIG_CONN_PROPS(windowKeyRelease);
0174         DEF_WIDGET_SIG_CONN_PROPS(windowMap);
0175         DEF_WIDGET_SIG_CONN_PROPS(windowClientEvent);
0176 #undef DEF_WIDGET_SIG_CONN_PROPS
0177     };
0178 
0179     inline Props*
0180     getProps() const
0181     {
0182         static GQuark name =
0183             g_quark_from_static_string("_gtk__QTCURVE_WIDGET_PROPERTIES__");
0184         Props *props = (Props*)g_object_get_qdata(m_obj, name);
0185         if (!props) {
0186             props = new Props(m_obj);
0187             g_object_set_qdata_full(m_obj, name, props, [] (void *props) {
0188                     delete (Props*)props;
0189                 });
0190         }
0191         return props;
0192     }
0193 public:
0194     template<typename T>
0195     inline
0196     GtkWidgetProps(T *obj) : m_obj((GObject*)obj), m_props(nullptr)
0197     {
0198         static_assert(std::is_standard_layout<GtkWidgetProps>::value, "");
0199     }
0200     inline Props*
0201     operator->() const
0202     {
0203         if (!m_props && m_obj) {
0204             m_props = getProps();
0205         }
0206         return m_props;
0207     }
0208 private:
0209     GObject *m_obj;
0210     mutable Props *m_props;
0211 };
0212 
0213 }
0214 
0215 #endif