4 #include <wayland-server.h>
6 #include <tizen-dpms-server-protocol.h>
7 #include "libds-tizen/dpms.h"
12 struct wl_global *global;
13 struct wl_resource *res;
15 struct wl_listener destroy;
18 struct wl_signal destroy;
19 struct wl_signal set_dpms;
20 struct wl_signal get_dpms;
26 #define TIZEN_DPMS_VERSION 1
28 static void dpms_handle_display_destroy(struct wl_listener *listener,
30 static void dpms_bind(struct wl_client *wl_client, void *data,
31 uint32_t version, uint32_t id);
33 static enum ds_tizen_dpms_mode
34 _ds_tizen_dpms_get_ds_dpms_mode(uint32_t mode)
36 if (mode == TIZEN_DPMS_MANAGER_MODE_ON)
37 return DS_TIZEN_DPMS_MODE_ON;
38 else if (mode == TIZEN_DPMS_MANAGER_MODE_STANDBY)
39 return DS_TIZEN_DPMS_MODE_STANDBY;
40 else if (mode == TIZEN_DPMS_MANAGER_MODE_SUSPEND)
41 return DS_TIZEN_DPMS_MODE_SUSPEND;
42 else //TIZEN_DPMS_MANAGER_MODE_OFF
43 return DS_TIZEN_DPMS_MODE_OFF;
47 _ds_tizen_dpms_get_tizen_dpms_mode(enum ds_tizen_dpms_mode mode)
49 if (mode == DS_TIZEN_DPMS_MODE_ON)
50 return TIZEN_DPMS_MANAGER_MODE_ON;
51 else if (mode == DS_TIZEN_DPMS_MODE_STANDBY)
52 return TIZEN_DPMS_MANAGER_MODE_STANDBY;
53 else if (mode == DS_TIZEN_DPMS_MODE_SUSPEND)
54 return TIZEN_DPMS_MANAGER_MODE_SUSPEND;
55 else //DS_TIZEN_DPMS_MODE_OFF
56 return TIZEN_DPMS_MANAGER_MODE_OFF;
60 _ds_tizen_dpms_get_tizen_dpms_error(enum ds_tizen_dpms_error error)
62 if (error == DS_TIZEN_DPMS_ERROR_NONE)
63 return TIZEN_DPMS_MANAGER_ERROR_NONE;
64 else if (error == DS_TIZEN_DPMS_ERROR_INVALID_PERMISSION)
65 return TIZEN_DPMS_MANAGER_ERROR_INVALID_PERMISSION;
66 else if (error == DS_TIZEN_DPMS_ERROR_INVALID_PARAMETER)
67 return TIZEN_DPMS_MANAGER_ERROR_INVALID_PARAMETER;
68 else if (error == DS_TIZEN_DPMS_ERROR_NOT_SUPPORTED)
69 return TIZEN_DPMS_MANAGER_ERROR_NOT_SUPPORTED;
70 else //DS_TIZEN_DPMS_ERROR_ALREADY_DONE
71 return TIZEN_DPMS_MANAGER_ERROR_ALREADY_DONE;
74 WL_EXPORT struct ds_tizen_dpms *
75 ds_tizen_dpms_create(struct wl_display *display)
77 struct ds_tizen_dpms *dpms;
79 dpms = calloc(1, sizeof *dpms);
81 ds_err("dpms create fail : memory alloc failed");
85 dpms->global = wl_global_create(display, &tizen_dpms_manager_interface,
88 ds_err("global create fail : tizen_dpms_manager_interface failed");
93 wl_signal_init(&dpms->events.destroy);
94 wl_signal_init(&dpms->events.set_dpms);
95 wl_signal_init(&dpms->events.get_dpms);
97 dpms->destroy.notify = dpms_handle_display_destroy;
98 wl_display_add_destroy_listener(display, &dpms->destroy);
100 ds_inf("global create : tizen_dpms_manager(%p)", dpms);
106 ds_tizen_dpms_add_destroy_listener(struct ds_tizen_dpms *dpms,
107 struct wl_listener *listener)
109 wl_signal_add(&dpms->events.destroy, listener);
113 ds_tizen_dpms_add_set_dpms_listener(struct ds_tizen_dpms *dpms,
114 struct wl_listener *listener)
116 wl_signal_add(&dpms->events.set_dpms, listener);
120 ds_tizen_dpms_add_get_dpms_listener(struct ds_tizen_dpms *dpms,
121 struct wl_listener *listener)
123 wl_signal_add(&dpms->events.get_dpms, listener);
127 ds_tizen_dpms_send_set_result(struct ds_tizen_dpms *dpms,
128 enum ds_tizen_dpms_mode mode, enum ds_tizen_dpms_error error)
130 uint32_t tizen_dpms_mode;
131 uint32_t tizen_dpms_error;
133 if (mode > DS_TIZEN_DPMS_MODE_OFF || error > DS_TIZEN_DPMS_ERROR_ALREADY_DONE) {
134 ds_err("dpms send set result error invalid parameter");
137 tizen_dpms_mode = _ds_tizen_dpms_get_tizen_dpms_mode(mode);
138 tizen_dpms_error = _ds_tizen_dpms_get_tizen_dpms_error(error);
139 ds_dbg("dpms send set result : mode(%d), error(%d)", tizen_dpms_mode, tizen_dpms_error);
140 tizen_dpms_manager_send_set_state(dpms->res, tizen_dpms_mode, tizen_dpms_error);
144 ds_tizen_dpms_send_get_result(struct ds_tizen_dpms *dpms,
145 enum ds_tizen_dpms_mode mode, enum ds_tizen_dpms_error error)
147 uint32_t tizen_dpms_mode;
148 uint32_t tizen_dpms_error;
150 if (mode > DS_TIZEN_DPMS_MODE_OFF || error > DS_TIZEN_DPMS_ERROR_ALREADY_DONE) {
151 ds_err("dpms send get result error invalid parameter");
154 tizen_dpms_mode = _ds_tizen_dpms_get_tizen_dpms_mode(mode);
155 tizen_dpms_error = _ds_tizen_dpms_get_tizen_dpms_error(error);
156 ds_dbg("dpms send get result : mode(%d), error(%d)", tizen_dpms_mode, tizen_dpms_error);
157 tizen_dpms_manager_send_get_state(dpms->res, tizen_dpms_mode, tizen_dpms_error);
161 dpms_handle_display_destroy(struct wl_listener *listener, void *data)
163 struct ds_tizen_dpms *dpms;
165 dpms = wl_container_of(listener, dpms, destroy);
167 ds_inf("global destroy : tizen_dpms_manager(%p)", dpms);
169 wl_signal_emit(&dpms->events.destroy, dpms);
170 wl_list_remove(&dpms->destroy.link);
172 wl_resource_set_user_data(dpms->res, NULL);
173 wl_global_destroy(dpms->global);
178 _tizen_dpms_manager_handle_destroy(struct wl_client *client,
179 struct wl_resource *resource)
181 ds_inf("tizen_dpms_manager cb_destroy (res:%p)", resource);
182 wl_resource_destroy(resource);
186 _tizen_dpms_manager_handle_set_dpms(struct wl_client *client,
187 struct wl_resource *resource, struct wl_resource *wl_output, uint32_t mode)
189 struct ds_tizen_dpms *dpms;
190 struct ds_output *output;
191 enum ds_tizen_dpms_mode ds_mode;
193 dpms = wl_resource_get_user_data(resource);
195 if (mode > TIZEN_DPMS_MANAGER_MODE_OFF) {
196 ds_err("set dpms error : not supported mode(%d)", mode);
197 tizen_dpms_manager_send_set_state(resource, TIZEN_DPMS_MANAGER_MODE_OFF,
198 TIZEN_DPMS_MANAGER_ERROR_INVALID_PARAMETER);
202 output = wl_resource_get_user_data(wl_output);
203 ds_mode = _ds_tizen_dpms_get_ds_dpms_mode(mode);
204 struct ds_tizen_dpms_event event = {
209 wl_signal_emit(&dpms->events.set_dpms, &event);
213 _tizen_dpms_manager_handle_get_dpms(struct wl_client *client,
214 struct wl_resource *resource, struct wl_resource *wl_output)
216 struct ds_tizen_dpms *dpms;
217 struct ds_output *output;
219 dpms = wl_resource_get_user_data(resource);
220 output = wl_resource_get_user_data(wl_output);
222 wl_signal_emit(&dpms->events.get_dpms, output);
225 static const struct tizen_dpms_manager_interface dpms_impl =
227 _tizen_dpms_manager_handle_destroy,
228 _tizen_dpms_manager_handle_set_dpms,
229 _tizen_dpms_manager_handle_get_dpms,
233 _tizen_dpms_client_cb_destroy(struct wl_resource *resource)
235 struct ds_tizen_dpms *dpms;
237 ds_inf("tizen_dpms_client_cb_destroy (res:%p)", resource);
239 dpms = wl_resource_get_user_data(resource);
241 dpms->binded = false;
247 dpms_bind(struct wl_client *client, void *data, uint32_t version,
250 struct ds_tizen_dpms *dpms = data;
252 if (dpms->binded == true) {
253 //support only one client.
254 ds_err("dpms bind error : already binded.");
258 dpms->res = wl_resource_create(client, &tizen_dpms_manager_interface,
259 MIN(version, TIZEN_DPMS_VERSION), id);
260 if (dpms->res == NULL) {
261 ds_err("dpms bind error : wl_resource_create failed.");
262 wl_client_post_no_memory(client);
266 wl_resource_set_implementation(dpms->res, &dpms_impl, dpms,
267 _tizen_dpms_client_cb_destroy);