1 /*
2 * XSync code
3 */
4
5 #ifdef HAVE_CONFIG_H
6 # include <config.h>
7 #endif /* ifdef HAVE_CONFIG_H */
8
9 #include "Ecore.h"
10 #include "ecore_x_private.h"
11 #include "Ecore_X.h"
12 #include "Ecore_X_Atoms.h"
13
14 EAPI Ecore_X_Sync_Alarm
ecore_x_sync_alarm_new(Ecore_X_Sync_Counter counter)15 ecore_x_sync_alarm_new(Ecore_X_Sync_Counter counter)
16 {
17 Ecore_X_Sync_Alarm alarm;
18 XSyncAlarmAttributes values;
19 XSyncValue init;
20
21 LOGFN;
22 XSyncIntToValue(&init, 0);
23 XSyncSetCounter(_ecore_x_disp, counter, init);
24
25 values.trigger.counter = counter;
26 values.trigger.value_type = XSyncAbsolute;
27 XSyncIntToValue(&values.trigger.wait_value, 1);
28 values.trigger.test_type = XSyncPositiveComparison;
29
30 XSyncIntToValue(&values.delta, 1);
31
32 values.events = True;
33
34 alarm = XSyncCreateAlarm(_ecore_x_disp,
35 XSyncCACounter |
36 XSyncCAValueType |
37 XSyncCAValue |
38 XSyncCATestType |
39 XSyncCADelta |
40 XSyncCAEvents,
41 &values);
42
43 ecore_x_sync();
44 return alarm;
45 }
46
47 EAPI Eina_Bool
ecore_x_sync_alarm_free(Ecore_X_Sync_Alarm alarm)48 ecore_x_sync_alarm_free(Ecore_X_Sync_Alarm alarm)
49 {
50 LOGFN;
51 return XSyncDestroyAlarm(_ecore_x_disp, alarm);
52 }
53
54 EAPI Eina_Bool
ecore_x_sync_counter_query(Ecore_X_Sync_Counter counter,unsigned int * val)55 ecore_x_sync_counter_query(Ecore_X_Sync_Counter counter,
56 unsigned int *val)
57 {
58 XSyncValue value;
59
60 LOGFN;
61 if (XSyncQueryCounter(_ecore_x_disp, counter, &value))
62 {
63 *val = (unsigned int)XSyncValueLow32(value);
64 return EINA_TRUE;
65 }
66
67 return EINA_FALSE;
68 }
69
70 EAPI Ecore_X_Sync_Counter
ecore_x_sync_counter_new(int val)71 ecore_x_sync_counter_new(int val)
72 {
73 XSyncCounter counter;
74 XSyncValue v;
75
76 LOGFN;
77 XSyncIntToValue(&v, val);
78 counter = XSyncCreateCounter(_ecore_x_disp, v);
79 return counter;
80 }
81
82 EAPI void
ecore_x_sync_counter_free(Ecore_X_Sync_Counter counter)83 ecore_x_sync_counter_free(Ecore_X_Sync_Counter counter)
84 {
85 LOGFN;
86 XSyncDestroyCounter(_ecore_x_disp, counter);
87 }
88
89 EAPI void
ecore_x_sync_counter_inc(Ecore_X_Sync_Counter counter,int by)90 ecore_x_sync_counter_inc(Ecore_X_Sync_Counter counter,
91 int by)
92 {
93 XSyncValue v;
94
95 LOGFN;
96 XSyncIntToValue(&v, by);
97 XSyncChangeCounter(_ecore_x_disp, counter, v);
98 }
99
100 EAPI void
ecore_x_sync_counter_val_wait(Ecore_X_Sync_Counter counter,int val)101 ecore_x_sync_counter_val_wait(Ecore_X_Sync_Counter counter,
102 int val)
103 {
104 XSyncWaitCondition cond;
105 XSyncValue v, v2;
106
107 LOGFN;
108 XSyncQueryCounter(_ecore_x_disp, counter, &v);
109 XSyncIntToValue(&v, val);
110 XSyncIntToValue(&v2, val + 1);
111 cond.trigger.counter = counter;
112 cond.trigger.value_type = XSyncAbsolute;
113 cond.trigger.wait_value = v;
114 cond.trigger.test_type = XSyncPositiveComparison;
115 cond.event_threshold = v2;
116 XSyncAwait(_ecore_x_disp, &cond, 1);
117 // XSync(_ecore_x_disp, False); // dont need this
118 }
119
120 EAPI void
ecore_x_sync_counter_set(Ecore_X_Sync_Counter counter,int val)121 ecore_x_sync_counter_set(Ecore_X_Sync_Counter counter,
122 int val)
123 {
124 XSyncValue v;
125
126 LOGFN;
127 XSyncIntToValue(&v, val);
128 XSyncSetCounter(_ecore_x_disp, counter, v);
129 }
130
131 EAPI void
ecore_x_sync_counter_2_set(Ecore_X_Sync_Counter counter,int val_hi,unsigned int val_lo)132 ecore_x_sync_counter_2_set(Ecore_X_Sync_Counter counter,
133 int val_hi,
134 unsigned int val_lo)
135 {
136 XSyncValue v;
137
138 LOGFN;
139 XSyncIntsToValue(&v, val_lo, val_hi);
140 XSyncSetCounter(_ecore_x_disp, counter, v);
141 }
142
143 EAPI Eina_Bool
ecore_x_sync_counter_2_query(Ecore_X_Sync_Counter counter,int * val_hi,unsigned int * val_lo)144 ecore_x_sync_counter_2_query(Ecore_X_Sync_Counter counter,
145 int *val_hi,
146 unsigned int *val_lo)
147 {
148 XSyncValue value;
149
150 LOGFN;
151 if (XSyncQueryCounter(_ecore_x_disp, counter, &value))
152 {
153 *val_lo = (unsigned int)XSyncValueLow32(value);
154 *val_hi = (int)XSyncValueHigh32(value);
155 return EINA_TRUE;
156 }
157 return EINA_FALSE;
158 }
159
160