File indexing completed on 2024-05-19 09:43:03
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