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