9#include <mousetrap/gtk_common.hpp>
10#include <mousetrap/signal_emitter.hpp>
24 #define SPLAT(...) __VA_ARGS__
26 #define CTOR_SIGNAL(T, signal_name) \
27 SIGNAL_CLASS_NAME(signal_name)<T>(this)
29 #define HAS_SIGNAL(T, signal_name) \
30 public SIGNAL_CLASS_NAME(signal_name)<T>
32 #define SIGNAL_INTERNAL_PRIVATE_CLASS_NAME(CamelCase) _HasSignal##CamelCase##Internal
33 #define SIGNAL_INTERNAL_CLASS_NAME(CamelCase) HasSignal##CamelCase##Internal
34 #define SIGNAL_CLASS_NAME(snake_case) has_signal_##snake_case
36 #define DECLARE_SIGNAL(CamelCase, snake_case, CAPS_CASE, g_signal_id, return_t) \
39 struct SIGNAL_INTERNAL_PRIVATE_CLASS_NAME(CamelCase) \
42 NativeObject instance; \
43 std::function<return_t(void*)> function; \
46 using SIGNAL_INTERNAL_CLASS_NAME(CamelCase) = SIGNAL_INTERNAL_PRIVATE_CLASS_NAME(CamelCase); \
47 SIGNAL_INTERNAL_CLASS_NAME(CamelCase)* has_signal_##snake_case##_internal_new(NativeObject instance); \
50 template <typename T> \
51 class SIGNAL_CLASS_NAME(snake_case) \
54 detail::SIGNAL_INTERNAL_CLASS_NAME(CamelCase)* _internal = nullptr; \
55 T* _instance = nullptr; \
57 static return_t wrapper(void*, detail::SIGNAL_INTERNAL_CLASS_NAME(CamelCase)* internal) \
59 auto temp = T((typename detail::InternalMapping<T>::value*) internal->instance); \
60 if (internal->function and not internal->is_blocked) \
61 return internal->function((void*) &temp); \
68 if (_internal == nullptr) \
70 auto* internal_maybe = detail::get_data<detail::SIGNAL_INTERNAL_CLASS_NAME(CamelCase)>(_instance->get_internal(), g_signal_id); \
71 if (internal_maybe == nullptr) \
73 _internal = detail::has_signal_##snake_case##_internal_new(_instance->get_internal()); \
74 detail::attach_ref_to(_internal->instance, _internal); \
75 detail::set_data<detail::SIGNAL_INTERNAL_CLASS_NAME(CamelCase)>(_instance->get_internal(), g_signal_id, _internal); \
78 _internal = internal_maybe; \
80 g_object_ref(_internal);\
85 SIGNAL_CLASS_NAME(snake_case)(T* instance) \
86 : _instance(instance) \
89 ~SIGNAL_CLASS_NAME(snake_case)() \
91 if (_internal != nullptr)\
92 g_object_unref(_internal); \
96 static inline const char* signal_id = g_signal_id; \
98 template <typename Function_t, typename Data_t> \
99 void connect_signal_##snake_case(Function_t f, Data_t data) \
102 _internal->function = [f, data](void* instance) -> return_t \
104 return f(*((T*) instance), data); \
107 T((typename detail::InternalMapping<T>::value*) _internal->instance).connect_signal(signal_id, wrapper, _internal); \
110 template <typename Function_t> \
111 void connect_signal_##snake_case(Function_t f) \
114 _internal->function = [f](void* instance) -> return_t \
116 return f(*((T*) instance)); \
119 T((typename detail::InternalMapping<T>::value*) _internal->instance).connect_signal(signal_id, wrapper, _internal); \
122 void set_signal_##snake_case##_blocked(bool b) \
125 _internal->is_blocked = b; \
126 T((typename detail::InternalMapping<T>::value*) _internal->instance).set_signal_blocked(signal_id, b);\
129 bool get_signal_##snake_case##_blocked() const \
131 const_cast<SIGNAL_CLASS_NAME(snake_case)*>(this)->initialize(); \
132 return T((typename detail::InternalMapping<T>::value*) _internal->instance).get_signal_blocked(signal_id);\
135 void emit_signal_##snake_case() \
138 g_signal_emit_by_name(T((typename detail::InternalMapping<T>::value*) _internal->instance).operator GObject*(), signal_id); \
141 void disconnect_signal_##snake_case() \
143 T((typename detail::InternalMapping<T>::value*) _internal->instance).disconnect_signal(signal_id); \
147 #define DECLARE_SIGNAL_MANUAL(CamelCase, snake_case, CAPS_CASE, g_signal_id, return_t, arg_list, arg_name_only_list) \
150 struct SIGNAL_INTERNAL_PRIVATE_CLASS_NAME(CamelCase) \
153 NativeObject instance; \
154 std::function<return_t(void*, arg_list)> function; \
157 using SIGNAL_INTERNAL_CLASS_NAME(CamelCase) = SIGNAL_INTERNAL_PRIVATE_CLASS_NAME(CamelCase); \
158 SIGNAL_INTERNAL_CLASS_NAME(CamelCase)* has_signal_##snake_case##_internal_new(NativeObject instance); \
161 template <typename T> \
162 class SIGNAL_CLASS_NAME(snake_case) \
165 detail::SIGNAL_INTERNAL_CLASS_NAME(CamelCase)* _internal = nullptr; \
166 T* _instance = nullptr; \
168 static return_t wrapper(void*, arg_list, detail::SIGNAL_INTERNAL_CLASS_NAME(CamelCase)* internal) \
170 auto temp = T((typename detail::InternalMapping<T>::value*) internal->instance); \
171 if (internal->function and not internal->is_blocked) \
172 return internal->function((void*) &temp, arg_name_only_list); \
179 auto* internal_maybe = detail::get_data<detail::SIGNAL_INTERNAL_CLASS_NAME(CamelCase)>(_instance->get_internal(), g_signal_id); \
180 if (internal_maybe == nullptr) \
182 _internal = detail::has_signal_##snake_case##_internal_new(_instance->get_internal()); \
183 detail::attach_ref_to(_internal->instance, _internal); \
184 detail::set_data<detail::SIGNAL_INTERNAL_CLASS_NAME(CamelCase)>(_instance->get_internal(), g_signal_id, _internal); \
187 _internal = internal_maybe; \
189 g_object_ref(_internal);\
193 SIGNAL_CLASS_NAME(snake_case)(T* instance) \
194 : _instance(instance) \
197 ~SIGNAL_CLASS_NAME(snake_case)() = default; \
200 static inline const char* signal_id = g_signal_id; \
202 template <typename Function_t, typename Data_t> \
203 void connect_signal_##snake_case(Function_t f, Data_t data) \
206 _internal->function = [f, data](void* instance, arg_list) -> return_t \
208 return f(*((T*) instance), arg_name_only_list, data); \
211 T((typename detail::InternalMapping<T>::value*) _internal->instance).connect_signal(signal_id, wrapper, _internal); \
214 template <typename Function_t> \
215 void connect_signal_##snake_case(Function_t f) \
218 _internal->function = [f](void* instance, arg_list) -> return_t \
220 return f(*((T*) instance), arg_name_only_list); \
223 T((typename detail::InternalMapping<T>::value*) _internal->instance).connect_signal(signal_id, wrapper, _internal); \
226 void set_signal_##snake_case##_blocked(bool b) \
229 _internal->is_blocked = b; \
230 T((typename detail::InternalMapping<T>::value*) _internal->instance).set_signal_blocked(signal_id, b);\
233 bool get_signal_##snake_case##_blocked() const \
235 const_cast<SIGNAL_CLASS_NAME(snake_case)*>(this)->initialize(); \
236 return T((typename detail::InternalMapping<T>::value*) _internal->instance).get_signal_blocked(signal_id);\
239 void emit_signal_##snake_case(arg_list) \
242 g_signal_emit_by_name(T((typename detail::InternalMapping<T>::value*) _internal->instance).operator GObject*(), signal_id, arg_name_only_list); \
245 void disconnect_signal_##snake_case() \
247 T((typename detail::InternalMapping<T>::value*) _internal->instance).disconnect_signal(signal_id); \
252 using UnusedArgument_t =
void*;
254 DECLARE_SIGNAL(Activate, activate, ACTIVATE,
"activate",
void);
283 DECLARE_SIGNAL(Startup, startup, STARTUP,
"startup",
void);
312 DECLARE_SIGNAL(Shutdown, shutdown, SHUTDOWN,
"shutdown",
void);
338 DECLARE_SIGNAL(Update, update, UPDATE,
"update",
void);
367 DECLARE_SIGNAL(Paint, paint, PAINT,
"paint",
void);
396 DECLARE_SIGNAL(Realize, realize, REALIZE,
"realize",
void);
425 DECLARE_SIGNAL(Unrealize, unrealize, UNREALIZE,
"unrealize",
void);
451 DECLARE_SIGNAL(Destroy, destroy, DESTROY,
"destroy",
void);
477 DECLARE_SIGNAL(Hide, hide, HIDE,
"hide",
void);
506 DECLARE_SIGNAL(Show, show, SHOW,
"show",
void);
535 DECLARE_SIGNAL(Map, map, MAP,
"map",
void);
564 DECLARE_SIGNAL(Unmap, unmap, UNMAP,
"unmap",
void);
594 enum WindowCloseRequestResult :
bool
603 DECLARE_SIGNAL(CloseRequest, close_request, CLOSE_REQUEST,
"close-request", WindowCloseRequestResult);
632 DECLARE_SIGNAL(ActivateDefaultWidget, activate_default_widget, ACTIVATE_DEFAULT_WIDGET,
"activate-default",
void);
661 DECLARE_SIGNAL(ActivateFocusedWidget, activate_focused_widget, ACTIVATE_FOCUSED_WIDGET,
"activate-focus",
void);
690 DECLARE_SIGNAL(Clicked, clicked, CLICKED,
"clicked",
void);
719 DECLARE_SIGNAL(Toggled, toggled, TOGGLED,
"toggled",
void);
749 DECLARE_SIGNAL(TextChanged, text_changed, TEXT_CHANGED,
"changed",
void);
778 DECLARE_SIGNAL(Undo, undo, UNDO,
"undo",
void);
807 DECLARE_SIGNAL(Redo, redo, REDO,
"redo",
void);
836 DECLARE_SIGNAL_MANUAL(SelectionChanged, selection_changed, SELECTION_CHANGED,
"selection-changed",
void,
837 SPLAT(int32_t position, int32_t n_items),
838 SPLAT(position, n_items)
870 DECLARE_SIGNAL_MANUAL(ActivateItem, activate_item, ACTIVATE_ITEM,
"activate",
void,
871 SPLAT(guint position),
904 using ModifierState = GdkModifierType;
905 using KeyValue = guint;
906 using KeyCode = guint;
908 DECLARE_SIGNAL_MANUAL(KeyPressed, key_pressed, KEY_PRESSED,
"key-pressed",
bool,
909 SPLAT(KeyValue keyval, KeyCode keycode, ModifierState modifier),
910 SPLAT(keyval, keycode, modifier)
943 DECLARE_SIGNAL_MANUAL(KeyReleased, key_released, KEY_RELEASED,
"key-released",
void,
944 SPLAT(KeyValue keyval, KeyCode keycode, ModifierState modifier),
945 SPLAT(keyval, keycode, modifier)
979 DECLARE_SIGNAL_MANUAL(ModifiersChanged, modifiers_changed, MODIFIERS_CHANGED,
"modifiers",
bool,
980 SPLAT(ModifierState modifier),
1014 DECLARE_SIGNAL_MANUAL(MotionEnter, motion_enter, MOTION_ENTER,
"enter",
void,
1015 SPLAT(
double x,
double y),
1048 DECLARE_SIGNAL_MANUAL(Motion, motion, MOTION,
"motion",
void,
1049 SPLAT(
double x,
double y),
1082 DECLARE_SIGNAL(MotionLeave, motion_leave, MOTION_LEAVE,
"leave",
void);
1111 DECLARE_SIGNAL_MANUAL(ClickPressed, click_pressed, CLICK_PRESSED,
"pressed",
void,
1112 SPLAT(int32_t n_press,
double x,
double y),
1113 SPLAT(n_press, x, y)
1146 DECLARE_SIGNAL_MANUAL(ClickReleased, click_released, CLICK_RELEASED,
"released",
void,
1147 SPLAT(int32_t n_press,
double x,
double y),
1148 SPLAT(n_press, x, y)
1181 DECLARE_SIGNAL(ClickStopped, click_stopped, CLICK_STOPPED,
"stopped",
void);
1210 DECLARE_SIGNAL_MANUAL(KineticScrollDecelerate, kinetic_scroll_decelerate, KINETIC_SCROLL_DECELERATE,
"decelerate",
void,
1211 SPLAT(
double x_velocity,
double y_velocity),
1212 SPLAT(x_velocity, y_velocity)
1244 DECLARE_SIGNAL(ScrollBegin, scroll_begin, SCROLL_BEGIN,
"scroll-begin",
void);
1273 DECLARE_SIGNAL_MANUAL(Scroll, scroll, SCROLL,
"scroll",
bool,
1274 SPLAT(
double delta_x,
double delta_y),
1275 SPLAT(delta_x, delta_y)
1307 DECLARE_SIGNAL(ScrollEnd, scroll_end, SCROLL_END,
"scroll-end",
void);
1336 DECLARE_SIGNAL(FocusGained, focus_gained, FOCUS_GAINED,
"enter",
void);
1365 DECLARE_SIGNAL(FocusLost, focus_lost, FOCUS_LOST,
"leave",
void);
1394 DECLARE_SIGNAL_MANUAL(DragBegin, drag_begin, DRAG_BEGIN,
"drag-begin",
void,
1395 SPLAT(
double start_x,
double start_y),
1396 SPLAT(start_x, start_y)
1428 DECLARE_SIGNAL_MANUAL(Drag, drag, DRAG,
"drag-update",
void,
1429 SPLAT(
double offset_x,
double offset_y),
1430 SPLAT(offset_x, offset_y)
1462 DECLARE_SIGNAL_MANUAL(DragEnd, drag_end, DRAG_END,
"drag-end",
void,
1463 SPLAT(
double offset_x,
double offset_y),
1464 SPLAT(offset_x, offset_y)
1496 DECLARE_SIGNAL_MANUAL(ScaleChanged, scale_changed, SCALE_CHANGED,
"scale-changed",
void,
1529 DECLARE_SIGNAL_MANUAL(RotationChanged, rotation_changed, ROTATION_CHANGED,
"angle-changed",
void,
1530 SPLAT(
double angle_absolute_radians,
double angle_delta_radians),
1531 SPLAT(angle_absolute_radians, angle_delta_radians)
1563 DECLARE_SIGNAL(PropertiesChanged, properties_changed, PROPERTIES_CHANGED,
"changed",
void);
1593 DECLARE_SIGNAL(ValueChanged, value_changed, VALUE_CHANGED,
"value-changed",
void);
1622 DECLARE_SIGNAL_MANUAL(Render, render, RENDER,
"render",
bool, GdkGLContext* context, context);
1651 DECLARE_SIGNAL_MANUAL(Resize, resize, RESIZE,
"resize",
void,
1652 SPLAT(int32_t width, int32_t height),
1653 SPLAT(width, height)
1685 DECLARE_SIGNAL_MANUAL(PageAdded, page_added, PAGE_ADDED,
"page-added",
void,
1686 SPLAT(UnusedArgument_t _, uint32_t page_index),
1687 SPLAT(_, page_index)
1719 DECLARE_SIGNAL_MANUAL(PageRemoved, page_removed, PAGE_REMOVED,
"page-removed",
void,
1720 SPLAT(UnusedArgument_t _, uint32_t page_index),
1721 SPLAT(_, page_index)
1753 DECLARE_SIGNAL_MANUAL(PageReordered, page_reordered, PAGE_REORDERED,
"page-reordered",
void,
1754 SPLAT(UnusedArgument_t _, uint32_t page_index),
1755 SPLAT(_, page_index)
1787 DECLARE_SIGNAL_MANUAL(PageSelectionChanged, page_selection_changed, PAGE_SELECTION_CHANGED,
"switch-page",
void,
1788 SPLAT(UnusedArgument_t _, uint32_t page_index),
1789 SPLAT(_, page_index)
1821 DECLARE_SIGNAL(Wrapped, wrapped, WRAPPED,
"wrapped",
void);
1850 DECLARE_SIGNAL_MANUAL(Pressed, pressed, PRESSED,
"pressed",
void,
1851 SPLAT(
double x,
double y),
1884 DECLARE_SIGNAL(PressCancelled, press_cancelled, PRESS_CANCELLED,
"cancelled",
void);
1914 enum class PanDirection
1917 LEFT = GTK_PAN_DIRECTION_LEFT,
1920 RIGHT = GTK_PAN_DIRECTION_RIGHT,
1923 UP = GTK_PAN_DIRECTION_UP,
1926 DOWN = GTK_PAN_DIRECTION_DOWN
1929 DECLARE_SIGNAL_MANUAL(Pan, pan, PAN,
"pan",
void,
1930 SPLAT(PanDirection direction,
double offset),
1931 SPLAT(direction, offset)
1963 DECLARE_SIGNAL_MANUAL(Swipe, swipe, SWIPE,
"swipe",
void,
1964 SPLAT(
double x_velocity,
double y_velocity),
1965 SPLAT(x_velocity, y_velocity)
1997 DECLARE_SIGNAL_MANUAL(StylusDown, stylus_down, STYLUS_DOWN,
"down",
void,
1998 SPLAT(
double x,
double y),
2031 DECLARE_SIGNAL_MANUAL(StylusUp, stylus_up, STYLUS_UP,
"up",
void,
2032 SPLAT(
double x,
double y),
2065 DECLARE_SIGNAL_MANUAL(Proximity, proximity, PROXIMITY,
"proximity",
void,
2066 SPLAT(
double x,
double y),
2100 enum class ScrollType
2103 NONE = GTK_SCROLL_NONE,
2106 JUMP = GTK_SCROLL_JUMP,
2109 STEP_BACKWARD = GTK_SCROLL_STEP_BACKWARD,
2112 STEP_FORWARD = GTK_SCROLL_STEP_FORWARD,
2115 STEP_UP = GTK_SCROLL_STEP_UP,
2118 STEP_DOWN = GTK_SCROLL_STEP_DOWN,
2121 STEP_LEFT = GTK_SCROLL_STEP_LEFT,
2124 STEP_RIGHT = GTK_SCROLL_STEP_RIGHT,
2127 PAGE_BACKWARD = GTK_SCROLL_PAGE_BACKWARD,
2130 PAGE_FORWARD = GTK_SCROLL_PAGE_FORWARD,
2133 PAGE_UP = GTK_SCROLL_PAGE_UP,
2136 PAGE_DOWN = GTK_SCROLL_PAGE_DOWN,
2139 PAGE_LEFT = GTK_SCROLL_PAGE_LEFT,
2142 PAGE_RIGHT = GTK_SCROLL_PAGE_RIGHT,
2145 SCROLL_START = GTK_SCROLL_START,
2148 SCROLL_END = GTK_SCROLL_END
2151 DECLARE_SIGNAL_MANUAL(ScrollChild, scroll_child, SCROLL_CHILD,
"scroll-child",
void,
2152 SPLAT(ScrollType scroll_type,
bool is_horizontal),
2153 SPLAT(scroll_type, is_horizontal)
2185 DECLARE_SIGNAL(Closed, closed, CLOSED,
"closed",
void);
2214 DECLARE_SIGNAL(Play, play, PLAY,
"play",
void);
2243 DECLARE_SIGNAL(Stop, stop, STOP,
"stop",
void);
2272 DECLARE_SIGNAL_MANUAL(ItemsChanged, items_changed, ITEMS_CHANGED,
"items-changed",
void,
2273 SPLAT(int32_t position, int32_t n_removed, int32_t n_added),
2274 SPLAT(position, n_removed, n_added)
2307 DECLARE_SIGNAL_MANUAL(Revealed, revealed, REVEALED,
"notify::reveal-child",
void, UnusedArgument_t _, _);
2337 DECLARE_SIGNAL_MANUAL(Switched, switched, SWITCHED,
"notify::active",
void, UnusedArgument_t _, _);
2367 DECLARE_SIGNAL_MANUAL(Activated, activated, ACTIVATED,
"activate",
void, UnusedArgument_t _, _);
2397 DECLARE_SIGNAL(Dismissed, dismissed, DISMISSED,
"dismissed",
void);
2426 DECLARE_SIGNAL(ButtonClicked, button_clicked, BUTTON_CLICKED,
"button-clicked",
void);
base class of all signal components
Definition: signal_component.hpp:16