summaryrefslogtreecommitdiffstats
path: root/waltham-transmitter/transmitter-plugin/output.c
diff options
context:
space:
mode:
Diffstat (limited to 'waltham-transmitter/transmitter-plugin/output.c')
-rw-r--r--waltham-transmitter/transmitter-plugin/output.c109
1 files changed, 69 insertions, 40 deletions
diff --git a/waltham-transmitter/transmitter-plugin/output.c b/waltham-transmitter/transmitter-plugin/output.c
index 6768eee..dc7d5d8 100644
--- a/waltham-transmitter/transmitter-plugin/output.c
+++ b/waltham-transmitter/transmitter-plugin/output.c
@@ -122,10 +122,10 @@ transmitter_output_destroy(struct weston_transmitter_output *output)
{
wl_list_remove(&output->link);
+ struct weston_head *head=weston_output_get_first_head(&output->base);
free_mode_list(&output->base.mode_list);
- free(output->base.serial_number);
- free(output->base.model);
- free(output->base.make);
+ weston_head_release(head);
+ free(head);
weston_output_destroy(&output->base);
free(output);
@@ -139,20 +139,26 @@ transmitter_output_destroy_(struct weston_output *base)
transmitter_output_destroy(output);
}
+static int
+transmitter_output_finish_frame_handler(void *data)
+{
+ struct weston_transmitter_output *output = data;
+ struct timespec now;
+ weston_compositor_read_presentation_clock(output->base.compositor, &now);
+ weston_output_finish_frame(&output->base, &now, 0);
+ return 0;
+}
static void
transmitter_start_repaint_loop(struct weston_output *base)
{
- struct timespec ts;
struct weston_transmitter_output *output = wl_container_of(base, output, base);
-
- weston_compositor_read_presentation_clock(output->base.compositor, &ts);
- weston_output_finish_frame(&output->base, &ts, 0);
+ weston_output_finish_frame(&output->base,NULL, WP_PRESENTATION_FEEDBACK_INVALID);
}
static int
transmitter_output_repaint(struct weston_output *base,
- pixman_region32_t *damage)
+ pixman_region32_t *damage,void *repaint_data)
{
struct weston_transmitter_output* output = wl_container_of(base, output, base);
struct weston_transmitter_remote* remote = output->remote;
@@ -222,19 +228,16 @@ transmitter_output_repaint(struct weston_output *base,
if (!found_output)
goto out;
- weston_compositor_read_presentation_clock(output->base.compositor, &ts);
- weston_output_finish_frame(&output->base, &ts, 0);
-
+ wl_event_source_timer_update(output->finish_frame_timer,1);
return 0;
out:
- transmitter_start_repaint_loop(base);
-
+ wl_event_source_timer_update(output->finish_frame_timer,1);
return 0;
}
static void
-transmitter_assign_planes(struct weston_output *base) {
+transmitter_assign_planes(struct weston_output *base,void *repaint_data) {
/*
* This function prevents compositor releasing buffer early.
*/
@@ -259,6 +262,7 @@ static int
transmitter_output_enable(struct weston_output *base)
{
struct weston_transmitter_output *output = wl_container_of(base, output, base);
+ struct wl_event_loop *loop;
if (!output) {
weston_log("No weston output found\n");
return -1;
@@ -268,6 +272,27 @@ transmitter_output_enable(struct weston_output *base)
output->base.set_dpms = NULL;
output->base.switch_mode = NULL;
+ loop = wl_display_get_event_loop(base->compositor->wl_display);
+ output->finish_frame_timer =
+ wl_event_loop_add_timer(loop,
+ transmitter_output_finish_frame_handler,
+ output);
+ return 0;
+}
+
+/* FIXME:This is a dummy call we just return 0(success)*/
+int transmitter_output_attach_head(struct weston_output *output,
+ struct weston_head *head)
+{
+ weston_log("%s is called\n",__func__);
+ return 0;
+}
+
+/* FIXME:This is a dummy call we just return 0(success)*/
+int transmitter_output_detach_head(struct weston_output *output,
+ struct weston_head *head)
+{
+ weston_log("%s is called\n",__func__);
return 0;
}
@@ -277,7 +302,17 @@ transmitter_remote_create_output(struct weston_transmitter_remote *remote,
{
struct weston_transmitter_output *output;
struct weston_transmitter *txr = remote->transmitter;
- struct weston_output *def_output;
+ struct weston_head *head;
+ const char *make = strdup(WESTON_TRANSMITTER_OUTPUT_MAKE);
+ const char *model = make_model(remote, 1);
+ const char *serial_number = strdup("0");
+ const char *connector_name = make_model(remote, 1);
+
+ head=zalloc(sizeof *head);
+ if (!head){
+ weston_log("allocation failed for head\n");
+ return -1;
+ }
output = zalloc(sizeof *output);
if (!output)
@@ -285,36 +320,24 @@ transmitter_remote_create_output(struct weston_transmitter_remote *remote,
output->parent.draw_initial_frame = true;
- output->base.subpixel = info->subpixel;
+ weston_head_init(head,connector_name);
+ weston_head_set_subpixel(head, info->subpixel);
+ weston_head_set_monitor_strings(head, make, model, serial_number);
+
+ head->compositor=remote->transmitter->compositor;
- output->base.name = make_model(remote, 1);
- output->base.make = strdup(WESTON_TRANSMITTER_OUTPUT_MAKE);
- output->base.model = make_model(remote, 1);
- output->base.serial_number = strdup("0");
/* x and y is fake value */
wl_list_init(&output->base.mode_list);
+ output->base.name = make_model(remote, 1);
+ /* WL_OUTPUT_MODE_CURRENT already set */
+ weston_output_init(&output->base, remote->transmitter->compositor,output->base.name);
if (make_mode_list(&output->base.mode_list, info) < 0)
goto fail;
output->base.current_mode = get_current_mode(&output->base.mode_list);
output->base.height = output->base.current_mode->height;
output->base.width = output->base.current_mode->width;
- /* WL_OUTPUT_MODE_CURRENT already set */
- weston_output_init(&output->base, remote->transmitter->compositor);
-
- /*
- * renderer_output_create skipped:
- * no renderer awareness is needed for this output
- */
- /*
- * weston_compositor_add_output() skipped:
- * Most other code uses weston_compositor::output_list when traversing
- * all outputs, we do not want any of that.
- * Also weston_compositor::output_created_signal must not trigger
- * for this output, since we must not involve input device management
- * or color management or any kind of local management.
- */
output->base.enable = transmitter_output_enable;
output->base.start_repaint_loop = transmitter_start_repaint_loop;
output->base.repaint = transmitter_output_repaint;
@@ -330,6 +353,9 @@ transmitter_remote_create_output(struct weston_transmitter_remote *remote,
output->base.scale = 1;
output->base.transform = WL_OUTPUT_TRANSFORM_NORMAL;
+ output->base.attach_head = transmitter_output_attach_head;
+ output->base.detach_head = transmitter_output_detach_head;
+
output->remote = remote;
wl_list_insert(&remote->output_list, &output->link);
@@ -338,16 +364,19 @@ transmitter_remote_create_output(struct weston_transmitter_remote *remote,
return -1;
}
- weston_output_enable(&output->base);
+ if(!weston_output_attach_head(&output->base,head)){
+ weston_log("Weston head attached successfully to output\n");
+ }
+
+ if(weston_output_enable(&output->base)<0){
+ weston_log("Failed to enable weston output\n");
+ }
return 0;
fail:
free_mode_list(&output->base.mode_list);
- free(output->base.serial_number);
- free(output->base.model);
- free(output->base.make);
- free(output->base.name);
+ free(head);
free(output);
return -1;