Skip to content

Commit 66fbda9

Browse files
committed
Display (Linux): return reason if errored
1 parent 5137a9e commit 66fbda9

File tree

5 files changed

+74
-28
lines changed

5 files changed

+74
-28
lines changed

src/detection/displayserver/linux/wayland/global-output.c

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,11 @@ static struct zxdg_output_v1_listener zxdgOutputListener = {
7878
.description = (void*) ffWaylandOutputDescriptionListener,
7979
};
8080

81-
void ffWaylandHandleGlobalOutput(WaylandData* wldata, struct wl_registry* registry, uint32_t name, uint32_t version)
81+
const char* ffWaylandHandleGlobalOutput(WaylandData* wldata, struct wl_registry* registry, uint32_t name, uint32_t version)
8282
{
8383
struct wl_proxy* output = wldata->ffwl_proxy_marshal_constructor_versioned((struct wl_proxy*) registry, WL_REGISTRY_BIND, wldata->ffwl_output_interface, version, name, wldata->ffwl_output_interface->name, version, NULL);
8484
if(output == NULL)
85-
return;
85+
return "Failed to create wl_output";
8686

8787
WaylandDisplay display = {
8888
.parent = wldata,
@@ -94,8 +94,16 @@ void ffWaylandHandleGlobalOutput(WaylandData* wldata, struct wl_registry* regist
9494
.edidName = ffStrbufCreate(),
9595
};
9696

97-
wldata->ffwl_proxy_add_listener(output, (void(**)(void)) &outputListener, &display);
98-
wldata->ffwl_display_roundtrip(wldata->display);
97+
if (wldata->ffwl_proxy_add_listener(output, (void(**)(void)) &outputListener, &display) < 0)
98+
{
99+
wldata->ffwl_proxy_destroy(output);
100+
return "Failed to add listener to wl_output";
101+
}
102+
if (wldata->ffwl_display_roundtrip(wldata->display) < 0)
103+
{
104+
wldata->ffwl_proxy_destroy(output);
105+
return "Failed to roundtrip wl_output";
106+
}
99107

100108
if (wldata->zxdgOutputManager)
101109
{
@@ -112,7 +120,7 @@ void ffWaylandHandleGlobalOutput(WaylandData* wldata, struct wl_registry* regist
112120
wldata->ffwl_proxy_destroy(output);
113121

114122
if(display.width <= 0 || display.height <= 0)
115-
return;
123+
return "Failed to get display information from wl_output";
116124

117125
uint32_t rotation = ffWaylandHandleRotation(&display);
118126

@@ -156,15 +164,19 @@ void ffWaylandHandleGlobalOutput(WaylandData* wldata, struct wl_registry* regist
156164
ffStrbufDestroy(&display.description);
157165
ffStrbufDestroy(&display.name);
158166
ffStrbufDestroy(&display.edidName);
167+
168+
return NULL;
159169
}
160170

161-
void ffWaylandHandleZxdgOutput(WaylandData* wldata, struct wl_registry* registry, uint32_t name, uint32_t version)
171+
const char* ffWaylandHandleZxdgOutput(WaylandData* wldata, struct wl_registry* registry, uint32_t name, uint32_t version)
162172
{
163173
struct wl_proxy* manager = wldata->ffwl_proxy_marshal_constructor_versioned((struct wl_proxy*) registry, WL_REGISTRY_BIND, &zxdg_output_manager_v1_interface, version, name, zxdg_output_manager_v1_interface.name, version, NULL);
164174
if(manager == NULL)
165-
return;
175+
return "Failed to create zxdg_output_manager_v1";
166176

167177
wldata->zxdgOutputManager = manager;
178+
179+
return NULL;
168180
}
169181

170182
#endif

src/detection/displayserver/linux/wayland/kde-output.c

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -167,11 +167,11 @@ static struct kde_output_device_v2_listener outputListener = {
167167
.dimming = (void*) stubListener,
168168
};
169169

170-
void ffWaylandHandleKdeOutput(WaylandData* wldata, struct wl_registry* registry, uint32_t name, uint32_t version)
170+
const char* ffWaylandHandleKdeOutput(WaylandData* wldata, struct wl_registry* registry, uint32_t name, uint32_t version)
171171
{
172172
struct wl_proxy* output = wldata->ffwl_proxy_marshal_constructor_versioned((struct wl_proxy*) registry, WL_REGISTRY_BIND, &kde_output_device_v2_interface, version, name, kde_output_device_v2_interface.name, version, NULL);
173173
if(output == NULL)
174-
return;
174+
return "Failed to create kde_output_device_v2";
175175

176176
FF_LIST_AUTO_DESTROY modes = ffListCreate(sizeof(WaylandKdeMode));
177177
WaylandDisplay display = {
@@ -185,12 +185,21 @@ void ffWaylandHandleKdeOutput(WaylandData* wldata, struct wl_registry* registry,
185185
.internal = &modes,
186186
};
187187

188-
wldata->ffwl_proxy_add_listener(output, (void(**)(void)) &outputListener, &display);
189-
wldata->ffwl_display_roundtrip(wldata->display);
188+
if (wldata->ffwl_proxy_add_listener(output, (void(**)(void)) &outputListener, &display) < 0)
189+
{
190+
wldata->ffwl_proxy_destroy(output);
191+
return "Failed to add listener to kde_output_device_v2";
192+
}
193+
194+
if (wldata->ffwl_display_roundtrip(wldata->display) < 0)
195+
{
196+
wldata->ffwl_proxy_destroy(output);
197+
return "Failed to roundtrip kde_output_device_v2";
198+
}
190199
wldata->ffwl_proxy_destroy(output);
191200

192201
if(display.width <= 0 || display.height <= 0 || !display.internal)
193-
return;
202+
return "Failed to get display information from kde_output_device_v2";
194203

195204
uint32_t rotation = ffWaylandHandleRotation(&display);
196205

@@ -233,6 +242,8 @@ void ffWaylandHandleKdeOutput(WaylandData* wldata, struct wl_registry* registry,
233242
ffStrbufDestroy(&display.description);
234243
ffStrbufDestroy(&display.name);
235244
ffStrbufDestroy(&display.edidName);
245+
246+
return NULL;
236247
}
237248

238249

@@ -243,20 +254,30 @@ static void waylandKdeOutputOrderListener(void *data, FF_MAYBE_UNUSED struct kde
243254
*id = ffWaylandGenerateIdFromName(output_name);
244255
}
245256

246-
void ffWaylandHandleKdeOutputOrder(WaylandData* wldata, struct wl_registry* registry, uint32_t name, uint32_t version)
257+
const char* ffWaylandHandleKdeOutputOrder(WaylandData* wldata, struct wl_registry* registry, uint32_t name, uint32_t version)
247258
{
248259
struct wl_proxy* output = wldata->ffwl_proxy_marshal_constructor_versioned((struct wl_proxy*) registry, WL_REGISTRY_BIND, &kde_output_order_v1_interface, version, name, kde_output_order_v1_interface.name, version, NULL);
249260
if(output == NULL)
250-
return;
261+
return "Failed to create kde_output_order_v1";
251262

252263
struct kde_output_order_v1_listener orderListener = {
253264
.output = waylandKdeOutputOrderListener,
254265
.done = (void*) stubListener,
255266
};
256267

257-
wldata->ffwl_proxy_add_listener(output, (void(**)(void)) &orderListener, &wldata->primaryDisplayId);
258-
wldata->ffwl_display_roundtrip(wldata->display);
268+
if (wldata->ffwl_proxy_add_listener(output, (void(**)(void)) &orderListener, &wldata->primaryDisplayId) < 0)
269+
{
270+
wldata->ffwl_proxy_destroy(output);
271+
return "Failed to add listener to kde_output_order_v1";
272+
}
273+
if (wldata->ffwl_display_roundtrip(wldata->display) < 0)
274+
{
275+
wldata->ffwl_proxy_destroy(output);
276+
return "Failed to roundtrip kde_output_order_v1";
277+
}
259278
wldata->ffwl_proxy_destroy(output);
279+
280+
return NULL;
260281
}
261282

262283
#endif

src/detection/displayserver/linux/wayland/wayland.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,17 +80,20 @@ static void waylandGlobalAddListener(void* data, struct wl_registry* registry, u
8080
if((wldata->protocolType == FF_WAYLAND_PROTOCOL_TYPE_NONE || wldata->protocolType == FF_WAYLAND_PROTOCOL_TYPE_GLOBAL) && ffStrEquals(interface, wldata->ffwl_output_interface->name))
8181
{
8282
wldata->protocolType = FF_WAYLAND_PROTOCOL_TYPE_GLOBAL;
83-
ffWaylandHandleGlobalOutput(wldata, registry, name, version);
83+
if (ffWaylandHandleGlobalOutput(wldata, registry, name, version) != NULL)
84+
wldata->protocolType = FF_WAYLAND_PROTOCOL_TYPE_NONE;
8485
}
8586
else if((wldata->protocolType == FF_WAYLAND_PROTOCOL_TYPE_NONE || wldata->protocolType == FF_WAYLAND_PROTOCOL_TYPE_ZWLR) && ffStrEquals(interface, zwlr_output_manager_v1_interface.name))
8687
{
8788
wldata->protocolType = FF_WAYLAND_PROTOCOL_TYPE_ZWLR;
88-
ffWaylandHandleZwlrOutput(wldata, registry, name, version);
89+
if (ffWaylandHandleZwlrOutput(wldata, registry, name, version) != NULL)
90+
wldata->protocolType = FF_WAYLAND_PROTOCOL_TYPE_NONE;
8991
}
9092
else if((wldata->protocolType == FF_WAYLAND_PROTOCOL_TYPE_NONE || wldata->protocolType == FF_WAYLAND_PROTOCOL_TYPE_KDE) && ffStrEquals(interface, kde_output_device_v2_interface.name))
9193
{
9294
wldata->protocolType = FF_WAYLAND_PROTOCOL_TYPE_KDE;
93-
ffWaylandHandleKdeOutput(wldata, registry, name, version);
95+
if (ffWaylandHandleKdeOutput(wldata, registry, name, version) != NULL)
96+
wldata->protocolType = FF_WAYLAND_PROTOCOL_TYPE_NONE;
9497
}
9598
else if(ffStrEquals(interface, kde_output_order_v1_interface.name))
9699
{

src/detection/displayserver/linux/wayland/wayland.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,10 @@ void ffWaylandOutputDescriptionListener(void* data, FF_MAYBE_UNUSED void* output
7979
// Modifies content of display. Don't call this function when calling ffdsAppendDisplay
8080
uint32_t ffWaylandHandleRotation(WaylandDisplay* display);
8181

82-
void ffWaylandHandleGlobalOutput(WaylandData* wldata, struct wl_registry* registry, uint32_t name, uint32_t version);
83-
void ffWaylandHandleZwlrOutput(WaylandData* wldata, struct wl_registry* registry, uint32_t name, uint32_t version);
84-
void ffWaylandHandleKdeOutput(WaylandData* wldata, struct wl_registry* registry, uint32_t name, uint32_t version);
85-
void ffWaylandHandleKdeOutputOrder(WaylandData* wldata, struct wl_registry* registry, uint32_t name, uint32_t version);
86-
void ffWaylandHandleZxdgOutput(WaylandData* wldata, struct wl_registry* registry, uint32_t name, uint32_t version);
82+
const char* ffWaylandHandleGlobalOutput(WaylandData* wldata, struct wl_registry* registry, uint32_t name, uint32_t version);
83+
const char* ffWaylandHandleZwlrOutput(WaylandData* wldata, struct wl_registry* registry, uint32_t name, uint32_t version);
84+
const char* ffWaylandHandleKdeOutput(WaylandData* wldata, struct wl_registry* registry, uint32_t name, uint32_t version);
85+
const char* ffWaylandHandleKdeOutputOrder(WaylandData* wldata, struct wl_registry* registry, uint32_t name, uint32_t version);
86+
const char* ffWaylandHandleZxdgOutput(WaylandData* wldata, struct wl_registry* registry, uint32_t name, uint32_t version);
8787

8888
#endif

src/detection/displayserver/linux/wayland/zwlr-output.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,21 +188,31 @@ static void waylandHandleZwlrHead(void *data, FF_MAYBE_UNUSED struct zwlr_output
188188
wldata->ffwl_proxy_destroy((void*) head);
189189
}
190190

191-
void ffWaylandHandleZwlrOutput(WaylandData* wldata, struct wl_registry* registry, uint32_t name, uint32_t version)
191+
const char* ffWaylandHandleZwlrOutput(WaylandData* wldata, struct wl_registry* registry, uint32_t name, uint32_t version)
192192
{
193193
struct wl_proxy* output = wldata->ffwl_proxy_marshal_constructor_versioned((struct wl_proxy*) registry, WL_REGISTRY_BIND, &zwlr_output_manager_v1_interface, version, name, zwlr_output_manager_v1_interface.name, version, NULL);
194194
if(output == NULL)
195-
return;
195+
return "Failed to bind zwlr_output_manager_v1";
196196

197197
const struct zwlr_output_manager_v1_listener outputListener = {
198198
.head = waylandHandleZwlrHead,
199199
.done = (void*) stubListener,
200200
.finished = (void*) stubListener,
201201
};
202202

203-
wldata->ffwl_proxy_add_listener(output, (void(**)(void)) &outputListener, wldata);
204-
wldata->ffwl_display_roundtrip(wldata->display);
203+
if (wldata->ffwl_proxy_add_listener(output, (void(**)(void)) &outputListener, wldata) < 0)
204+
{
205+
wldata->ffwl_proxy_destroy(output);
206+
return "Failed to add listener to zwlr_output_manager_v1";
207+
}
208+
if (wldata->ffwl_display_roundtrip(wldata->display) < 0)
209+
{
210+
wldata->ffwl_proxy_destroy(output);
211+
return "Failed to roundtrip display";
212+
}
205213
wldata->ffwl_proxy_destroy(output);
214+
215+
return NULL;
206216
}
207217

208218
#endif

0 commit comments

Comments
 (0)