pidgin/gtkrequest.c

branch
release-2.x.y
changeset 40399
ca83fa85f401
parent 40398
f3c12f0656c5
equal deleted inserted replaced
40398:f3c12f0656c5 40399:ca83fa85f401
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);

mercurial