#define E_COMP_WL
#include "e.h"
+#include <Evas_Engine_Drm.h>
+#include <Ecore_Drm.h>
+
/* handle include for printing uint64_t */
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
/* delete fd handler */
if (cdata->fd_hdlr) ecore_main_fd_handler_del(cdata->fd_hdlr);
+ eina_list_free(cdata->output.resources);
+
/* free allocated data structure */
free(cdata);
}
E_FREE_LIST(ec->pending_resize, free);
}
+static void
+_e_comp_wl_cb_output_unbind(struct wl_resource *resource)
+{
+ E_Comp_Data *cdata = wl_resource_get_user_data(resource);
+
+ cdata->output.resources = eina_list_remove(cdata->output.resources,
+ resource);
+}
+
+static void
+_e_comp_wl_output_bind(struct wl_client *client, void *data, uint32_t version, uint32_t id)
+{
+ E_Comp_Data *cdata = data;
+ Evas_Engine_Info_Drm *einfo;
+ Ecore_Drm_Device *dev;
+ Eina_List *l;
+ Ecore_Drm_Output *output;
+ struct wl_resource *resource;
+
+ einfo = (Evas_Engine_Info_Drm *)evas_engine_info_get(e_comp->evas);
+ dev = einfo->info.dev;
+ resource = wl_resource_create(client, &wl_output_interface,
+ MIN(version, 2), id);
+ if (resource == NULL)
+ {
+ wl_client_post_no_memory(client);
+ return;
+ }
+
+ cdata->output.resources = eina_list_append(cdata->output.resources,
+ resource);
+ wl_resource_set_implementation(resource, NULL, data, NULL);
+ wl_resource_set_user_data(resource, cdata);
+ EINA_LIST_FOREACH(dev->outputs, l, output)
+ {
+ int ox, oy, rw, rh, rr, pw, ph;
+ unsigned int spo;
+ const char *make, *model;
+
+ ecore_drm_output_position_get(output, &ox, &oy);
+ ecore_drm_output_current_resolution_get(output, &rw, &rh, &rr);
+ ecore_drm_output_physical_size_get(output, &pw, &ph);
+ spo = ecore_drm_output_subpixel_order_get(output);
+ make = ecore_drm_output_model_get(output);
+ model = ecore_drm_output_make_get(output);
+
+ wl_output_send_geometry(resource, ox, oy, pw, ph, spo, make, model,
+ 0/* output transform*/);
+
+ if (version >= WL_OUTPUT_SCALE_SINCE_VERSION)
+ wl_output_send_scale(resource, 1/* current scale */);
+
+ wl_output_send_mode(resource, 3/*preferred + current */, rw, rh, rr);
+ }
+
+ if (version >= WL_OUTPUT_DONE_SINCE_VERSION)
+ wl_output_send_done(resource);
+}
+
static Eina_Bool
_e_comp_wl_compositor_create(void)
{
ERR("Could not add subcompositor to wayland globals: %m");
goto comp_global_err;
}
+ if (!wl_global_create(cdata->wl.disp, &wl_output_interface, 2,
+ cdata, _e_comp_wl_output_bind))
+ {
+ ERR("Could not add output to wayland globals: %m");
+ goto comp_global_err;
+ }
/* try to init data manager */
if (!e_comp_wl_data_manager_init(cdata))