2020#include <semaphore.h>
2121
2222#include <flutter_embedder.h>
23+ #include <klib/khash.h>
24+ #include <klib/kvec.h>
2325#include <mesa3d/dynarray.h>
2426#include <systemd/sd-event.h>
2527
3840#include "tracer.h"
3941#include "user_input.h"
4042#include "util/collection.h"
41- #include "util/dynarray.h"
4243#include "util/event_loop.h"
4344#include "util/khash_uint32.h"
44- #include "util/kvec.h"
4545#include "util/logging.h"
4646#include "util/refcounting.h"
4747#include "window.h"
@@ -308,7 +308,12 @@ double display_get_device_pixel_ratio(const struct display *display) {
308308}
309309
310310const char * display_get_connector_id (const struct display * display ) {
311+ PRAGMA_DIAGNOSTIC_PUSH
312+ PRAGMA_DIAGNOSTIC_IGNORED ("- Wpedantic ")
313+
311314 return CONTAINER_OF (display , struct connector , display )-> name ;
315+
316+ PRAGMA_DIAGNOSTIC_POP
312317}
313318
314319/**
@@ -460,9 +465,9 @@ static void send_window_metrics_events(struct compositor *compositor) {
460465 memset (& event , 0 , sizeof event );
461466
462467 event .struct_size = sizeof (FlutterWindowMetricsEvent );
463- event .width = geo .view_size .x ;
464- event .height = geo .view_size .y ;
465- event .pixel_ratio = geo .device_pixel_ratio ;
468+ event .width = ( size_t ) geo .view_size .x ;
469+ event .height = ( size_t ) geo .view_size .y ;
470+ event .pixel_ratio = ( double ) geo .device_pixel_ratio ;
466471 event .left = 0 ;
467472 event .top = 0 ;
468473 event .physical_view_inset_top = 0 ;
@@ -768,7 +773,7 @@ void compositor_set_fl_pointer_event_interface(
768773 }
769774}
770775
771- ATTR_PURE double compositor_get_refresh_rate (struct compositor * compositor ) {
776+ ATTR_PURE float compositor_get_refresh_rate (struct compositor * compositor ) {
772777 return window_get_refresh_rate (compositor -> implicit_view_fallback );
773778}
774779
@@ -941,8 +946,9 @@ static int compositor_push_fl_layers(
941946 /// TODO: Just leave the layer away in this case.
942947 LOG_ERROR ("Invalid platform view id %" PRId64 " in flutter layer.\n" , fl_layer -> platform_view -> identifier );
943948
944- layer -> surface =
945- CAST_SURFACE (dummy_render_surface_new (compositor -> tracer , VEC2I (fl_layer -> size .width , fl_layer -> size .height )));
949+ layer -> surface = CAST_SURFACE (
950+ dummy_render_surface_new (compositor -> tracer , VEC2I ((int ) fl_layer -> size .width , (int ) fl_layer -> size .height ))
951+ );
946952 }
947953
948954 // The coordinates flutter gives us are a bit buggy, so calculating the right geometry is really a problem on its own
@@ -1126,50 +1132,17 @@ const FlutterCompositor *compositor_get_flutter_compositor(struct compositor *co
11261132 return & compositor -> flutter_compositor ;
11271133}
11281134
1129- void compositor_set_cursor (
1130- struct compositor * compositor ,
1131- bool has_enabled ,
1132- bool enabled ,
1133- bool has_kind ,
1134- enum pointer_kind kind ,
1135- bool has_delta ,
1136- struct vec2f delta
1137- ) {
1138- if (!has_enabled && !has_kind && !has_delta ) {
1135+ void compositor_set_cursor (struct compositor * compositor , bool has_enabled , bool enabled , bool has_kind , enum pointer_kind kind ) {
1136+ if (!has_enabled && !has_kind ) {
11391137 return ;
11401138 }
11411139
11421140 compositor_lock (compositor );
11431141
1144- if (has_delta ) {
1145- // move cursor
1146- compositor -> cursor_pos = vec2f_add (compositor -> cursor_pos , delta );
1147-
1148- struct view_geometry viewgeo = window_get_view_geometry (compositor -> implicit_view_fallback );
1149-
1150- if (compositor -> cursor_pos .x < 0.0 ) {
1151- compositor -> cursor_pos .x = 0.0 ;
1152- } else if (compositor -> cursor_pos .x > viewgeo .view_size .x ) {
1153- compositor -> cursor_pos .x = viewgeo .view_size .x ;
1154- }
1155-
1156- if (compositor -> cursor_pos .y < 0.0 ) {
1157- compositor -> cursor_pos .y = 0.0 ;
1158- } else if (compositor -> cursor_pos .y > viewgeo .view_size .y ) {
1159- compositor -> cursor_pos .y = viewgeo .view_size .y ;
1160- }
1142+ if (compositor -> cursor .window ) {
1143+ window_set_cursor (compositor -> cursor .window , has_enabled , enabled , has_kind , kind , false, VEC2I (0 , 0 ));
11611144 }
11621145
1163- window_set_cursor (
1164- compositor -> implicit_view_fallback ,
1165- has_enabled ,
1166- enabled ,
1167- has_kind ,
1168- kind ,
1169- has_delta ,
1170- VEC2I ((int ) round (compositor -> cursor_pos .x ), (int ) round (compositor -> cursor_pos .y ))
1171- );
1172-
11731146 compositor_unlock (compositor );
11741147}
11751148
@@ -1243,18 +1216,20 @@ struct notifier *compositor_get_display_setup_notifier(struct compositor *compos
12431216}
12441217
12451218static int64_t determine_window_for_input_device (struct compositor * compositor , struct user_input_device * device ) {
1246- input_device_match_score_t best_score ;
1247- int64_t best_window ;
1219+ input_device_match_score_t best_score = -1 ;
1220+ int64_t best_window = -1 ;
12481221
1249- int64_t view_id ;
1250- struct window * window ;
1251- kh_foreach (compositor -> views , view_id , window , {
1252- input_device_match_score_t score = window_match_input_device (window , device );
1253- if (score > best_score ) {
1254- best_score = score ;
1255- best_window = view_id ;
1256- }
1257- });
1222+ {
1223+ int64_t view_id ;
1224+ struct window * window ;
1225+ kh_foreach (compositor -> views , view_id , window , {
1226+ input_device_match_score_t score = window_match_input_device (window , device );
1227+ if (score > best_score ) {
1228+ best_score = score ;
1229+ best_window = view_id ;
1230+ }
1231+ });
1232+ }
12581233
12591234 if (best_score >= 0 ) {
12601235 return best_window ;
@@ -1323,7 +1298,7 @@ static FlutterPointerEvent make_fl_pointer_add_event(
13231298 event .signal_kind = kFlutterPointerSignalKindNone ;
13241299 event .scroll_delta_x = 0 ;
13251300 event .scroll_delta_y = 0 ;
1326- event .device_kind = kFlutterPointerDeviceKindMouse ;
1301+ event .device_kind = device_kind ;
13271302 event .buttons = 0 ;
13281303 event .pan_x = 0.0 ;
13291304 event .pan_y = 0.0 ;
@@ -1353,7 +1328,7 @@ static FlutterPointerEvent make_fl_pointer_remove_event(
13531328 event .signal_kind = kFlutterPointerSignalKindNone ;
13541329 event .scroll_delta_x = 0 ;
13551330 event .scroll_delta_y = 0 ;
1356- event .device_kind = kFlutterPointerDeviceKindMouse ;
1331+ event .device_kind = device_kind ;
13571332 event .buttons = 0 ;
13581333 event .pan_x = 0.0 ;
13591334 event .pan_y = 0.0 ;
@@ -1376,7 +1351,7 @@ static FlutterPointerEvent make_fl_mouse_event(
13761351 memset (& event , 0 , sizeof event );
13771352
13781353 event .struct_size = sizeof (FlutterPointerEvent );
1379- event .phase = kRemove ;
1354+ event .phase = phase ;
13801355 event .timestamp = timestamp ;
13811356 event .x = pos_view .x ;
13821357 event .y = pos_view .y ;
@@ -1395,7 +1370,7 @@ static FlutterPointerEvent make_fl_mouse_event(
13951370 return event ;
13961371}
13971372
1398- static FlutterPointerEvent make_fl_mouse_scroll_event (
1373+ UNUSED static FlutterPointerEvent make_fl_mouse_scroll_event (
13991374 FlutterPointerPhase phase ,
14001375 uint64_t timestamp ,
14011376 struct vec2f pos_view ,
@@ -1408,7 +1383,7 @@ static FlutterPointerEvent make_fl_mouse_scroll_event(
14081383 memset (& event , 0 , sizeof event );
14091384
14101385 event .struct_size = sizeof (FlutterPointerEvent );
1411- event .phase = kRemove ;
1386+ event .phase = phase ;
14121387 event .timestamp = timestamp ;
14131388 event .x = pos_view .x ;
14141389 event .y = pos_view .y ;
@@ -1454,7 +1429,7 @@ static void on_device_removed(struct compositor *compositor, struct user_input_d
14541429 user_input_device_set_primary_listener_userdata (device , NULL );
14551430}
14561431
1457- static void on_slot_added (struct compositor * compositor , struct fl_event_buffer * buffer , struct user_input_event * event ) {
1432+ static void on_slot_added (struct compositor * compositor , struct fl_event_buffer * buffer , const struct user_input_event * event ) {
14581433 int64_t view_id = get_view_id_for_input_device (compositor , event -> device );
14591434 if (view_id == -1 ) {
14601435 return ;
@@ -1473,7 +1448,7 @@ static void on_slot_added(struct compositor *compositor, struct fl_event_buffer
14731448 emit_fl_event (buffer , fl_event );
14741449}
14751450
1476- static void on_slot_removed (struct compositor * compositor , struct fl_event_buffer * buffer , struct user_input_event * event ) {
1451+ static void on_slot_removed (struct compositor * compositor , struct fl_event_buffer * buffer , const struct user_input_event * event ) {
14771452 int64_t view_id = get_view_id_for_input_device (compositor , event -> device );
14781453 if (view_id == -1 ) {
14791454 return ;
@@ -1492,7 +1467,7 @@ static void on_slot_removed(struct compositor *compositor, struct fl_event_buffe
14921467 emit_fl_event (buffer , fl_event );
14931468}
14941469
1495- static void on_absolute_pointer_event (struct compositor * compositor , struct fl_event_buffer * buffer , struct user_input_event * event ) {
1470+ static void on_absolute_pointer_event (struct compositor * compositor , struct fl_event_buffer * buffer , const struct user_input_event * event ) {
14961471 ASSERT (event -> pointer .is_absolute );
14971472
14981473 int64_t view_id = get_view_id_for_input_device (compositor , event -> device );
@@ -1622,7 +1597,7 @@ static void maybe_enable_cursor_locked(struct compositor *compositor) {
16221597}
16231598
16241599static void
1625- on_relative_pointer_event_locked (struct compositor * compositor , struct fl_event_buffer * buffer , struct user_input_event * event ) {
1600+ on_relative_pointer_event_locked (struct compositor * compositor , struct fl_event_buffer * buffer , const struct user_input_event * event ) {
16261601 ASSERT (!event -> pointer .is_absolute );
16271602
16281603 // If the cursor is not enabled, we need to enable it.
@@ -1718,13 +1693,23 @@ on_relative_pointer_event_locked(struct compositor *compositor, struct fl_event_
17181693 window_unrefp (& current_window );
17191694}
17201695
1721- static void on_pointer_scroll_event (struct compositor * compositor , struct fl_event_buffer * buffer , struct user_input_event * event ) {
1696+ static void on_pointer_scroll_event (struct compositor * compositor , struct fl_event_buffer * buffer , const struct user_input_event * event ) {
1697+ (void ) compositor ;
1698+ (void ) buffer ;
1699+ (void ) event ;
1700+ /// TODO: Implement
1701+ UNIMPLEMENTED ();
17221702}
17231703
1724- static void on_pointer_button_event (struct compositor * compositor , struct fl_event_buffer * buffer , struct user_input_event * event ) {
1704+ static void on_pointer_button_event (struct compositor * compositor , struct fl_event_buffer * buffer , const struct user_input_event * event ) {
1705+ (void ) compositor ;
1706+ (void ) buffer ;
1707+ (void ) event ;
1708+ /// TODO: Implement
1709+ UNIMPLEMENTED ();
17251710}
17261711
1727- static void on_pointer_event (struct compositor * compositor , struct fl_event_buffer * buffer , struct user_input_event * event ) {
1712+ static void on_pointer_event (struct compositor * compositor , struct fl_event_buffer * buffer , const struct user_input_event * event ) {
17281713 if (event -> pointer .is_absolute ) {
17291714 on_absolute_pointer_event (compositor , buffer , event );
17301715 } else if (event -> pointer .delta .x != 0 || event -> pointer .delta .y != 0 ) {
@@ -1736,7 +1721,7 @@ static void on_pointer_event(struct compositor *compositor, struct fl_event_buff
17361721 }
17371722}
17381723
1739- static void on_touch_event (struct compositor * compositor , struct fl_event_buffer * buffer , struct user_input_event * event ) {
1724+ static void on_touch_event (struct compositor * compositor , struct fl_event_buffer * buffer , const struct user_input_event * event ) {
17401725 int64_t view_id = get_view_id_for_input_device (compositor , event -> device );
17411726 if (view_id == -1 ) {
17421727 return ;
@@ -1761,7 +1746,7 @@ static void on_touch_event(struct compositor *compositor, struct fl_event_buffer
17611746 emit_fl_event (buffer , fl_event );
17621747}
17631748
1764- static void on_tablet_tool_event (struct compositor * compositor , struct fl_event_buffer * buffer , struct user_input_event * event ) {
1749+ static void on_tablet_tool_event (struct compositor * compositor , struct fl_event_buffer * buffer , const struct user_input_event * event ) {
17651750 int64_t view_id = get_view_id_for_input_device (compositor , event -> device );
17661751 if (view_id == -1 ) {
17671752 return ;
@@ -1775,20 +1760,28 @@ static void on_tablet_tool_event(struct compositor *compositor, struct fl_event_
17751760 fl_event .phase = kMove ;
17761761 fl_event .x = event -> tablet .position_ndc .x ;
17771762 fl_event .y = event -> tablet .position_ndc .y ;
1778- fl_event .device = event -> device ;
1763+ fl_event .device = kFlutterPointerDeviceKindStylus ;
17791764 fl_event .view_id = view_id ;
17801765
17811766 emit_fl_event (buffer , fl_event );
17821767}
17831768
17841769static void on_input (void * userdata , size_t n_events , const struct user_input_event * events ) {
1785- struct fl_event_buffer buffer ;
17861770 struct compositor * compositor ;
17871771 size_t i ;
17881772
17891773 ASSERT_NOT_NULL (userdata );
17901774 compositor = userdata ;
17911775
1776+ if (!compositor -> has_pointer_event_interface ) {
1777+ return ;
1778+ }
1779+
1780+ struct fl_event_buffer buffer = {
1781+ .n_events = 0 ,
1782+ .pointer_event_interface = compositor -> pointer_event_interface ,
1783+ };
1784+
17921785 for (i = 0 ; i < n_events ; i ++ ) {
17931786 const struct user_input_event * event = events + i ;
17941787
@@ -1800,6 +1793,7 @@ static void on_input(void *userdata, size_t n_events, const struct user_input_ev
18001793 case USER_INPUT_TOUCH : on_touch_event (compositor , & buffer , event ); break ;
18011794 case USER_INPUT_TABLET_TOOL : on_tablet_tool_event (compositor , & buffer , event ); break ;
18021795 case USER_INPUT_POINTER : on_pointer_event (compositor , & buffer , event ); break ;
1796+ case USER_INPUT_KEY : UNREACHABLE (); break ;
18031797 default : LOG_DEBUG ("Unhandled enum user_input_event: %d\n" , event -> type ); break ;
18041798 }
18051799 }
0 commit comments