exo issueshttps://gitlab.xfce.org/xfce/exo/-/issues2024-01-30T06:04:13Zhttps://gitlab.xfce.org/xfce/exo/-/issues/1104.19.0: test suite fails in env with glib build with disabled asserts2024-01-30T06:04:13ZTomasz Kłoczko4.19.0: test suite fails in env with glib build with disabled assertsLooks like exo test suite uses incorrect glib asserts functions which should not be used in test suite:
From https://www.manpagez.com/html/glib/glib-2.46.2/glib-Testing.php#g-assert
> ### g_assert()
>
> #define g_assert(expr)
>
> Debug...Looks like exo test suite uses incorrect glib asserts functions which should not be used in test suite:
From https://www.manpagez.com/html/glib/glib-2.46.2/glib-Testing.php#g-assert
> ### g_assert()
>
> #define g_assert(expr)
>
> Debugging macro to terminate the application if the assertion fails. If the assertion fails (i.e. the expression is not true), an error message is logged and the application is terminated.
>
> The macro can be turned off in final releases of code by defining `G_DISABLE_ASSERT` when compiling the application.
Instead `g_assert ()` should be used other `g_assert_* ()` assertions
```plaintext
[tkloczko@pers-jacek exo-4.19.0]$ grep g_assert tests/*
tests/test-exo-noop.c: g_assert (exo_noop_one () == 1);
tests/test-exo-noop.c: g_assert (exo_noop_zero () == 0);
tests/test-exo-noop.c: g_assert (exo_noop_null () == NULL);
tests/test-exo-noop.c: g_assert (exo_noop_true () == TRUE);
tests/test-exo-noop.c: g_assert (exo_noop_false () == FALSE);
tests/test-exo-string.c: g_assert_cmpstr (res, ==, "thisisasample");
tests/test-exo-string.c: g_assert_cmpstr (res, ==, "m_nemonic");
tests/test-exo-string.c: g_assert (!exo_str_is_equal ("a", NULL));
tests/test-exo-string.c: g_assert (!exo_str_is_equal (NULL, "b"));
tests/test-exo-string.c: g_assert (!exo_str_is_equal ("a", "abcde"));
tests/test-exo-string.c: g_assert (!exo_str_is_equal (p, "a"));
tests/test-exo-string.c: g_assert (exo_str_is_equal (NULL, NULL));
tests/test-exo-string.c: g_assert (exo_str_is_equal ("test", "test"));
tests/test-exo-string.c: g_assert (exo_str_is_equal (p, p));
tests/test-exo-string.c: g_assert (exo_str_is_empty (p));
tests/test-exo-string.c: g_assert (exo_str_is_empty (p));
tests/test-exo-string.c: g_assert (!exo_str_is_empty (p));
tests/test-exo-string.c: g_assert_cmpstr (res, ==, "You should eat pizza every day.");
tests/test-exo-string.c: g_assert_cmpstr (res, ==, "You should eat.");
tests/test-exo-string.c: g_assert (res == NULL);
tests/test-exo-string.c: g_assert_cmpstr (res, ==, test);
tests/test-exo-string.c: g_assert_cmpuint (g_strv_length (res), ==, 2);
tests/test-exo-string.c: g_assert_cmpstr (res[i], ==, input[i]);
tests/test-exo-string.c: g_assert_cmpuint (g_strv_length (res), ==, g_strv_length (input));
tests/test-exo-string.c: g_assert_cmpstr (res[i], ==, input[i]);
tests/test-exo-string.c: g_assert (res == NULL);
tests/test-exo-string.c: g_assert (res == NULL);
```
Result of above is that test suite fails with:
```plaintext
======================================
exo 4.19.0: tests/test-suite.log
======================================
# TOTAL: 2
# PASS: 0
# SKIP: 0
# XFAIL: 0
# FAIL: 2
# XPASS: 0
# ERROR: 0
.. contents:: :depth: 2
FAIL: test-exo-noop
===================
Tests were compiled with G_DISABLE_ASSERT and are likely no-ops. Aborting.
FAIL test-exo-noop (exit status: 1)
FAIL: test-exo-string
=====================
Tests were compiled with G_DISABLE_ASSERT and are likely no-ops. Aborting.
FAIL test-exo-string (exit status: 1)
============================================================================
Testsuite summary for exo 4.19.0
============================================================================
# TOTAL: 2
# PASS: 0
# SKIP: 0
# XFAIL: 0
# FAIL: 2
# XPASS: 0
# ERROR: 0
============================================================================
See tests/test-suite.log
Please report to https://gitlab.xfce.org/xfce/exo
============================================================================
make[3]: *** [Makefile:860: test-suite.log] Error 1
```https://gitlab.xfce.org/xfce/exo/-/issues/109Many problems with the icon chooser2023-10-13T21:09:15ZArash RohaniMany problems with the icon chooserHere are some of the problems with the current exo icon chooser:
1. Symlink icon files are omitted (#5).
2. Symbolic icons are omitted.
3. Icons that belong to multiple contexts are only shown in one context.
For example "checkmark" ico...Here are some of the problems with the current exo icon chooser:
1. Symlink icon files are omitted (#5).
2. Symbolic icons are omitted.
3. Icons that belong to multiple contexts are only shown in one context.
For example "checkmark" icon belongs to both "Actions" and "Emblems" but the icon chooser only shows it in the "Emblems" category because it comes after "Actions".
4. Extremely slow for bigger SVG icon themes like Papirus. If we fix the first 2 problems (symlink and symbolic) then the performance becomes even worse.
Using Papirus icons, I have tested the delay time of 3 different commits:
No fixes (e2fa5d99):
+ 3-4 seconds delay for icon chooser window to show up.
+ 4-5 seconds delay before icon chooser becomes responsive when changing categories to "All Icons" or clearing text filter on "All Icons".
Symlink fix (https://gitlab.xfce.org/arash-rohani/exo/-/commit/10aa5dd15118ff3894896fbba9bfd1e0d29cb01e):
+ 5-6 seconds delay for icon chooser window to show up.
+ 9-10 seconds delay before icon chooser becomes responsive when changing categories to "All Icons" or clearing text filter on "All Icons".
Symlink and Symbolic fix (https://gitlab.xfce.org/arash-rohani/exo/-/commit/90f376b254ab0510e8745a710ca3aeb7aebf0248):
+ 6-7 seconds delay for icon chooser window to show up.
+ 9-10 seconds delay before icon chooser becomes responsive when changing categories to "All Icons" or clearing text filter on "All Icons".
These problems basically make the icon chooser either unusable (when needing to set symlink or symbolic icons) or extremely tedious to use for large SVG icon themes like Papirus.https://gitlab.xfce.org/xfce/exo/-/issues/108exo-open can't handle certain UTF strings2023-11-06T00:06:52ZAdam Spiersexo-open can't handle certain UTF stringsI'm seeing a really weird bug with exo-open 4.18.0. I have [a custom handler](https://github.com/aspiers/desktop-config/blob/master/.local/share/applications/xclip-handler.desktop) defining the `xclip://...` protocol:
```
[Desktop Entr...I'm seeing a really weird bug with exo-open 4.18.0. I have [a custom handler](https://github.com/aspiers/desktop-config/blob/master/.local/share/applications/xclip-handler.desktop) defining the `xclip://...` protocol:
```
[Desktop Entry]
Name=Copy to clipboard
Exec=xclip-handler %u
Icon=xfce4-clipman-plugin
Type=Application
Terminal=false
MimeType=x-scheme-handler/xclip;
```
and [the corresponding `xclip-handler` Python script](https://github.com/aspiers/desktop-config/blob/master/bin/xclip-handler) which invokes `xclip` with the data from the URL, so that `exo-open xclip://foobar` will result in `foobar` being placed in the clipboard.
For the most part this works great, and it also works for encoded URLs such as `xclip://foo%20bar`.
However, when the URL contains non-ASCII UTF characters, either encoded or raw, things get weird and sometimes fail with the error `Unable to detect the URI-scheme of "xclip://..."`:
$ exo-open 'xclip://it’s' # U+2019 with no encoding; works
$ exo-open 'xclip://it’s ' # U+2019 with no encoding and space; broken
$ exo-open 'xclip://it’s+fine' # U+2019 with space encoded as plus; works
$ exo-open 'xclip://it’s%20fine' # U+2019 with space encoded as %20; broken
Finally, the length of the URL can also somehow play a factor! This URL of 64 bytes works:
$ exo-open 'xclip://xxxxxxxxxxxxx’xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
but anything longer including this non-ASCII character breaks, again with the `Unable to detect ...` error:
$ exo-open 'xclip://xxxxxxxxxxxxx’xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
and removing the non-ASCII character allows longer URLs to work fine:
$ exo-open 'xclip://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
In contrast, `gio open` handles all of these flawlessly.https://gitlab.xfce.org/xfce/exo/-/issues/107Apps coming from different packages will have conflicting .desktop files2023-08-03T17:23:16ZTioApps coming from different packages will have conflicting .desktop filesI do not know if there is a fix for this but imagine you install the app X from the repos. You rename it. A .desktop file is being created in .local/share/applications. You now install the same X app as flatpak. The desktop file will hav...I do not know if there is a fix for this but imagine you install the app X from the repos. You rename it. A .desktop file is being created in .local/share/applications. You now install the same X app as flatpak. The desktop file will have the same name. So when you search for the flatpak app in Whisker or AppFinder you'll only find the repo one because the .local/share/applications has priority.
Even worse you uninstall the repo app and now you have a dead X app in your menus because it reads from .local/share/applications and there it can only see the .desktop file for the X app installed from the repos. Thus you cannot find your flatpak app anywhere.
I know this is an edge case, kinda, but nowadays it happens that many times people use different packaging repos and it will conflict with each other.
Even if you do not rename the X app, if you install the same app as flatpak and from repos, you'll only have 1 entry in the menus depending what you installed first probably.
Is there a way to label the flatpak apps with a (flatpak) in the desktop file?https://gitlab.xfce.org/xfce/exo/-/issues/105exo-die: Wrong source memory management2023-07-13T12:09:43ZGaël Bonithonexo-die: Wrong source memory managementI sometimes (rarely) get this critical warning when closing the modification dialog of a panel launcher:
```
exo-desktop-ite[24933]: Source ID 485 was not found when attempting to remove it
```
Backtrace:
```
Program terminated with sig...I sometimes (rarely) get this critical warning when closing the modification dialog of a panel launcher:
```
exo-desktop-ite[24933]: Source ID 485 was not found when attempting to remove it
```
Backtrace:
```
Program terminated with signal SIGTRAP, Trace/breakpoint trap.
#0 g_logv (log_domain=0x7f8e18d0e0be "GLib", log_level=G_LOG_LEVEL_CRITICAL, format=<optimized out>, args=<optimized out>) at ../glib/glib/gmessages.c:1422
1422 g_private_set (&g_log_depth, GUINT_TO_POINTER (depth));
[Current thread is 1 (Thread 0x7f8e17492f80 (LWP 24933))]
(gdb) bt
#0 g_logv (log_domain=0x7f8e18d0e0be "GLib", log_level=G_LOG_LEVEL_CRITICAL, format=<optimized out>, args=<optimized out>) at ../glib/glib/gmessages.c:1422
#1 0x00007f8e18cb53e4 in g_log (log_domain=<optimized out>, log_level=<optimized out>, format=<optimized out>) at ../glib/glib/gmessages.c:1460
#2 0x00007f8e18cacae5 in g_source_remove (tag=485) at ../glib/glib/gmain.c:2622
#3 0x000055c3f351a055 in exo_die_desktop_model_finalize (object=0x55c3f460ad70) at exo-die-desktop-model.c:169
#4 0x00007f8e18dbf8b4 in g_object_unref (_object=0x55c3f460ad70) at ../glib/gobject/gobject.c:3938
#5 g_object_unref (_object=0x55c3f460ad70) at ../glib/gobject/gobject.c:3802
#6 0x00007f8e1950cf2d in gtk_tree_model_filter_set_model (child_model=0x0, filter=0x55c3f460b3e0) at ../gtk/gtk/gtktreemodelfilter.c:3655
#7 gtk_tree_model_filter_set_model (filter=0x55c3f460b3e0, child_model=0x0) at ../gtk/gtk/gtktreemodelfilter.c:3631
#8 0x00007f8e19504049 in gtk_tree_model_filter_finalize (object=0x55c3f460b3e0) at ../gtk/gtk/gtktreemodelfilter.c:587
#9 0x00007f8e18dbf8b4 in g_object_unref (_object=0x55c3f460b3e0) at ../glib/gobject/gobject.c:3938
#10 g_object_unref (_object=0x55c3f460b3e0) at ../glib/gobject/gobject.c:3802
#11 0x00007f8e1952ace8 in gtk_tree_view_set_model (model=0x0, tree_view=0x55c3f46d3720) at ../gtk/gtk/gtktreeview.c:11532
#12 gtk_tree_view_set_model (tree_view=0x55c3f46d3720, model=0x0) at ../gtk/gtk/gtktreeview.c:11473
#13 0x00007f8e1951f069 in gtk_tree_view_destroy (widget=0x55c3f46d3720) at ../gtk/gtk/gtktreeview.c:2303
#14 0x00007f8e18db1626 in g_closure_invoke (closure=0x55c3f465e5d0, return_value=0x0, n_param_values=1, param_values=0x7ffc71af3060, invocation_hint=0x7ffc71af2fe0) at ../glib/gobject/gclosure.c:832
#15 0x00007f8e18ddfe05 in signal_emit_unlocked_R.isra.0
(node=node@entry=0x55c3f465e500, detail=detail@entry=0, instance=instance@entry=0x55c3f46d3720, emission_return=emission_return@entry=0x0, instance_and_params=instance_and_params@entry=0x7ffc71af3060)
at ../glib/gobject/gsignal.c:3930
#16 0x00007f8e18dd0aa7 in g_signal_emit_valist (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>, var_args=var_args@entry=0x7ffc71af3200) at ../glib/gobject/gsignal.c:3565
#17 0x00007f8e18dd0d34 in g_signal_emit (instance=instance@entry=0x55c3f46d3720, signal_id=<optimized out>, detail=detail@entry=0) at ../glib/gobject/gsignal.c:3622
#18 0x00007f8e1954ed4e in gtk_widget_dispose (object=0x55c3f46d3720) at ../gtk/gtk/gtkwidget.c:12166
#19 0x00007f8e18dbf900 in g_object_run_dispose (object=0x55c3f46d3720) at ../glib/gobject/gobject.c:1448
#20 g_object_run_dispose (object=0x55c3f46d3720) at ../glib/gobject/gobject.c:1441
#21 0x00007f8e193660f0 in gtk_entry_completion_dispose (object=0x55c3f46d1b50) at ../gtk/gtk/gtkentrycompletion.c:792
#22 0x00007f8e18dbf7e3 in g_object_unref (_object=0x55c3f46d1b50) at ../glib/gobject/gobject.c:3891
#23 g_object_unref (_object=0x55c3f46d1b50) at ../glib/gobject/gobject.c:3802
#24 0x00007f8e19365e2f in gtk_entry_set_completion (completion=0x0, entry=0x55c3f47d96b0) at ../gtk/gtk/gtkentry.c:10414
#25 gtk_entry_set_completion (entry=0x55c3f47d96b0, completion=0x0) at ../gtk/gtk/gtkentry.c:10398
#26 0x00007f8e19352573 in gtk_entry_dispose (object=0x55c3f47d96b0) at ../gtk/gtk/gtkentry.c:2992
#27 0x00007f8e18dbf900 in g_object_run_dispose (object=0x55c3f47d96b0) at ../glib/gobject/gobject.c:1448
#28 g_object_run_dispose (object=0x55c3f47d96b0) at ../glib/gobject/gobject.c:1441
#29 0x00007f8e193a6d90 in gtk_grid_forall () at ../gtk/gtk/gtkgrid.c:524
#30 0x00007f8e1930741e in gtk_container_destroy (widget=0x55c3f4716b10) at ../gtk/gtk/gtkcontainer.c:1702
#31 0x00007f8e18db1626 in g_closure_invoke (closure=0x55c3f465e5d0, return_value=0x0, n_param_values=1, param_values=0x7ffc71af35a0, invocation_hint=0x7ffc71af3520) at ../glib/gobject/gclosure.c:832
#32 0x00007f8e18ddfe05 in signal_emit_unlocked_R.isra.0
(node=node@entry=0x55c3f465e500, detail=detail@entry=0, instance=instance@entry=0x55c3f4716b10, emission_return=emission_return@entry=0x0, instance_and_params=instance_and_params@entry=0x7ffc71af35a0)
at ../glib/gobject/gsignal.c:3930
#33 0x00007f8e18dd0aa7 in g_signal_emit_valist (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>, var_args=var_args@entry=0x7ffc71af3740) at ../glib/gobject/gsignal.c:3565
#34 0x00007f8e18dd0d34 in g_signal_emit (instance=instance@entry=0x55c3f4716b10, signal_id=<optimized out>, detail=detail@entry=0) at ../glib/gobject/gsignal.c:3622
#35 0x00007f8e1954ed4e in gtk_widget_dispose (object=0x55c3f4716b10) at ../gtk/gtk/gtkwidget.c:12166
#36 0x00007f8e18dbf900 in g_object_run_dispose (object=0x55c3f4716b10) at ../glib/gobject/gobject.c:1448
#37 g_object_run_dispose (object=0x55c3f4716b10) at ../glib/gobject/gobject.c:1441
#38 0x00007f8e192b65b0 in gtk_box_forall (container=<optimized out>, include_internals=<optimized out>, callback=0x7f8e1953f5e0 <gtk_widget_destroy>, callback_data=0x0) at ../gtk/gtk/gtkbox.c:2678
#39 0x00007f8e1930741e in gtk_container_destroy (widget=0x55c3f4710b40) at ../gtk/gtk/gtkcontainer.c:1702
#40 0x00007f8e18db1626 in g_closure_invoke (closure=0x55c3f465e5d0, return_value=0x0, n_param_values=1, param_values=0x7ffc71af3a30, invocation_hint=0x7ffc71af39b0) at ../glib/gobject/gclosure.c:832
#41 0x00007f8e18ddfe05 in signal_emit_unlocked_R.isra.0
(node=node@entry=0x55c3f465e500, detail=detail@entry=0, instance=instance@entry=0x55c3f4710b40, emission_return=emission_return@entry=0x0, instance_and_params=instance_and_params@entry=0x7ffc71af3a30)
at ../glib/gobject/gsignal.c:3930
#42 0x00007f8e18dd0aa7 in g_signal_emit_valist (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>, var_args=var_args@entry=0x7ffc71af3bd0) at ../glib/gobject/gsignal.c:3565
#43 0x00007f8e18dd0d34 in g_signal_emit (instance=instance@entry=0x55c3f4710b40, signal_id=<optimized out>, detail=detail@entry=0) at ../glib/gobject/gsignal.c:3622
#44 0x00007f8e1954ed4e in gtk_widget_dispose (object=0x55c3f4710b40) at ../gtk/gtk/gtkwidget.c:12166
#45 0x00007f8e18dbf900 in g_object_run_dispose (object=0x55c3f4710b40) at ../glib/gobject/gobject.c:1448
#46 g_object_run_dispose (object=0x55c3f4710b40) at ../glib/gobject/gobject.c:1441
#47 0x00007f8e192b65b0 in gtk_box_forall (container=<optimized out>, include_internals=<optimized out>, callback=0x7f8e1953f5e0 <gtk_widget_destroy>, callback_data=0x0) at ../gtk/gtk/gtkbox.c:2678
#48 0x00007f8e1930741e in gtk_container_destroy (widget=0x55c3f4713e00) at ../gtk/gtk/gtkcontainer.c:1702
#49 0x00007f8e18db1626 in g_closure_invoke (closure=0x55c3f465e5d0, return_value=0x0, n_param_values=1, param_values=0x7ffc71af3ec0, invocation_hint=0x7ffc71af3e40) at ../glib/gobject/gclosure.c:832
#50 0x00007f8e18ddfe05 in signal_emit_unlocked_R.isra.0
(node=node@entry=0x55c3f465e500, detail=detail@entry=0, instance=instance@entry=0x55c3f4713e00, emission_return=emission_return@entry=0x0, instance_and_params=instance_and_params@entry=0x7ffc71af3ec0)
at ../glib/gobject/gsignal.c:3930
#51 0x00007f8e18dd0aa7 in g_signal_emit_valist (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>, var_args=var_args@entry=0x7ffc71af4060) at ../glib/gobject/gsignal.c:3565
#52 0x00007f8e18dd0d34 in g_signal_emit (instance=instance@entry=0x55c3f4713e00, signal_id=<optimized out>, detail=detail@entry=0) at ../glib/gobject/gsignal.c:3622
#53 0x00007f8e1954ed4e in gtk_widget_dispose (object=0x55c3f4713e00) at ../gtk/gtk/gtkwidget.c:12166
#54 0x00007f8e18dbf900 in g_object_run_dispose (object=0x55c3f4713e00) at ../glib/gobject/gobject.c:1448
#55 g_object_run_dispose (object=0x55c3f4713e00) at ../glib/gobject/gobject.c:1441
#56 0x00007f8e1955f1aa in gtk_window_forall (container=0x55c3f47b0130, include_internals=0, callback=0x7f8e1953f5e0 <gtk_widget_destroy>, callback_data=0x0) at ../gtk/gtk/gtkwindow.c:8632
#57 0x00007f8e1930741e in gtk_container_destroy (widget=0x55c3f47b0130) at ../gtk/gtk/gtkcontainer.c:1702
#58 0x00007f8e18db16c0 in g_closure_invoke (closure=0x55c3f465e5d0, return_value=0x0, n_param_values=1, param_values=0x7ffc71af4360, invocation_hint=0x7ffc71af42e0) at ../glib/gobject/gclosure.c:832
#59 0x00007f8e18ddfe05 in signal_emit_unlocked_R.isra.0
(node=node@entry=0x55c3f465e500, detail=detail@entry=0, instance=instance@entry=0x55c3f47b0130, emission_return=emission_return@entry=0x0, instance_and_params=instance_and_params@entry=0x7ffc71af4360)
at ../glib/gobject/gsignal.c:3930
#60 0x00007f8e18dd0aa7 in g_signal_emit_valist (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>, var_args=var_args@entry=0x7ffc71af4500) at ../glib/gobject/gsignal.c:3565
#61 0x00007f8e18dd0d34 in g_signal_emit (instance=instance@entry=0x55c3f47b0130, signal_id=<optimized out>, detail=detail@entry=0) at ../glib/gobject/gsignal.c:3622
#62 0x00007f8e1954ed4e in gtk_widget_dispose (object=0x55c3f47b0130) at ../gtk/gtk/gtkwidget.c:12166
#63 0x00007f8e1955a841 in gtk_window_dispose (object=0x55c3f47b0130) at ../gtk/gtk/gtkwindow.c:3191
#64 0x00007f8e18dbf900 in g_object_run_dispose (object=0x55c3f47b0130) at ../glib/gobject/gobject.c:1448
#65 g_object_run_dispose (object=0x55c3f47b0130) at ../glib/gobject/gobject.c:1441
#66 0x00007f8e1953f62a in gtk_widget_destroy (widget=<optimized out>) at ../gtk/gtk/gtkwidget.c:4780
#67 0x000055c3f35175ea in main (argc=<optimized out>, argv=<optimized out>) at main.c:671
```
I think I've tried looking at it in the past without finding the problem. The source id is correctly reset in the GDestroyNotify, but there must be a race condition that makes it possible to pass in finalize() before...https://gitlab.xfce.org/xfce/exo/-/issues/100Window crash with Help button2023-04-01T09:28:59ZIoannisLMWindow crash with Help buttonWindow crash with Help button on Create _URL Link... or Create _Launcher...
desktop 4.18.1-1Window crash with Help button on Create _URL Link... or Create _Launcher...
desktop 4.18.1-1https://gitlab.xfce.org/xfce/exo/-/issues/99exo-open doesn't respect default terminal without --launch flag2023-05-02T13:21:46ZSébastien Hoffmannexo-open doesn't respect default terminal without --launch flagMy default terminal is configured in `~/.config/xfce4/helpers.rc`:
```
TerminalEmulator=custom-TerminalEmulator
```
and `~/.local/share/xfce4/helpers/custom-TerminalEmulator.desktop`:
```
X-XFCE-CommandsWithParameter=alacritty --command ...My default terminal is configured in `~/.config/xfce4/helpers.rc`:
```
TerminalEmulator=custom-TerminalEmulator
```
and `~/.local/share/xfce4/helpers/custom-TerminalEmulator.desktop`:
```
X-XFCE-CommandsWithParameter=alacritty --command %s
```
Furthermore, text files are associated with the `nvim` editor:
```
$ xdg-mime query default text/plain
nvim.desktop
```
which is a terminal application, i.e. `/run/current-system/sw/share/applications/nvim.desktop`:
```
Terminal=true
```
In the following cases, `nvim` is correctly opened within `alacritty`:
- launching `nvim.desktop` from the applications menu in `xfce4-panel`
- launching `nvim.desktop` via `xfce4-appfinder`
- executing `exo-open --launch TerminalEmulator nvim`
But in the following cases, `nvim` is incorrectly opened within `xfce4-terminal`:
- executing `exo-open /run/current-system/sw/share/applications/nvim.desktop`
- double-clicking a `myfile.txt` file in `thunar`
- executing `exo-open myfile.txt`
I tried this with `exo-open` 4.18.0https://gitlab.xfce.org/xfce/exo/-/issues/91[Feature Request] Icon search tool2023-07-13T12:11:03Zhaarp[Feature Request] Icon search toolHi there,
Xfce has a really nice icon picker, which can be accessed e.g. through right-click on the application menu, properties, icon.
I'm often looking for an icon for various reasons and this picker is very useful for this task. How...Hi there,
Xfce has a really nice icon picker, which can be accessed e.g. through right-click on the application menu, properties, icon.
I'm often looking for an icon for various reasons and this picker is very useful for this task. However, going through the settings dialog of a panel plugin is weird. Would it be possible to make a standalone icon search app that uses the icon picker?
Thanks!https://gitlab.xfce.org/xfce/exo/-/issues/88Toolbar für choose icon categories2022-11-04T10:10:57ZHappyPonyToolbar für choose icon categories
I suggest that in addition to the dropdown list, access to the different icon categories (action icons, emoticons, status icons, ...) is enabled for more comfortable access through a toolbar - see dummy screenshot:
![Symbol-auswaehlen...
I suggest that in addition to the dropdown list, access to the different icon categories (action icons, emoticons, status icons, ...) is enabled for more comfortable access through a toolbar - see dummy screenshot:
![Symbol-auswaehlen-choose-app-finder-1](/uploads/3b1baa27725784ae90476d1c6ac64241/Symbol-auswaehlen-choose-app-finder-1.png)https://gitlab.xfce.org/xfce/exo/-/issues/70The compact view is not fully updated after deleting a file whose name has ch...2023-05-25T18:33:44ZGaël BonithonThe compact view is not fully updated after deleting a file whose name has changed the layoutUsing latest git master and 4.16.8.
This can happen with file names that are long enough, or simply contain a line break.
For example, starting from an empty directory, execute
```sh
touch f f$'\n'g g
rm f$'\n'g
```
There is a vertica...Using latest git master and 4.16.8.
This can happen with file names that are long enough, or simply contain a line break.
For example, starting from an empty directory, execute
```sh
touch f f$'\n'g g
rm f$'\n'g
```
There is a vertical gap between `f` and `g`, which only disappears by pressing F5.https://gitlab.xfce.org/xfce/exo/-/issues/67Warnings: cast increases required alignment2022-10-05T13:24:15ZAvinash SonawaneWarnings: cast increases required alignmentHello!
On latest master `clang` throws these warnings:
```
exo-binding.c:206:13: warning: cast from 'gchar *' (aka 'char *') to 'ExoBinding *' (aka 'struct _ExoBinding *') increases required alignment from 1 to 8 [-Wcast-align]
bindin...Hello!
On latest master `clang` throws these warnings:
```
exo-binding.c:206:13: warning: cast from 'gchar *' (aka 'char *') to 'ExoBinding *' (aka 'struct _ExoBinding *') increases required alignment from 1 to 8 [-Wcast-align]
binding = (ExoBinding *) (((gchar *) blink) - G_STRUCT_OFFSET (ExoBinding, blink));
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
exo-binding.c:228:13: warning: cast from 'gchar *' (aka 'char *') to 'ExoMutualBinding *' (aka 'struct _ExoMutualBinding *') increases required alignment from 1 to 8 [-Wcast-align]
binding = (ExoMutualBinding *) (((gchar *) blink) - G_STRUCT_OFFSET (ExoMutualBinding, direct));
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
exo-binding.c:253:13: warning: cast from 'gchar *' (aka 'char *') to 'ExoMutualBinding *' (aka 'struct _ExoMutualBinding *') increases required alignment from 1 to 8 [-Wcast-align]
binding = (ExoMutualBinding *) (((gchar *) blink) - G_STRUCT_OFFSET (ExoMutualBinding, reverse));
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3 warnings generated.
exo-gdk-pixbuf-extensions.c:131:23: warning: cast from 'guchar *' (aka 'unsigned char *') to '__m64 *' increases required alignment from 1 to 8 [-Wcast-align]
__m64 *pixdst = (__m64 *) gdk_pixbuf_get_pixels (dst);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
exo-gdk-pixbuf-extensions.c:132:23: warning: cast from 'guchar *' (aka 'unsigned char *') to '__m64 *' increases required alignment from 1 to 8 [-Wcast-align]
__m64 *pixsrc = (__m64 *) gdk_pixbuf_get_pixels (source);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
exo-gdk-pixbuf-extensions.c:480:23: warning: cast from 'guchar *' (aka 'unsigned char *') to '__m64 *' increases required alignment from 1 to 8 [-Wcast-align]
__m64 *pixdst = (__m64 *) gdk_pixbuf_get_pixels (dst);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
exo-gdk-pixbuf-extensions.c:481:23: warning: cast from 'guchar *' (aka 'unsigned char *') to '__m64 *' increases required alignment from 1 to 8 [-Wcast-align]
__m64 *pixsrc = (__m64 *) gdk_pixbuf_get_pixels (source);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 warnings generated.
exo-icon-view.c:3543:19: warning: cast from 'gchar *' (aka 'char *') to 'cairo_rectangle_int_t *' (aka 'struct _cairo_rectangle_int *') increases required alignment from 1 to 4 [-Wcast-align]
item->box = (GdkRectangle *) buffer;
^~~~~~~~~~~~~~~~~~~~~~~
exo-icon-view.c:3544:21: warning: cast from 'gchar *' (aka 'char *') to 'gint *' (aka 'int *') increases required alignment from 1 to 4 [-Wcast-align]
item->after = (gint *) (buffer + item->n_cells * sizeof (GdkRectangle));
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2 warnings generated.
```https://gitlab.xfce.org/xfce/exo/-/issues/59Move exo_gtk_dialog_get_action_area() to libxfceui and remove exo_gtk_dialog_...2022-07-18T14:26:01ZYongha HwangMove exo_gtk_dialog_get_action_area() to libxfceui and remove exo_gtk_dialog_add_secondary_button()I just looked up if there is any other `G_GNUC_BEGIN_IGNORE_DEPRECATIONS` hidden, and there is one: `exo_gtk_dialog_get_action_area()` is a wrapper to turn off the deprecation warning.
```c
GtkWidget *
exo_gtk_dialog_get_action_area (Gt...I just looked up if there is any other `G_GNUC_BEGIN_IGNORE_DEPRECATIONS` hidden, and there is one: `exo_gtk_dialog_get_action_area()` is a wrapper to turn off the deprecation warning.
```c
GtkWidget *
exo_gtk_dialog_get_action_area (GtkDialog *dialog)
{
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
return gtk_dialog_get_action_area (dialog);
G_GNUC_END_IGNORE_DEPRECATIONS
}
```
`thunar_column_editor_init()` and `exo_gtk_dialog_add_secondary_button()` use this one, but the latter isn't used anywhere within Xfce project. So the only part that use this function is Thunar. However, `glade_xfce_titled_dialog_post_create()` in libxfce4ui has the same implementation of this [(kind of)](https://gitlab.xfce.org/xfce/libxfce4ui/-/blob/40743c4158f4f4d2357dd72326a915a969f20f94/glade/libxfce4ui-glade.c#L110) so it would be better to move this into libxfce4ui.https://gitlab.xfce.org/xfce/exo/-/issues/58Deprecate ExoJob2022-11-01T19:19:58ZYongha HwangDeprecate ExoJob`ExoJob` is a wrapper class for asynchronous jobs and Thunar depends heavily on it. But it has critical flaws that hinders Thunar from achieving true asynchronous operation.
**1. `ExoJob` depends on `GIOScheduler`, which is deprecated a...`ExoJob` is a wrapper class for asynchronous jobs and Thunar depends heavily on it. But it has critical flaws that hinders Thunar from achieving true asynchronous operation.
**1. `ExoJob` depends on `GIOScheduler`, which is deprecated as of year 2013**
`GIOScheduler` is deprecated as of GLib 2.36. `GTask` replaces this one and provides an easy way to build an asynchronous operation and this also can be used to create synchronous version of an asynchronous operation. Since `ExoJob` depends on `GIOScheduler`, it does not provide a wrapper for methods of `GTask`.
**2. Task priority of an `ExoJob` is always `G_PRIORITY_HIGH`**
Which means, every `ExoJob`s and its derivatives are always top priority. Its priority is too high that it supercedes everything including timeouts, signal calls, and lo and behold, user interactions. Simply starting few dozens of them would make applications stutter. Setting this priority to somewhat lower would help this problem, but changing priority may cause heisenbugs. It should provide a way to set priority anyways.
**3. Identity as "the class that handles asynchronous operations" and "an asynchronous operation itself" are mixed up**
`ExoJob` by itself represents an asynchronous operation, but its subclasses in Thunar are enormous classes that manage asynchronous operations. This does not get along with the Glib/GTK way, which is chaining asynchronous operations to build new one. So it should be divided to two parts. The former could be replaced with `GTask` or its sub-class (let me call it `ExoTask`) and the latter could use `ThunarJob` for its pointer.
---
To summarize: `ExoJob` might have been a good wrapper for `GIOScheduler`, but it is quite outdated for its job and could be replaced with `GTask`.https://gitlab.xfce.org/xfce/exo/-/issues/5exo-desktop-item-edit can't select symlinked icons2023-10-02T19:38:32ZBugzilla Migrationexo-desktop-item-edit can't select symlinked icons## Submitted by HJ
Assigned to **Nick Schermer**
**[Link to original bug (#10126)](https://bugzilla.xfce.org/show_bug.cgi?id=10126)**
## Description
Created attachment 5047
can't find the edittrash icon
The desktop file editor do...## Submitted by HJ
Assigned to **Nick Schermer**
**[Link to original bug (#10126)](https://bugzilla.xfce.org/show_bug.cgi?id=10126)**
## Description
Created attachment 5047
can't find the edittrash icon
The desktop file editor does not display any symlinks
**Attachment 5047**, "can't find the edittrash icon":
![2013-05-30-020410_1366x768_scrot](/uploads/b592d5754940fd0656c60f57469ef054/2013-05-30-020410_1366x768_scrot.png)
Version: 0.10.1