+static enum appcore_rm changed_m;
+static void *changed_data;
+static Ecore_Event_Handler *changed_handle;
+
+static enum appcore_rm __get_mode(int event_data)
+{
+ int i;
+ enum appcore_rm m;
+
+ m = APPCORE_RM_UNKNOWN;
+
+ for (i = 0; i < sizeof(re_to_rm) / sizeof(re_to_rm[0]); i++) {
+ if (re_to_rm[i].re == event_data) {
+ m = re_to_rm[i].rm;
+ break;
+ }
+ }
+
+ return m;
+}
+
+static Eina_Bool __property(void *data, int type, void *event)
+{
+ Ecore_X_Event_Window_Property *ev = event;
+
+ if (!ev)
+ return ECORE_CALLBACK_PASS_ON;
+
+ if (ev->atom == ATOM_ROTATION_LOCK) {
+ _DBG("[APP %d] Rotation: %d -> %d, cb_set : %d", getpid(), rot.mode, changed_m, rot.cb_set);
+ if (rot.cb_set && rot.mode != changed_m) {
+ rot.callback(changed_m, changed_data);
+ rot.mode = changed_m;
+ }
+
+ ecore_event_handler_del(changed_handle);
+ changed_handle = NULL;
+ }
+
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+static void __changed_cb(unsigned int event_type, sensor_event_data_t *event,
+ void *data)
+{
+ int *cb_event_data;
+ enum appcore_rm m;
+ int ret;
+ int val;
+
+ if (rot.lock)
+ return;
+
+ if (event_type != ACCELEROMETER_EVENT_ROTATION_CHECK) {
+ errno = EINVAL;
+ return;
+ }
+
+ cb_event_data = (int *)(event->event_data);
+
+ m = __get_mode(*cb_event_data);
+
+ _DBG("[APP %d] Rotation: %d -> %d", getpid(), rot.mode, m);
+
+ if (rot.callback) {
+ if (rot.cb_set && rot.mode != m) {
+ ret = ecore_x_window_prop_card32_get(root, ATOM_ROTATION_LOCK, &val, 1);
+
+ _DBG("[APP %d] Rotation: %d -> %d, val : %d, ret : %d", getpid(), rot.mode, m, val, ret);
+ if (!val || ret < 1) {
+ rot.callback(m, data);
+ rot.mode = m;
+ } else {
+ changed_data = data;
+ if(changed_handle) {
+ ecore_event_handler_del(changed_handle);
+ changed_handle = NULL;
+ }
+ changed_handle = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY, __property, NULL);
+ }
+ }
+ changed_m = m;
+ }
+}
+
+static void __lock_cb(keynode_t *node, void *data)
+{
+ int r;
+ enum appcore_rm m;
+ int ret;
+ int val;
+
+ rot.lock = vconf_keynode_get_bool(node);
+
+ if (rot.lock) {
+ _DBG("[APP %d] Rotation locked", getpid());
+ return;
+ }
+
+ _DBG("[APP %d] Rotation unlocked", getpid());
+ if (rot.callback) {
+ if (rot.cb_set) {
+ r = appcore_get_rotation_state(&m);
+ _DBG("[APP %d] Rotmode prev %d -> curr %d", getpid(),
+ rot.mode, m);
+ if (!r && rot.mode != m) {
+ if(!val) {
+ rot.callback(m, data);
+ rot.mode = m;
+ } else {
+ changed_data = data;
+ if(changed_handle) {
+ ecore_event_handler_del(changed_handle);
+ changed_handle = NULL;
+ }
+ changed_handle = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY, __property, NULL);
+ }
+ }
+
+ if(!r)
+ changed_m = m;
+ }
+ }
+}
+
+static void __add_rotlock(void *data)
+{
+ int r;
+ int lock;
+
+ lock = 0;
+ r = vconf_get_bool(VCONFKEY_SETAPPL_ROTATE_LOCK_BOOL, &lock);
+ if (r) {
+ _DBG("[APP %d] Rotation vconf get bool failed", getpid());
+ }
+
+ rot.lock = lock;
+
+ vconf_notify_key_changed(VCONFKEY_SETAPPL_ROTATE_LOCK_BOOL, __lock_cb,
+ data);
+}
+
+static void __del_rotlock(void)
+{
+ vconf_ignore_key_changed(VCONFKEY_SETAPPL_ROTATE_LOCK_BOOL, __lock_cb);
+ rot.lock = 0;
+}