| 1767 gchar *request_path; |
1767 gchar *request_path; |
| 1768 |
1768 |
| 1769 bus_name = g_dbus_connection_get_unique_name(data->u.screenshare.dbus_connection); |
1769 bus_name = g_dbus_connection_get_unique_name(data->u.screenshare.dbus_connection); |
| 1770 |
1770 |
| 1771 request_str = g_strdup_printf("u%u", data->u.screenshare.portal_request_nr++); |
1771 request_str = g_strdup_printf("u%u", data->u.screenshare.portal_request_nr++); |
| 1772 if (!request_str) |
1772 if (!request_str) { |
| 1773 return NULL; |
1773 return NULL; |
| |
1774 } |
| 1774 |
1775 |
| 1775 request_path = g_strdup_printf("/org/freedesktop/portal/desktop/request/%s/%s", |
1776 request_path = g_strdup_printf("/org/freedesktop/portal/desktop/request/%s/%s", |
| 1776 bus_name + 1, request_str); |
1777 bus_name + 1, request_str); |
| 1777 if (!request_path) { |
1778 if (!request_path) { |
| 1778 g_free(request_str); |
1779 g_free(request_str); |
| 1780 } |
1781 } |
| 1781 |
1782 |
| 1782 g_variant_builder_add(b, "{sv}", "handle_token", g_variant_new_take_string(request_str)); |
1783 g_variant_builder_add(b, "{sv}", "handle_token", g_variant_new_take_string(request_str)); |
| 1783 |
1784 |
| 1784 dot = request_path; |
1785 dot = request_path; |
| 1785 while ((dot = strchr(dot, '.'))) |
1786 while ((dot = strchr(dot, '.'))) { |
| 1786 *dot = '_'; |
1787 *dot = '_'; |
| |
1788 } |
| 1787 |
1789 |
| 1788 return request_path; |
1790 return request_path; |
| 1789 } |
1791 } |
| 1790 |
1792 |
| 1791 static void screen_cast_call(PidginRequestData *data, const gchar *method, const gchar *str_arg, |
1793 static void screen_cast_call(PidginRequestData *data, const gchar *method, const gchar *str_arg, |
| 1798 if (data->u.screenshare.signal_id) { |
1800 if (data->u.screenshare.signal_id) { |
| 1799 g_dbus_connection_signal_unsubscribe(data->u.screenshare.dbus_connection, |
1801 g_dbus_connection_signal_unsubscribe(data->u.screenshare.dbus_connection, |
| 1800 data->u.screenshare.signal_id); |
1802 data->u.screenshare.signal_id); |
| 1801 } |
1803 } |
| 1802 |
1804 |
| 1803 if (!opts) |
1805 if (!opts) { |
| 1804 opts = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); |
1806 opts = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); |
| |
1807 } |
| 1805 |
1808 |
| 1806 request_path = portal_request_path(data, opts); |
1809 request_path = portal_request_path(data, opts); |
| 1807 if (!request_path) { |
1810 if (!request_path) { |
| 1808 g_variant_builder_unref(opts); |
1811 g_variant_builder_unref(opts); |
| 1809 purple_notify_error(NULL, _("Screen share error"), |
1812 purple_notify_error(NULL, _("Screen share error"), |
| 1822 "/org/freedesktop/portal/desktop", |
1825 "/org/freedesktop/portal/desktop", |
| 1823 "org.freedesktop.portal.ScreenCast", |
1826 "org.freedesktop.portal.ScreenCast", |
| 1824 method); |
1827 method); |
| 1825 |
1828 |
| 1826 g_variant_builder_init(&b, G_VARIANT_TYPE_TUPLE); |
1829 g_variant_builder_init(&b, G_VARIANT_TYPE_TUPLE); |
| 1827 if (data->u.screenshare.session_path) |
1830 if (data->u.screenshare.session_path) { |
| 1828 g_variant_builder_add(&b, "o", data->u.screenshare.session_path); |
1831 g_variant_builder_add(&b, "o", data->u.screenshare.session_path); |
| 1829 if (str_arg) |
1832 } |
| |
1833 if (str_arg) { |
| 1830 g_variant_builder_add(&b, "s", str_arg); |
1834 g_variant_builder_add(&b, "s", str_arg); |
| |
1835 } |
| 1831 g_variant_builder_add(&b, "a{sv}", opts); |
1836 g_variant_builder_add(&b, "a{sv}", opts); |
| 1832 |
1837 |
| 1833 g_dbus_message_set_body(msg, g_variant_builder_end(&b)); |
1838 g_dbus_message_set_body(msg, g_variant_builder_end(&b)); |
| 1834 |
1839 |
| 1835 g_dbus_connection_send_message_with_reply(data->u.screenshare.dbus_connection, msg, |
1840 g_dbus_connection_send_message_with_reply(data->u.screenshare.dbus_connection, msg, |
| 1842 GstElement *ret; |
1847 GstElement *ret; |
| 1843 GObject *info; |
1848 GObject *info; |
| 1844 gchar *node_id; |
1849 gchar *node_id; |
| 1845 |
1850 |
| 1846 info = g_object_get_data(G_OBJECT(media), "src-element"); |
1851 info = g_object_get_data(G_OBJECT(media), "src-element"); |
| 1847 if (!info) |
1852 if (!info) { |
| 1848 return NULL; |
1853 return NULL; |
| |
1854 } |
| 1849 |
1855 |
| 1850 ret = gst_element_factory_make("pipewiresrc", NULL); |
1856 ret = gst_element_factory_make("pipewiresrc", NULL); |
| 1851 if (ret == NULL) |
1857 if (ret == NULL) { |
| 1852 return NULL; |
1858 return NULL; |
| |
1859 } |
| 1853 |
1860 |
| 1854 /* Take the node-id and fd from the PurpleMediaElementInfo |
1861 /* Take the node-id and fd from the PurpleMediaElementInfo |
| 1855 * and apply them to the pipewiresrc */ |
1862 * and apply them to the pipewiresrc */ |
| 1856 node_id = g_strdup_printf("%u", |
1863 node_id = g_strdup_printf("%u", |
| 1857 GPOINTER_TO_UINT(g_object_get_data(info, "node-id"))); |
1864 GPOINTER_TO_UINT(g_object_get_data(info, "node-id"))); |
| 1923 static void get_pipewire_fd(PidginRequestData *data) |
1930 static void get_pipewire_fd(PidginRequestData *data) |
| 1924 { |
1931 { |
| 1925 GDBusMessage *msg; |
1932 GDBusMessage *msg; |
| 1926 GVariant *args; |
1933 GVariant *args; |
| 1927 |
1934 |
| 1928 if (data->u.screenshare.signal_id) |
1935 if (data->u.screenshare.signal_id) { |
| 1929 g_dbus_connection_signal_unsubscribe(data->u.screenshare.dbus_connection, |
1936 g_dbus_connection_signal_unsubscribe(data->u.screenshare.dbus_connection, |
| 1930 data->u.screenshare.signal_id); |
1937 data->u.screenshare.signal_id); |
| |
1938 } |
| 1931 data->u.screenshare.signal_id = 0; |
1939 data->u.screenshare.signal_id = 0; |
| 1932 |
1940 |
| 1933 msg = g_dbus_message_new_method_call("org.freedesktop.portal.Desktop", |
1941 msg = g_dbus_message_new_method_call("org.freedesktop.portal.Desktop", |
| 1934 "/org/freedesktop/portal/desktop", |
1942 "/org/freedesktop/portal/desktop", |
| 1935 "org.freedesktop.portal.ScreenCast", |
1943 "org.freedesktop.portal.ScreenCast", |
| 2035 |
2043 |
| 2036 static gboolean request_xdp_portal_screenshare(PidginRequestData *data) |
2044 static gboolean request_xdp_portal_screenshare(PidginRequestData *data) |
| 2037 { |
2045 { |
| 2038 gchar *addr; |
2046 gchar *addr; |
| 2039 |
2047 |
| 2040 if (portal_failed) |
2048 if (portal_failed) { |
| 2041 return FALSE; |
2049 return FALSE; |
| |
2050 } |
| 2042 |
2051 |
| 2043 data->u.screenshare.cancellable = g_cancellable_new(); |
2052 data->u.screenshare.cancellable = g_cancellable_new(); |
| 2044 |
2053 |
| 2045 /* We create a new connection instead of using g_bus_get() because it |
2054 /* We create a new connection instead of using g_bus_get() because it |
| 2046 * makes cleanup a *lot* easier. Just kill the connection. */ |
2055 * makes cleanup a *lot* easier. Just kill the connection. */ |
| 2262 } |
2271 } |
| 2263 |
2272 |
| 2264 static void |
2273 static void |
| 2265 screenshare_cancel_cb(GtkWidget *button, PidginRequestData *data) |
2274 screenshare_cancel_cb(GtkWidget *button, PidginRequestData *data) |
| 2266 { |
2275 { |
| 2267 if (data->dialog) |
2276 if (data->dialog) { |
| 2268 generic_response_start(data); |
2277 generic_response_start(data); |
| |
2278 } |
| 2269 |
2279 |
| 2270 if (data->cbs[0] != NULL) |
2280 if (data->cbs[0] != NULL) |
| 2271 ((PurpleRequestScreenshareCb)data->cbs[0])(data->user_data, NULL); |
2281 ((PurpleRequestScreenshareCb)data->cbs[0])(data->user_data, NULL); |
| 2272 |
2282 |
| 2273 purple_request_close(PURPLE_REQUEST_SCREENSHARE, data); |
2283 purple_request_close(PURPLE_REQUEST_SCREENSHARE, data); |
| 2439 { |
2449 { |
| 2440 PidginRequestData *data = (PidginRequestData *)ui_handle; |
2450 PidginRequestData *data = (PidginRequestData *)ui_handle; |
| 2441 |
2451 |
| 2442 g_free(data->cbs); |
2452 g_free(data->cbs); |
| 2443 |
2453 |
| 2444 if (data->dialog) |
2454 if (data->dialog) { |
| 2445 gtk_widget_destroy(data->dialog); |
2455 gtk_widget_destroy(data->dialog); |
| 2446 |
2456 } |
| 2447 if (type == PURPLE_REQUEST_FIELDS) |
2457 |
| |
2458 if (type == PURPLE_REQUEST_FIELDS) { |
| 2448 purple_request_fields_destroy(data->u.multifield.fields); |
2459 purple_request_fields_destroy(data->u.multifield.fields); |
| 2449 else if (type == PURPLE_REQUEST_FILE) |
2460 } else if (type == PURPLE_REQUEST_FILE) { |
| 2450 g_free(data->u.file.name); |
2461 g_free(data->u.file.name); |
| 2451 else if (type == PURPLE_REQUEST_SCREENSHARE) { |
2462 } else if (type == PURPLE_REQUEST_SCREENSHARE) { |
| 2452 #ifdef HAVE_GIOUNIX |
2463 #ifdef HAVE_GIOUNIX |
| 2453 g_cancellable_cancel(data->u.screenshare.cancellable); |
2464 g_cancellable_cancel(data->u.screenshare.cancellable); |
| 2454 if (data->u.screenshare.signal_id) |
2465 if (data->u.screenshare.signal_id) |
| 2455 g_dbus_connection_signal_unsubscribe(data->u.screenshare.dbus_connection, |
2466 g_dbus_connection_signal_unsubscribe(data->u.screenshare.dbus_connection, |
| 2456 data->u.screenshare.signal_id); |
2467 data->u.screenshare.signal_id); |