unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Re: master fe7c015b20: Support XFCE in wallpaper.el
       [not found] ` <20220916204419.B124FC00872@vcs2.savannah.gnu.org>
@ 2022-09-17  2:00   ` Po Lu
  2022-09-17 18:03     ` Stefan Kangas
  0 siblings, 1 reply; 61+ messages in thread
From: Po Lu @ 2022-09-17  2:00 UTC (permalink / raw)
  To: emacs-devel; +Cc: Stefan Kangas

Stefan Kangas <stefankangas@gmail.com> writes:

> +    ("xfconf-query" "-c" "xfce4-desktop" "-p"
> +     "/backdrop/screen0/monitoreDP/workspace0/last-image" "-s" "%f")

Judging by the command, this assumes that:

 - the screen number is 0
 - the monitor on which the backdrop will be changed is named "eDP"
 - the workspace is 0

These assumptions do not hold true on machines where XFCE is running on
a different screen, on a monitor named something other than "eDP", or
when the user has enabled more than 1 workspace.



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-17  2:00   ` master fe7c015b20: Support XFCE in wallpaper.el Po Lu
@ 2022-09-17 18:03     ` Stefan Kangas
  2022-09-18  1:18       ` Po Lu
  0 siblings, 1 reply; 61+ messages in thread
From: Stefan Kangas @ 2022-09-17 18:03 UTC (permalink / raw)
  To: Po Lu, emacs-devel; +Cc: Thierry Volpiatto

Po Lu <luangruo@yahoo.com> writes:

> Stefan Kangas <stefankangas@gmail.com> writes:
>
>> +    ("xfconf-query" "-c" "xfce4-desktop" "-p"
>> +     "/backdrop/screen0/monitoreDP/workspace0/last-image" "-s" "%f")
>
> Judging by the command, this assumes that:
>
>  - the screen number is 0
>  - the monitor on which the backdrop will be changed is named "eDP"
>  - the workspace is 0

Is "eDP" the most common and/or default name?

Not sure what to do about the screen number or workspaces.  Is there any
way to find out this information with a simple command?

> These assumptions do not hold true on machines where XFCE is running on
> a different screen, on a monitor named something other than "eDP", or
> when the user has enabled more than 1 workspace.

Suggestions for how to improve on this are welcome.

From searching online, the way to find out the above information on XFCE
seems to be a hassle:

https://unix.stackexchange.com/questions/596070/how-to-change-wallpaper-on-xfce-from-terminal

I have no idea why they need make such a basic operation that hard.



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-17 18:03     ` Stefan Kangas
@ 2022-09-18  1:18       ` Po Lu
  2022-09-18  2:13         ` Po Lu
                           ` (2 more replies)
  0 siblings, 3 replies; 61+ messages in thread
From: Po Lu @ 2022-09-18  1:18 UTC (permalink / raw)
  To: Stefan Kangas; +Cc: emacs-devel, Thierry Volpiatto

Stefan Kangas <stefankangas@gmail.com> writes:

> Po Lu <luangruo@yahoo.com> writes:
>
>> Stefan Kangas <stefankangas@gmail.com> writes:
>>
>>> +    ("xfconf-query" "-c" "xfce4-desktop" "-p"
>>> +     "/backdrop/screen0/monitoreDP/workspace0/last-image" "-s" "%f")
>>
>> Judging by the command, this assumes that:
>>
>>  - the screen number is 0
>>  - the monitor on which the backdrop will be changed is named "eDP"
>>  - the workspace is 0

> Is "eDP" the most common and/or default name?

No, it's the name used for the embedded DisplayPort internal panel on
laptops.  Some laptops use LVDS instead, and the name is thus "LVDS".

> Not sure what to do about the screen number or workspaces.  Is there any
> way to find out this information with a simple command?

The screen number should be the following part of the `display' frame
parameter:

  1.1.1.1:0.5
            ^ screen number is 5

if there is no period after the separator, then the screen number is 0.

The currently active workspace can be obtained like so:

  (x-window-property "_NET_CURRENT_DESKTOP" nil "CARDINAL" 0 nil t)

if it fails by returning NULL, then you should fall back to:

  (x-window-property "WIN_WORKSPACE" nil "CARDINAL" 0 nil t)

and failing that, 0.

The monitor name should also be easy to extract with
display-monitor-attributes-list, but if the source is anything other
than "XRandr", "XRandr 1.5" or "Gdk", you should fall back to using "0".



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-18  1:18       ` Po Lu
@ 2022-09-18  2:13         ` Po Lu
  2022-09-18  4:48         ` Thierry Volpiatto
  2022-09-26 19:42         ` Stefan Kangas
  2 siblings, 0 replies; 61+ messages in thread
From: Po Lu @ 2022-09-18  2:13 UTC (permalink / raw)
  To: Stefan Kangas; +Cc: emacs-devel, Thierry Volpiatto

Po Lu <luangruo@yahoo.com> writes:

> if it fails by returning NULL, then you should fall back to:
                           ^^^^

nil, of course, sorry.



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-18  1:18       ` Po Lu
  2022-09-18  2:13         ` Po Lu
@ 2022-09-18  4:48         ` Thierry Volpiatto
  2022-09-18  5:15           ` Po Lu
  2022-09-26 19:42         ` Stefan Kangas
  2 siblings, 1 reply; 61+ messages in thread
From: Thierry Volpiatto @ 2022-09-18  4:48 UTC (permalink / raw)
  To: Po Lu; +Cc: Stefan Kangas, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 439 bytes --]


Po Lu <luangruo@yahoo.com> writes:

> The currently active workspace can be obtained like so:
>
>   (x-window-property "_NET_CURRENT_DESKTOP" nil "CARDINAL" 0 nil t)
>
> if it fails by returning NULL, then you should fall back to:
>
>   (x-window-property "WIN_WORKSPACE" nil "CARDINAL" 0 nil t)
>
> and failing that, 0.

Here the command fails if you specify the workspace, it works only with
"worspace0".

-- 
Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 686 bytes --]

^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-18  4:48         ` Thierry Volpiatto
@ 2022-09-18  5:15           ` Po Lu
  2022-09-18 14:44             ` Thierry Volpiatto
  0 siblings, 1 reply; 61+ messages in thread
From: Po Lu @ 2022-09-18  5:15 UTC (permalink / raw)
  To: Thierry Volpiatto; +Cc: Stefan Kangas, emacs-devel

Thierry Volpiatto <thievol@posteo.net> writes:

> Here the command fails if you specify the workspace, it works only with
> "worspace0".

But that's because you only have workspace 1 displayed, right?



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-18  5:15           ` Po Lu
@ 2022-09-18 14:44             ` Thierry Volpiatto
  2022-09-19  4:49               ` Po Lu
  0 siblings, 1 reply; 61+ messages in thread
From: Thierry Volpiatto @ 2022-09-18 14:44 UTC (permalink / raw)
  To: Po Lu; +Cc: Stefan Kangas, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 1213 bytes --]


Po Lu <luangruo@yahoo.com> writes:

> Thierry Volpiatto <thievol@posteo.net> writes:
>
>> Here the command fails if you specify the workspace, it works only with
>> "worspace0".
>
> But that's because you only have workspace 1 displayed, right?

No, if emacs is on workspace0 and I use:
"/backdrop/screen0/monitoreDP/workspace0/last-image"
wallpaper is modified as expected. 

Then if emacs is on workspace2 and I use:
"/backdrop/screen0/monitoreDP/workspace2/last-image"
Command exit with 0 status but wallpaper is not modified, but if I use:
"/backdrop/screen0/monitoreDP/workspace0/last-image" again (always from
workspace2), wallpaper is modified as expected.

I can verify this with this command which monitor the desktop change:

    xfconf-query -c xfce4-desktop -m

    => Commencer à surveiller le canal « xfce4-desktop » :

then I go to workspace4, modify wallpaper with mouse and the usual xfce
interface for this, go back in workspace1 an look at output:
I have now:

    Commencer à surveiller le canal « xfce4-desktop » :

    définir: /backdrop/screen0/monitoreDP/workspace0/last-image

unfortunately this command is interactive :-(

-- 
Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 686 bytes --]

^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-18 14:44             ` Thierry Volpiatto
@ 2022-09-19  4:49               ` Po Lu
  2022-09-19  6:06                 ` Thierry Volpiatto
  2022-09-19  7:23                 ` Thierry Volpiatto
  0 siblings, 2 replies; 61+ messages in thread
From: Po Lu @ 2022-09-19  4:49 UTC (permalink / raw)
  To: Thierry Volpiatto; +Cc: Stefan Kangas, emacs-devel

Thierry Volpiatto <thievol@posteo.net> writes:

> Po Lu <luangruo@yahoo.com> writes:
>
>> Thierry Volpiatto <thievol@posteo.net> writes:
>>
>>> Here the command fails if you specify the workspace, it works only with
>>> "worspace0".
>>
>> But that's because you only have workspace 1 displayed, right?
>
> No, if emacs is on workspace0 and I use:
> "/backdrop/screen0/monitoreDP/workspace0/last-image"
> wallpaper is modified as expected. 
>
> Then if emacs is on workspace2 and I use:
> "/backdrop/screen0/monitoreDP/workspace2/last-image"
> Command exit with 0 status but wallpaper is not modified, but if I use:
> "/backdrop/screen0/monitoreDP/workspace0/last-image" again (always from
> workspace2), wallpaper is modified as expected.
>
> I can verify this with this command which monitor the desktop change:
>
>     xfconf-query -c xfce4-desktop -m
>
>     => Commencer à surveiller le canal « xfce4-desktop » :
>
> then I go to workspace4, modify wallpaper with mouse and the usual xfce
> interface for this, go back in workspace1 an look at output:
> I have now:
>
>     Commencer à surveiller le canal « xfce4-desktop » :
>
>     définir: /backdrop/screen0/monitoreDP/workspace0/last-image
>
> unfortunately this command is interactive :-(

But here is how Thunar, the XFCE file manager, sets the backdrop:

          image_path_prop = g_strdup_printf("/backdrop/screen%d/monitor%s/workspace%d/last-image", screen_nr, monitor_name, workspace);
          image_style_prop = g_strdup_printf("/backdrop/screen%d/monitor%s/workspace%d/image-style", screen_nr, monitor_name, workspace);
 
where `workspace' is:

  GdkWindow *root;
  gulong     bytes_after_ret = 0;
  gulong     nitems_ret = 0;
  guint     *prop_ret = NULL;
  Atom       _NET_CURRENT_DESKTOP;
  Atom       _WIN_WORKSPACE;
  Atom       type_ret = None;
  gint       format_ret;
  gint       ws_num = 0;

  gdk_x11_display_error_trap_push (gdk_display_get_default ());

  root = gdk_screen_get_root_window (screen);

  /* determine the X atom values */
  _NET_CURRENT_DESKTOP = XInternAtom (GDK_WINDOW_XDISPLAY (root), "_NET_CURRENT_DESKTOP", False);
  _WIN_WORKSPACE = XInternAtom (GDK_WINDOW_XDISPLAY (root), "_WIN_WORKSPACE", False);

  if (XGetWindowProperty (GDK_WINDOW_XDISPLAY (root),
                          gdk_x11_get_default_root_xwindow(),
                          _NET_CURRENT_DESKTOP, 0, 32, False, XA_CARDINAL,
                          &type_ret, &format_ret, &nitems_ret, &bytes_after_ret,
                          (gpointer) &prop_ret) != Success)
    {
      if (XGetWindowProperty (GDK_WINDOW_XDISPLAY (root),
                              gdk_x11_get_default_root_xwindow(),
                              _WIN_WORKSPACE, 0, 32, False, XA_CARDINAL,
                              &type_ret, &format_ret, &nitems_ret, &bytes_after_ret,
                              (gpointer) &prop_ret) != Success)
        {
          if (G_UNLIKELY (prop_ret != NULL))
            {
              XFree (prop_ret);
              prop_ret = NULL;
            }
        }
    }

  if (G_LIKELY (prop_ret != NULL))
    {
      if (G_LIKELY (type_ret != None && format_ret != 0))
        ws_num = *prop_ret;
      XFree (prop_ret);
    }

  gdk_x11_display_error_trap_pop_ignored (gdk_display_get_default ());

  return ws_num;



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-19  4:49               ` Po Lu
@ 2022-09-19  6:06                 ` Thierry Volpiatto
  2022-09-19  7:24                   ` Po Lu
  2022-09-19  7:23                 ` Thierry Volpiatto
  1 sibling, 1 reply; 61+ messages in thread
From: Thierry Volpiatto @ 2022-09-19  6:06 UTC (permalink / raw)
  To: Po Lu; +Cc: Stefan Kangas, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 4075 bytes --]


Po Lu <luangruo@yahoo.com> writes:

> Thierry Volpiatto <thievol@posteo.net> writes:
>
>> Po Lu <luangruo@yahoo.com> writes:
>>
>>> Thierry Volpiatto <thievol@posteo.net> writes:
>>>
>>>> Here the command fails if you specify the workspace, it works only with
>>>> "worspace0".
>>>
>>> But that's because you only have workspace 1 displayed, right?
>>
>> No, if emacs is on workspace0 and I use:
>> "/backdrop/screen0/monitoreDP/workspace0/last-image"
>> wallpaper is modified as expected. 
>>
>> Then if emacs is on workspace2 and I use:
>> "/backdrop/screen0/monitoreDP/workspace2/last-image"
>> Command exit with 0 status but wallpaper is not modified, but if I use:
>> "/backdrop/screen0/monitoreDP/workspace0/last-image" again (always from
>> workspace2), wallpaper is modified as expected.
>>
>> I can verify this with this command which monitor the desktop change:
>>
>>     xfconf-query -c xfce4-desktop -m
>>
>>     => Commencer à surveiller le canal « xfce4-desktop » :
>>
>> then I go to workspace4, modify wallpaper with mouse and the usual xfce
>> interface for this, go back in workspace1 an look at output:
>> I have now:
>>
>>     Commencer à surveiller le canal « xfce4-desktop » :
>>
>>     définir: /backdrop/screen0/monitoreDP/workspace0/last-image
>>
>> unfortunately this command is interactive :-(
>
> But here is how Thunar, the XFCE file manager, sets the backdrop:
>
>           image_path_prop = g_strdup_printf("/backdrop/screen%d/monitor%s/workspace%d/last-image", screen_nr, monitor_name, workspace);
>           image_style_prop = g_strdup_printf("/backdrop/screen%d/monitor%s/workspace%d/image-style", screen_nr, monitor_name, workspace);

Yes, sure it is working from thunar. But here from emacs with
it specified, the command output with 0 but the background is not
changed unless I hardcode workspace to 0. 

Here the function used with its Edebug
output:

(defun tv/change-xfce-background (file)
  (let* ((screen  (frame-parameter (selected-frame) 'display))
         (monitor (assoc-default 'name (car (display-monitor-attributes-list))))
         (desktop (x-window-property "_NET_CURRENT_DESKTOP" nil "CARDINAL" 0 nil t))
         (prop    (format "/backdrop/screen%s/monitor%s/workspace%s/last-image"
                          (substring screen (1- (length screen)))
                          monitor
                          desktop
                          )))
    (if (= (apply #'call-process "xfconf-query" nil nil nil
                  `("-c" "xfce4-desktop" "-p" ,prop "-s" ,file))
           0)
        (message "Background changed successfully to %s" (helm-basename file))
      (message "Failed to change background"))))

Edebug: tv/change-xfce-background
tv/change-xfce-background

Result: #<frame *scratch* - GNU Emacs at IPad-S340 0x55d297d580f8>

Result: ":0.0"

Result: (((name . "eDP") (geometry 0 0 1920 1080) (workarea 0 0 1920 1080) (mm-size 309 174) (frames #<frame *scratch* - GNU Emacs at IPad-S340 0x55d297d580f8>) (source . "XRandr")))

Result: ((name . "eDP") (geometry 0 0 1920 1080) (workarea 0 0 1920 1080) (mm-size 309 174) (frames #<frame *scratch* - GNU Emacs at IPad-S340 0x55d297d580f8>) (source . "XRandr"))

Result: "eDP"

Result: 2 (#o2, #x2, ?\C-b)

Result: ":0.0"

Result: ":0.0"

Result: 4 (#o4, #x4, ?\C-d)

Result: 3 (#o3, #x3, ?\C-c)

Result: "0"

Result: "eDP"

Result: 2 (#o2, #x2, ?\C-b)

Result: "/backdrop/screen0/monitoreDP/workspace2/last-image"

Result: call-process

Result: "/backdrop/screen0/monitoreDP/workspace2/last-image"

Result: "/home/thierry/backgrounds/Cyclosys.jpg"

Result: ("-c" "xfce4-desktop" "-p" "/backdrop/screen0/monitoreDP/workspace2/last-image" "-s" "/home/thierry/backgrounds/Cyclosys.jpg")

Result: 0 (#o0, #x0, ?\C-@)

Result: t

Result: "/home/thierry/backgrounds/Cyclosys.jpg"

Result: "Cyclosys.jpg"

Background changed successfully to Cyclosys.jpg
Result: "Background changed successfully to Cyclosys.jpg"


-- 
Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 686 bytes --]

^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-19  4:49               ` Po Lu
  2022-09-19  6:06                 ` Thierry Volpiatto
@ 2022-09-19  7:23                 ` Thierry Volpiatto
  1 sibling, 0 replies; 61+ messages in thread
From: Thierry Volpiatto @ 2022-09-19  7:23 UTC (permalink / raw)
  To: Po Lu; +Cc: Stefan Kangas, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 2369 bytes --]


Po Lu <luangruo@yahoo.com> writes:

> Thierry Volpiatto <thievol@posteo.net> writes:
>
>> Po Lu <luangruo@yahoo.com> writes:
>>
>>> Thierry Volpiatto <thievol@posteo.net> writes:
>>>
>>>> Here the command fails if you specify the workspace, it works only with
>>>> "worspace0".
>>>
>>> But that's because you only have workspace 1 displayed, right?
>>
>> No, if emacs is on workspace0 and I use:
>> "/backdrop/screen0/monitoreDP/workspace0/last-image"
>> wallpaper is modified as expected. 
>>
>> Then if emacs is on workspace2 and I use:
>> "/backdrop/screen0/monitoreDP/workspace2/last-image"
>> Command exit with 0 status but wallpaper is not modified, but if I use:
>> "/backdrop/screen0/monitoreDP/workspace0/last-image" again (always from
>> workspace2), wallpaper is modified as expected.
>>
>> I can verify this with this command which monitor the desktop change:
>>
>>     xfconf-query -c xfce4-desktop -m
>>
>>     => Commencer à surveiller le canal « xfce4-desktop » :
>>
>> then I go to workspace4, modify wallpaper with mouse and the usual xfce
>> interface for this, go back in workspace1 an look at output:
>> I have now:
>>
>>     Commencer à surveiller le canal « xfce4-desktop » :
>>
>>     définir: /backdrop/screen0/monitoreDP/workspace0/last-image
>>
>> unfortunately this command is interactive :-(
>
> But here is how Thunar, the XFCE file manager, sets the backdrop:
>
>           image_path_prop = g_strdup_printf("/backdrop/screen%d/monitor%s/workspace%d/last-image", screen_nr, monitor_name, workspace);
>           image_style_prop = g_strdup_printf("/backdrop/screen%d/monitor%s/workspace%d/image-style", screen_nr, monitor_name, workspace);
>  
> where `workspace' is:
>
>   GdkWindow *root;
>   gulong     bytes_after_ret = 0;
>   gulong     nitems_ret = 0;
>   guint     *prop_ret = NULL;
>   Atom       _NET_CURRENT_DESKTOP;
>   Atom       _WIN_WORKSPACE;
>   Atom       type_ret = None;
>   gint       format_ret;
>   gint       ws_num = 0;


My command starts working with workspace specified when I use an async
process (start-process) instead of call-process, so with wallpaper-set it should work as
expected.
However the functions to extract infos about screen, monitor and
workspace are working only when (display-graphic-p) is non nil.

-- 
Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 686 bytes --]

^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-19  6:06                 ` Thierry Volpiatto
@ 2022-09-19  7:24                   ` Po Lu
  2022-09-19  8:40                     ` Thierry Volpiatto
  0 siblings, 1 reply; 61+ messages in thread
From: Po Lu @ 2022-09-19  7:24 UTC (permalink / raw)
  To: Thierry Volpiatto; +Cc: Stefan Kangas, emacs-devel

Thierry Volpiatto <thievol@posteo.net> writes:

> Yes, sure it is working from thunar. But here from emacs with
> it specified, the command output with 0 but the background is not
> changed unless I hardcode workspace to 0. 

Could you show all of the XFCE settings under /backdrop?



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-19  7:24                   ` Po Lu
@ 2022-09-19  8:40                     ` Thierry Volpiatto
  2022-09-19  8:52                       ` Po Lu
  0 siblings, 1 reply; 61+ messages in thread
From: Thierry Volpiatto @ 2022-09-19  8:40 UTC (permalink / raw)
  To: Po Lu; +Cc: Stefan Kangas, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 498 bytes --]


Po Lu <luangruo@yahoo.com> writes:

> Thierry Volpiatto <thievol@posteo.net> writes:
>
>> Yes, sure it is working from thunar. But here from emacs with
>> it specified, the command output with 0 but the background is not
>> changed unless I hardcode workspace to 0. 
>
> Could you show all of the XFCE settings under /backdrop?

Don't know where I can get that (/backdrop is not a directory).
Do you mean ~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml ?

-- 
Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 686 bytes --]

^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-19  8:40                     ` Thierry Volpiatto
@ 2022-09-19  8:52                       ` Po Lu
  2022-09-19 17:46                         ` Thierry Volpiatto
  2022-09-19 18:05                         ` Thierry Volpiatto
  0 siblings, 2 replies; 61+ messages in thread
From: Po Lu @ 2022-09-19  8:52 UTC (permalink / raw)
  To: Thierry Volpiatto; +Cc: Stefan Kangas, emacs-devel

Thierry Volpiatto <thievol@posteo.net> writes:

> Don't know where I can get that (/backdrop is not a directory).

I meant with the `xfconf-query' program, sorry:

  xfconf-query --list --recursive --channel xfce4-desktop --property /backdrop



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-19  8:52                       ` Po Lu
@ 2022-09-19 17:46                         ` Thierry Volpiatto
  2022-09-19 18:05                         ` Thierry Volpiatto
  1 sibling, 0 replies; 61+ messages in thread
From: Thierry Volpiatto @ 2022-09-19 17:46 UTC (permalink / raw)
  To: Po Lu; +Cc: Stefan Kangas, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 2790 bytes --]


Po Lu <luangruo@yahoo.com> writes:

> Thierry Volpiatto <thievol@posteo.net> writes:
>
>> Don't know where I can get that (/backdrop is not a directory).
>
> I meant with the `xfconf-query' program, sorry:

Ok.

>   xfconf-query --list --recursive --channel xfce4-desktop --property /backdrop


/backdrop/screen0/monitor0/brightness
/backdrop/screen0/monitor0/image-path
/backdrop/screen0/monitor0/image-show
/backdrop/screen0/monitor0/image-style
/backdrop/screen0/monitor0/last-image
/backdrop/screen0/monitor0/last-single-image
/backdrop/screen0/monitor0/workspace0/color-style
/backdrop/screen0/monitor0/workspace0/image-style
/backdrop/screen0/monitor0/workspace0/last-image
/backdrop/screen0/monitor0/workspace1/color-style
/backdrop/screen0/monitor0/workspace1/image-style
/backdrop/screen0/monitor0/workspace1/last-image
/backdrop/screen0/monitor0/workspace2/color-style
/backdrop/screen0/monitor0/workspace2/image-style
/backdrop/screen0/monitor0/workspace2/last-image
/backdrop/screen0/monitor0/workspace3/color-style
/backdrop/screen0/monitor0/workspace3/image-style
/backdrop/screen0/monitor0/workspace3/last-image
/backdrop/screen0/monitor1/brightness
/backdrop/screen0/monitor1/image-path
/backdrop/screen0/monitor1/last-image
/backdrop/screen0/monitor1/last-single-image
/backdrop/screen0/monitor2/brightness
/backdrop/screen0/monitor2/image-path
/backdrop/screen0/monitor2/last-image
/backdrop/screen0/monitor2/last-single-image
/backdrop/screen0/monitoreDP-1/workspace0/color-style
/backdrop/screen0/monitoreDP-1/workspace0/image-style
/backdrop/screen0/monitoreDP-1/workspace0/last-image
/backdrop/screen0/monitoreDP-1/workspace1/color-style
/backdrop/screen0/monitoreDP-1/workspace1/image-style
/backdrop/screen0/monitoreDP-1/workspace1/last-image
/backdrop/screen0/monitoreDP-1/workspace2/color-style
/backdrop/screen0/monitoreDP-1/workspace2/image-style
/backdrop/screen0/monitoreDP-1/workspace2/last-image
/backdrop/screen0/monitoreDP-1/workspace3/color-style
/backdrop/screen0/monitoreDP-1/workspace3/image-style
/backdrop/screen0/monitoreDP-1/workspace3/last-image
/backdrop/screen0/monitoreDP/workspace0/color-style
/backdrop/screen0/monitoreDP/workspace0/image-style
/backdrop/screen0/monitoreDP/workspace0/last-image
/backdrop/screen0/monitoreDP/workspace1/color-style
/backdrop/screen0/monitoreDP/workspace1/image-style
/backdrop/screen0/monitoreDP/workspace1/last-image
/backdrop/screen0/monitoreDP/workspace2/color-style
/backdrop/screen0/monitoreDP/workspace2/image-style
/backdrop/screen0/monitoreDP/workspace2/last-image
/backdrop/screen0/monitoreDP/workspace3/color-style
/backdrop/screen0/monitoreDP/workspace3/image-style
/backdrop/screen0/monitoreDP/workspace3/last-image

-- 
Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 686 bytes --]

^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-19  8:52                       ` Po Lu
  2022-09-19 17:46                         ` Thierry Volpiatto
@ 2022-09-19 18:05                         ` Thierry Volpiatto
  2022-09-19 18:59                           ` Stefan Kangas
  2022-09-19 20:16                           ` Tomas Hlavaty
  1 sibling, 2 replies; 61+ messages in thread
From: Thierry Volpiatto @ 2022-09-19 18:05 UTC (permalink / raw)
  To: Po Lu; +Cc: Stefan Kangas, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 1688 bytes --]


Also I noticed that anything other than worspace0 is not working from
emacs -nw, also from emacs -nw I have to extract monitor and screen
infos from command line (the emacs functions you sent are working only
on graphic display).
Here the last function I use here to test (works in emacs -nw and from
all workspaces) if that help.

(defun tv/change-xfce-background (file)
    (let* ((screen  (shell-command-to-string "echo -n $DISPLAY"))
           (monitor (shell-command-to-string
                     "echo -n $(xrandr | awk '/\\w* connected/ {print $1}')"))
           (desktop (and (display-graphic-p)
                         (x-window-property "_NET_CURRENT_DESKTOP" nil "CARDINAL" 0 nil t)))
           (prop    (format "/backdrop/screen%s/monitor%s/workspace%s/last-image"
                            (substring screen (1- (length screen)))
                            monitor
                            (or desktop 0)))
           (proc    (apply #'start-process "set background" nil "xfconf-query"
                           `("-c" "xfce4-desktop" "-p" ,prop "-s" ,file))))
      (set-process-sentinel
       proc (lambda (proc event)
              (if (string= event "finished\n")
                  (message "Background changed successfully to %s" (helm-basename file))
                (message "Failed to change background"))))))

Po Lu <luangruo@yahoo.com> writes:

> Thierry Volpiatto <thievol@posteo.net> writes:
>
>> Don't know where I can get that (/backdrop is not a directory).
>
> I meant with the `xfconf-query' program, sorry:
>
>   xfconf-query --list --recursive --channel xfce4-desktop --property /backdrop


-- 
Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 686 bytes --]

^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-19 18:05                         ` Thierry Volpiatto
@ 2022-09-19 18:59                           ` Stefan Kangas
  2022-09-19 20:16                           ` Tomas Hlavaty
  1 sibling, 0 replies; 61+ messages in thread
From: Stefan Kangas @ 2022-09-19 18:59 UTC (permalink / raw)
  To: Thierry Volpiatto, Po Lu; +Cc: emacs-devel

Thierry Volpiatto <thievol@posteo.net> writes:

> Also I noticed that anything other than worspace0 is not working from
> emacs -nw, also from emacs -nw I have to extract monitor and screen
> infos from command line (the emacs functions you sent are working only
> on graphic display).
> Here the last function I use here to test (works in emacs -nw and from
> all workspaces) if that help.

Thanks.  I'm working on how to better handle this, and the code you
posted will definitely come in handy once I can finalize that work.



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-19 18:05                         ` Thierry Volpiatto
  2022-09-19 18:59                           ` Stefan Kangas
@ 2022-09-19 20:16                           ` Tomas Hlavaty
  2022-09-19 21:19                             ` Stefan Monnier
  2022-09-20  2:32                             ` Eli Zaretskii
  1 sibling, 2 replies; 61+ messages in thread
From: Tomas Hlavaty @ 2022-09-19 20:16 UTC (permalink / raw)
  To: Thierry Volpiatto, Po Lu; +Cc: Stefan Kangas, emacs-devel

On Mon 19 Sep 2022 at 18:05, Thierry Volpiatto <thievol@posteo.net> wrote:
>     (let* ((screen  (shell-command-to-string "echo -n $DISPLAY"))

would (getenv "DISPLAY") be better?



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-19 20:16                           ` Tomas Hlavaty
@ 2022-09-19 21:19                             ` Stefan Monnier
  2022-09-20  6:16                               ` Thierry Volpiatto
  2022-09-20  2:32                             ` Eli Zaretskii
  1 sibling, 1 reply; 61+ messages in thread
From: Stefan Monnier @ 2022-09-19 21:19 UTC (permalink / raw)
  To: Tomas Hlavaty; +Cc: Thierry Volpiatto, Po Lu, Stefan Kangas, emacs-devel

Tomas Hlavaty [2022-09-19 22:16:07] wrote:
> On Mon 19 Sep 2022 at 18:05, Thierry Volpiatto <thievol@posteo.net> wrote:
>>     (let* ((screen  (shell-command-to-string "echo -n $DISPLAY"))
> would (getenv "DISPLAY") be better?

BTW, the two will *usually* return the same result, except in the case
where the selected frame is a tty frame created via an `emacsclient`, in
which case the `DISPLAY` passed to the subprocess depends on the
`display` frame parameter.

So better use (getenv "DISPLAY" (selected-frame)) if you want to
preserve the `shell-command-to-string` behavior.


        Stefan




^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-19 20:16                           ` Tomas Hlavaty
  2022-09-19 21:19                             ` Stefan Monnier
@ 2022-09-20  2:32                             ` Eli Zaretskii
  2022-09-20  2:43                               ` Po Lu
  1 sibling, 1 reply; 61+ messages in thread
From: Eli Zaretskii @ 2022-09-20  2:32 UTC (permalink / raw)
  To: Tomas Hlavaty; +Cc: thievol, luangruo, stefankangas, emacs-devel

> From: Tomas Hlavaty <tom@logand.com>
> Cc: Stefan Kangas <stefankangas@gmail.com>, emacs-devel@gnu.org
> Date: Mon, 19 Sep 2022 22:16:07 +0200
> 
> On Mon 19 Sep 2022 at 18:05, Thierry Volpiatto <thievol@posteo.net> wrote:
> >     (let* ((screen  (shell-command-to-string "echo -n $DISPLAY"))
> 
> would (getenv "DISPLAY") be better?

Better by a large margin (modulo what Stefan Monnier points out).



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-20  2:32                             ` Eli Zaretskii
@ 2022-09-20  2:43                               ` Po Lu
  2022-09-20  6:25                                 ` Thierry Volpiatto
  0 siblings, 1 reply; 61+ messages in thread
From: Po Lu @ 2022-09-20  2:43 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Tomas Hlavaty, thievol, stefankangas, emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

> Better by a large margin (modulo what Stefan Monnier points out).

How about (terminal-name), which is the setting that really matters
here?

Or perhaps, (frame-parameter nil 'display)?



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-19 21:19                             ` Stefan Monnier
@ 2022-09-20  6:16                               ` Thierry Volpiatto
  0 siblings, 0 replies; 61+ messages in thread
From: Thierry Volpiatto @ 2022-09-20  6:16 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Tomas Hlavaty, Po Lu, Stefan Kangas, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 880 bytes --]


Stefan Monnier <monnier@iro.umontreal.ca> writes:

> Tomas Hlavaty [2022-09-19 22:16:07] wrote:
>> On Mon 19 Sep 2022 at 18:05, Thierry Volpiatto <thievol@posteo.net> wrote:
>>>     (let* ((screen  (shell-command-to-string "echo -n $DISPLAY"))
>> would (getenv "DISPLAY") be better?
>
> BTW, the two will *usually* return the same result, except in the case
> where the selected frame is a tty frame created via an `emacsclient`, in
> which case the `DISPLAY` passed to the subprocess depends on the
> `display` frame parameter.
>
> So better use (getenv "DISPLAY" (selected-frame)) if you want to
> preserve the `shell-command-to-string` behavior.

Yes, sure getenv is better, however here:

From emacs (display-graphic-p)==t:

(getenv "DISPLAY" (selected-frame))
=> nil
(getenv "DISPLAY")
=> ":0.0"

From emacs -nw both return ":0.0".

-- 
Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 686 bytes --]

^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-20  2:43                               ` Po Lu
@ 2022-09-20  6:25                                 ` Thierry Volpiatto
  2022-09-20  8:22                                   ` Po Lu
  0 siblings, 1 reply; 61+ messages in thread
From: Thierry Volpiatto @ 2022-09-20  6:25 UTC (permalink / raw)
  To: Po Lu; +Cc: Eli Zaretskii, Tomas Hlavaty, stefankangas, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 394 bytes --]


Po Lu <luangruo@yahoo.com> writes:

> Eli Zaretskii <eliz@gnu.org> writes:
>
>> Better by a large margin (modulo what Stefan Monnier points out).
>
> How about (terminal-name), which is the setting that really matters
> here?

Works on both emacs and emacs -nw.

> Or perhaps, (frame-parameter nil 'display)?

(frame-parameter nil 'display) ==>nil in emacs -nw.

-- 
Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 686 bytes --]

^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-20  6:25                                 ` Thierry Volpiatto
@ 2022-09-20  8:22                                   ` Po Lu
  0 siblings, 0 replies; 61+ messages in thread
From: Po Lu @ 2022-09-20  8:22 UTC (permalink / raw)
  To: Thierry Volpiatto; +Cc: Eli Zaretskii, Tomas Hlavaty, stefankangas, emacs-devel

Thierry Volpiatto <thievol@posteo.net> writes:

> Works on both emacs and emacs -nw.
>
>> Or perhaps, (frame-parameter nil 'display)?
>
> (frame-parameter nil 'display) ==>nil in emacs -nw.

Also, the XFCE configuration doesn't really care about DISPLAY.  So we
can only make a reasonable guess about the screen number based on the
name of the current terminal, making the assumption that it corresponds
to the same display and screen that the user's XFCE session is running
inside.



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-18  1:18       ` Po Lu
  2022-09-18  2:13         ` Po Lu
  2022-09-18  4:48         ` Thierry Volpiatto
@ 2022-09-26 19:42         ` Stefan Kangas
  2022-09-26 21:01           ` Stephen Berman
                             ` (2 more replies)
  2 siblings, 3 replies; 61+ messages in thread
From: Stefan Kangas @ 2022-09-26 19:42 UTC (permalink / raw)
  To: Po Lu; +Cc: emacs-devel, Thierry Volpiatto

Po Lu <luangruo@yahoo.com> writes:

> The screen number should be the following part of the `display' frame
> parameter:
>
>   1.1.1.1:0.5
>             ^ screen number is 5
>
> if there is no period after the separator, then the screen number is 0.
>
> The currently active workspace can be obtained like so:
>
>   (x-window-property "_NET_CURRENT_DESKTOP" nil "CARDINAL" 0 nil t)
>
> if it fails by returning NULL, then you should fall back to:
>
>   (x-window-property "WIN_WORKSPACE" nil "CARDINAL" 0 nil t)
>
> and failing that, 0.
>
> The monitor name should also be easy to extract with
> display-monitor-attributes-list, but if the source is anything other
> than "XRandr", "XRandr 1.5" or "Gdk", you should fall back to using "0".

Thanks, I've pushed a fix to master based on the above.  I very much
appreciated the clear instructions above, which saved me a ton of time.

I had to jump through extra hoops to get it to work also in the
situation that Thierry described, however.  See commit b0289e7f6d and in
particular bb9df76dc9.

I installed XFCE on my machine to test the change and it works for me.
If someone with XFCE could test that the change works for them, that
would be welcome.



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-26 19:42         ` Stefan Kangas
@ 2022-09-26 21:01           ` Stephen Berman
  2022-09-26 22:46             ` Stefan Kangas
  2022-09-27  0:33             ` Po Lu
  2022-09-27  5:56           ` Eli Zaretskii
  2022-09-27  7:21           ` Thierry Volpiatto
  2 siblings, 2 replies; 61+ messages in thread
From: Stephen Berman @ 2022-09-26 21:01 UTC (permalink / raw)
  To: Stefan Kangas; +Cc: Po Lu, emacs-devel, Thierry Volpiatto

On Mon, 26 Sep 2022 15:42:51 -0400 Stefan Kangas <stefankangas@gmail.com> wrote:

> Po Lu <luangruo@yahoo.com> writes:
>
>> The screen number should be the following part of the `display' frame
>> parameter:
>>
>>   1.1.1.1:0.5
>>             ^ screen number is 5
>>
>> if there is no period after the separator, then the screen number is 0.
>>
>> The currently active workspace can be obtained like so:
>>
>>   (x-window-property "_NET_CURRENT_DESKTOP" nil "CARDINAL" 0 nil t)
>>
>> if it fails by returning NULL, then you should fall back to:
>>
>>   (x-window-property "WIN_WORKSPACE" nil "CARDINAL" 0 nil t)
>>
>> and failing that, 0.
>>
>> The monitor name should also be easy to extract with
>> display-monitor-attributes-list, but if the source is anything other
>> than "XRandr", "XRandr 1.5" or "Gdk", you should fall back to using "0".
>
> Thanks, I've pushed a fix to master based on the above.  I very much
> appreciated the clear instructions above, which saved me a ton of time.
>
> I had to jump through extra hoops to get it to work also in the
> situation that Thierry described, however.  See commit b0289e7f6d and in
> particular bb9df76dc9.
>
> I installed XFCE on my machine to test the change and it works for me.
> If someone with XFCE could test that the change works for them, that
> would be welcome.

It does not work for me.  display-monitor-attributes-list identifies my
monitor as "HDMI2", which is of course not one of the stipulated
sources.  After commenting out

(if (and monitor (member source '("XRandr" "XRandr 1.5" "Gdk")))
    monitor
  "0")

in wallpaper--format-arg and using "HDMI2" for the monitor, then
wallpaper-default-set-function produces a command that does change the
wallpaper.

In case it matters, my xfconf-query version is 4.16.0.

Steve Berman



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-26 21:01           ` Stephen Berman
@ 2022-09-26 22:46             ` Stefan Kangas
  2022-09-27  7:17               ` Stephen Berman
  2022-09-27  0:33             ` Po Lu
  1 sibling, 1 reply; 61+ messages in thread
From: Stefan Kangas @ 2022-09-26 22:46 UTC (permalink / raw)
  To: Stephen Berman; +Cc: Po Lu, emacs-devel, Thierry Volpiatto

Stephen Berman <stephen.berman@gmx.net> writes:

> It does not work for me.  display-monitor-attributes-list identifies my
> monitor as "HDMI2", which is of course not one of the stipulated
> sources.  After commenting out
>
> (if (and monitor (member source '("XRandr" "XRandr 1.5" "Gdk")))
>     monitor
>   "0")
>
> in wallpaper--format-arg and using "HDMI2" for the monitor, then
> wallpaper-default-set-function produces a command that does change the
> wallpaper.

What's the full value of

    (display-monitor-attributes-list)

on your system?



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-26 21:01           ` Stephen Berman
  2022-09-26 22:46             ` Stefan Kangas
@ 2022-09-27  0:33             ` Po Lu
  1 sibling, 0 replies; 61+ messages in thread
From: Po Lu @ 2022-09-27  0:33 UTC (permalink / raw)
  To: Stephen Berman; +Cc: Stefan Kangas, emacs-devel, Thierry Volpiatto

Stephen Berman <stephen.berman@gmx.net> writes:

> It does not work for me.  display-monitor-attributes-list identifies my
> monitor as "HDMI2", which is of course not one of the stipulated
> sources.  After commenting out
>
> (if (and monitor (member source '("XRandr" "XRandr 1.5" "Gdk")))
>     monitor
>   "0")
>
> in wallpaper--format-arg and using "HDMI2" for the monitor, then
> wallpaper-default-set-function produces a command that does change the
> wallpaper.
>
> In case it matters, my xfconf-query version is 4.16.0.

I think you said "HDMI2" twice.  What is the actual name of the monitor?



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-26 19:42         ` Stefan Kangas
  2022-09-26 21:01           ` Stephen Berman
@ 2022-09-27  5:56           ` Eli Zaretskii
  2022-09-27  6:13             ` Po Lu
  2022-09-27  7:21           ` Thierry Volpiatto
  2 siblings, 1 reply; 61+ messages in thread
From: Eli Zaretskii @ 2022-09-27  5:56 UTC (permalink / raw)
  To: Stefan Kangas; +Cc: luangruo, emacs-devel, thievol

> From: Stefan Kangas <stefankangas@gmail.com>
> Date: Mon, 26 Sep 2022 15:42:51 -0400
> Cc: emacs-devel@gnu.org, Thierry Volpiatto <thievol@posteo.net>
> 
> Po Lu <luangruo@yahoo.com> writes:
> 
> > The screen number should be the following part of the `display' frame
> > parameter:
> >
> >   1.1.1.1:0.5
> >             ^ screen number is 5
> >
> > if there is no period after the separator, then the screen number is 0.
> >
> > The currently active workspace can be obtained like so:
> >
> >   (x-window-property "_NET_CURRENT_DESKTOP" nil "CARDINAL" 0 nil t)
> >
> > if it fails by returning NULL, then you should fall back to:
> >
> >   (x-window-property "WIN_WORKSPACE" nil "CARDINAL" 0 nil t)
> >
> > and failing that, 0.
> >
> > The monitor name should also be easy to extract with
> > display-monitor-attributes-list, but if the source is anything other
> > than "XRandr", "XRandr 1.5" or "Gdk", you should fall back to using "0".
> 
> Thanks, I've pushed a fix to master based on the above.  I very much
> appreciated the clear instructions above, which saved me a ton of time.

It would be good to have at least the important properties accepted by
x-window-property documented in the doc string.



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-27  5:56           ` Eli Zaretskii
@ 2022-09-27  6:13             ` Po Lu
  2022-09-27  6:45               ` Eli Zaretskii
  0 siblings, 1 reply; 61+ messages in thread
From: Po Lu @ 2022-09-27  6:13 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Stefan Kangas, emacs-devel, thievol

Eli Zaretskii <eliz@gnu.org> writes:

>> Thanks, I've pushed a fix to master based on the above.  I very much
>> appreciated the clear instructions above, which saved me a ton of time.
>
> It would be good to have at least the important properties accepted by
> x-window-property documented in the doc string.

But those properties aren't specified by Emacs, they're specified by
third-party specifications, like this:

  https://specifications.freedesktop.org/wm-spec/wm-spec-latest.html

or

  https://x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM/icccm.html

maybe it would be better to put a link to those specifications in the
doc string, instead of simply mentioning the many important properties?




^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-27  6:13             ` Po Lu
@ 2022-09-27  6:45               ` Eli Zaretskii
  2022-09-27  7:50                 ` Po Lu
  0 siblings, 1 reply; 61+ messages in thread
From: Eli Zaretskii @ 2022-09-27  6:45 UTC (permalink / raw)
  To: Po Lu; +Cc: stefankangas, emacs-devel, thievol

> From: Po Lu <luangruo@yahoo.com>
> Cc: Stefan Kangas <stefankangas@gmail.com>,  emacs-devel@gnu.org,
>   thievol@posteo.net
> Date: Tue, 27 Sep 2022 14:13:15 +0800
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> Thanks, I've pushed a fix to master based on the above.  I very much
> >> appreciated the clear instructions above, which saved me a ton of time.
> >
> > It would be good to have at least the important properties accepted by
> > x-window-property documented in the doc string.
> 
> But those properties aren't specified by Emacs, they're specified by
> third-party specifications, like this:
> 
>   https://specifications.freedesktop.org/wm-spec/wm-spec-latest.html
> 
> or
> 
>   https://x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM/icccm.html
> 
> maybe it would be better to put a link to those specifications in the
> doc string, instead of simply mentioning the many important properties?

Yes, of course, mentioning those URLs will go a long way towards
filling the current gap.  If different environments/desktops have
their separate specs, I think it is best to have them all mentioned,
each one with the names of the environments/desktops for which it is
relevant.

Thanks.



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-26 22:46             ` Stefan Kangas
@ 2022-09-27  7:17               ` Stephen Berman
  2022-09-27  7:45                 ` Po Lu
  0 siblings, 1 reply; 61+ messages in thread
From: Stephen Berman @ 2022-09-27  7:17 UTC (permalink / raw)
  To: Stefan Kangas; +Cc: Po Lu, emacs-devel, Thierry Volpiatto

On Mon, 26 Sep 2022 18:46:47 -0400 Stefan Kangas <stefankangas@gmail.com> wrote:

> Stephen Berman <stephen.berman@gmx.net> writes:
>
>> It does not work for me.  display-monitor-attributes-list identifies my
>> monitor as "HDMI2", which is of course not one of the stipulated
>> sources.  After commenting out
>>
>> (if (and monitor (member source '("XRandr" "XRandr 1.5" "Gdk")))
>>     monitor
>>   "0")
>>
>> in wallpaper--format-arg and using "HDMI2" for the monitor, then
>> wallpaper-default-set-function produces a command that does change the
>> wallpaper.
>
> What's the full value of
>
>     (display-monitor-attributes-list)
>
> on your system?

(((name . "HDMI2") (geometry 0 0 2560 1440) (workarea 0 0 2560 1440) (mm-size 600 340) (frames #<frame  *Minibuf-1* - GNU Emacs at strobelfs2 0x2036950>) (source . "XRandR 1.5")))

On Tue, 27 Sep 2022 08:33:20 +0800 Po Lu <luangruo@yahoo.com> wrote:

[...]
> I think you said "HDMI2" twice.  What is the actual name of the monitor?

Yeah, sorry, I misread the code.  As seen above, the problem is that
display-monitor-attributes-list contains "XRandR 1.5", not "XRandr 1.5".

Steve Berman



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-26 19:42         ` Stefan Kangas
  2022-09-26 21:01           ` Stephen Berman
  2022-09-27  5:56           ` Eli Zaretskii
@ 2022-09-27  7:21           ` Thierry Volpiatto
  2022-09-27  7:42             ` Po Lu
                               ` (2 more replies)
  2 siblings, 3 replies; 61+ messages in thread
From: Thierry Volpiatto @ 2022-09-27  7:21 UTC (permalink / raw)
  To: Stefan Kangas; +Cc: Po Lu, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 3647 bytes --]


Hello Stefan,

Stefan Kangas <stefankangas@gmail.com> writes:

> Po Lu <luangruo@yahoo.com> writes:
>
>> The screen number should be the following part of the `display' frame
>> parameter:
>>
>>   1.1.1.1:0.5
>>             ^ screen number is 5
>>
>> if there is no period after the separator, then the screen number is 0.
>>
>> The currently active workspace can be obtained like so:
>>
>>   (x-window-property "_NET_CURRENT_DESKTOP" nil "CARDINAL" 0 nil t)
>>
>> if it fails by returning NULL, then you should fall back to:
>>
>>   (x-window-property "WIN_WORKSPACE" nil "CARDINAL" 0 nil t)
>>
>> and failing that, 0.
>>
>> The monitor name should also be easy to extract with
>> display-monitor-attributes-list, but if the source is anything other
>> than "XRandr", "XRandr 1.5" or "Gdk", you should fall back to using "0".
>
> Thanks, I've pushed a fix to master based on the above.  I very much
> appreciated the clear instructions above, which saved me a ton of time.
>
> I had to jump through extra hoops to get it to work also in the
> situation that Thierry described, however.  See commit b0289e7f6d and in
> particular bb9df76dc9.
>
> I installed XFCE on my machine to test the change and it works for me.
> If someone with XFCE could test that the change works for them, that
> would be welcome.

It is working fine on graphic display but on emacs -nw there is two problems:

1) The function wallpaper--format-arg is evaluating the format-specs each
time it is called and when display-graphic-p returns nil, user is
prompted for height and width at each call.

Here the xfce args:

("-c" "xfce4-desktop" "-p" "/backdrop/screen%S/monitor%M/workspace%W/last-image" "-s" "%f")

We are prompted for height and width for each of these args.

Here how you could fix this:

diff --git a/lisp/image/wallpaper.el b/lisp/image/wallpaper.el
index 36bc7e91a69..9ac0fd1dc91 100644
--- a/lisp/image/wallpaper.el
+++ b/lisp/image/wallpaper.el
@@ -374,8 +374,10 @@ See also `wallpaper-default-width'.")
 
 (defun wallpaper--get-height-or-width (desc fun default)
   (cond ((display-graphic-p) (funcall fun))
-        (noninteractive default)
-        ((read-number (format "Wallpaper %s in pixels: " desc) default))))
+        ;; (noninteractive default)
+        (t
+         (lambda ()
+           (read-number (format "Wallpaper %s in pixels: " desc) default)))))
 
 (autoload 'ffap-file-at-point "ffap")
 
@@ -444,7 +446,9 @@ This is the default function for `wallpaper-set-function'."
   (let* ((args (if (functionp wallpaper-command-args)
                    (funcall wallpaper-command-args)
                  wallpaper-command-args))
-         (real-args (mapcar (lambda (arg) (wallpaper--format-arg arg file))
+         (real-args (mapcar (lambda (arg)
+                              (let ((val (wallpaper--format-arg arg file)))
+                                (if (functionp val) (funcall val) val)))
                             args))
          (bufname (format " *wallpaper-%s*" (random)))
          (process

2) display-monitor-attributes-list doesn't return the value of monitor:

(display-monitor-attributes-list)

On graphic display it is ok:
=> (((name . "eDP")
  (geometry 0 0 1920 1080)
  (workarea 0 0 1920 1080)
  (mm-size 309 174)
  (frames #<frame  *Minibuf-1* - GNU Emacs at IPad-S340 0x55d6b2418828>)
  (source . "XRandr")))

But not on emacs -nw
=> (((geometry 0 0 238 57) (workarea 0 0 238 57) (mm-size nil nil) (frames #<frame F1 0x5636347dc460>)))

As a result the wallpaper is never set on emacs -nw.


-- 
Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 686 bytes --]

^ permalink raw reply related	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-27  7:21           ` Thierry Volpiatto
@ 2022-09-27  7:42             ` Po Lu
  2022-09-27  7:55               ` Thierry Volpiatto
  2022-09-27 13:57             ` Stefan Kangas
  2022-09-29 14:16             ` master fe7c015b20: Support XFCE in wallpaper.el Stefan Kangas
  2 siblings, 1 reply; 61+ messages in thread
From: Po Lu @ 2022-09-27  7:42 UTC (permalink / raw)
  To: Thierry Volpiatto; +Cc: Stefan Kangas, emacs-devel

Thierry Volpiatto <thievol@posteo.net> writes:

> But not on emacs -nw
> => (((geometry 0 0 238 57) (workarea 0 0 238 57) (mm-size nil nil) (frames #<frame F1 0x5636347dc460>)))
>
> As a result the wallpaper is never set on emacs -nw.

Right... I think in that case the best thing to do would be to prompt
for the monitor name.



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-27  7:17               ` Stephen Berman
@ 2022-09-27  7:45                 ` Po Lu
  2022-09-27 13:42                   ` Stefan Kangas
  0 siblings, 1 reply; 61+ messages in thread
From: Po Lu @ 2022-09-27  7:45 UTC (permalink / raw)
  To: Stephen Berman; +Cc: Stefan Kangas, emacs-devel, Thierry Volpiatto

Stephen Berman <stephen.berman@gmx.net> writes:

> Yeah, sorry, I misread the code.  As seen above, the problem is that
> display-monitor-attributes-list contains "XRandR 1.5", not "XRandr 1.5".

Then it's my fault for providing bad instructions.  It should indeed be
"XRandR 1.5".

Sorry for the confusion.



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-27  6:45               ` Eli Zaretskii
@ 2022-09-27  7:50                 ` Po Lu
  2022-09-27  7:56                   ` Eli Zaretskii
  0 siblings, 1 reply; 61+ messages in thread
From: Po Lu @ 2022-09-27  7:50 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: stefankangas, emacs-devel, thievol

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Po Lu <luangruo@yahoo.com>
>> Cc: Stefan Kangas <stefankangas@gmail.com>,  emacs-devel@gnu.org,
>>   thievol@posteo.net
>> Date: Tue, 27 Sep 2022 14:13:15 +0800
>> 
>> Eli Zaretskii <eliz@gnu.org> writes:
>> 
>> >> Thanks, I've pushed a fix to master based on the above.  I very much
>> >> appreciated the clear instructions above, which saved me a ton of time.
>> >
>> > It would be good to have at least the important properties accepted by
>> > x-window-property documented in the doc string.
>> 
>> But those properties aren't specified by Emacs, they're specified by
>> third-party specifications, like this:
>> 
>>   https://specifications.freedesktop.org/wm-spec/wm-spec-latest.html
>> 
>> or
>> 
>>   https://x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM/icccm.html
>> 
>> maybe it would be better to put a link to those specifications in the
>> doc string, instead of simply mentioning the many important properties?
>
> Yes, of course, mentioning those URLs will go a long way towards
> filling the current gap.  If different environments/desktops have
> their separate specs, I think it is best to have them all mentioned,
> each one with the names of the environments/desktops for which it is
> relevant.
>
> Thanks.

Different desktops do have their own properties, but they are too
numerous to list, unstandardized, and not really relevant for Emacs
users.  If the following text looks OK, I will add it to the doc string
of `x-window-property' soon:

X allows an arbitrary number of properties to be set on any window.
However, properties are most often set by the window manager or other
programs on the root window or FRAME's X window in order to communicate
information to Emacs and other programs.  Most of these properties are
specified as part of the Extended Window Manager Hints and the
Inter-Client Communication Conventions Manual, which are located here:

   https://specifications.freedesktop.org/wm-spec/wm-spec-latest.html

and

  https://x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM/icccm.html




^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-27  7:42             ` Po Lu
@ 2022-09-27  7:55               ` Thierry Volpiatto
  2022-09-27  8:35                 ` Po Lu
  0 siblings, 1 reply; 61+ messages in thread
From: Thierry Volpiatto @ 2022-09-27  7:55 UTC (permalink / raw)
  To: Po Lu; +Cc: Stefan Kangas, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 448 bytes --]


Po Lu <luangruo@yahoo.com> writes:

> Thierry Volpiatto <thievol@posteo.net> writes:
>
>> But not on emacs -nw
>> => (((geometry 0 0 238 57) (workarea 0 0 238 57) (mm-size nil nil) (frames #<frame F1 0x5636347dc460>)))
>>
>> As a result the wallpaper is never set on emacs -nw.
>
> Right... I think in that case the best thing to do would be to prompt
> for the monitor name.

Or to use xrandr directly if available.

-- 
Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 686 bytes --]

^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-27  7:50                 ` Po Lu
@ 2022-09-27  7:56                   ` Eli Zaretskii
  2022-09-27  8:31                     ` Po Lu
  0 siblings, 1 reply; 61+ messages in thread
From: Eli Zaretskii @ 2022-09-27  7:56 UTC (permalink / raw)
  To: Po Lu; +Cc: stefankangas, emacs-devel, thievol

> From: Po Lu <luangruo@yahoo.com>
> Cc: stefankangas@gmail.com,  emacs-devel@gnu.org,  thievol@posteo.net
> Date: Tue, 27 Sep 2022 15:50:31 +0800
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> > Yes, of course, mentioning those URLs will go a long way towards
> > filling the current gap.  If different environments/desktops have
> > their separate specs, I think it is best to have them all mentioned,
> > each one with the names of the environments/desktops for which it is
> > relevant.
> >
> > Thanks.
> 
> Different desktops do have their own properties, but they are too
> numerous to list, unstandardized, and not really relevant for Emacs
> users.

Why should we second-guess what users will want? why not include those
other specs, even though they aren't standardized?  How many popular
desktops which have these specs are out there?

> X allows an arbitrary number of properties to be set on any window.
> However, properties are most often set by the window manager or other
> programs on the root window or FRAME's X window in order to communicate
> information to Emacs and other programs.  Most of these properties are
> specified as part of the Extended Window Manager Hints and the
> Inter-Client Communication Conventions Manual, which are located here:
> 
>    https://specifications.freedesktop.org/wm-spec/wm-spec-latest.html
> 
> and
> 
>   https://x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM/icccm.html

SGTM, thanks.



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-27  7:56                   ` Eli Zaretskii
@ 2022-09-27  8:31                     ` Po Lu
  0 siblings, 0 replies; 61+ messages in thread
From: Po Lu @ 2022-09-27  8:31 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: stefankangas, emacs-devel, thievol

Eli Zaretskii <eliz@gnu.org> writes:

> Why should we second-guess what users will want? why not include those
> other specs, even though they aren't standardized?  How many popular
> desktops which have these specs are out there?

They aren't specified at all.  Most consist of private protocols between
a desktop (i.e. GNOME) and software written by the desktop developers
(i.e. GTK), and anyone who tries to document them will end up having to
second-guess what they were originally intended to mean.

Examples would be _GTK_FRAME_EXTENTS, _GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED,
_GTK_THEME_VARIANT, GDK_VISUALS, _MOTIF_DEFAULT_BINDINGS,
_GTK_WORKAREAS_Dn, XFree86_DDC_EDIDn_RAWDATA, and
_GNOME_MAX_SCREEN_SIZE.  I only vaguely know their meanings, certainly
not enough to write any meaningful documentation about them.



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-27  7:55               ` Thierry Volpiatto
@ 2022-09-27  8:35                 ` Po Lu
  2022-09-27 18:33                   ` Stefan Kangas
  0 siblings, 1 reply; 61+ messages in thread
From: Po Lu @ 2022-09-27  8:35 UTC (permalink / raw)
  To: Thierry Volpiatto; +Cc: Stefan Kangas, emacs-devel

Thierry Volpiatto <thievol@posteo.net> writes:

> Or to use xrandr directly if available.

If a display is not available, what X server will the xrandr utility
connect to?  And how will you ensure the X server that the xrandr
utility connects to is correct?

(I say "xrandr utility" because XRandR is an X protocol extension, and
/usr/bin/X11/xrandr is simply a utility that connects to the X server
using that protocol extension to probe and configure video modes.
People seem to mix the two up.)



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-27  7:45                 ` Po Lu
@ 2022-09-27 13:42                   ` Stefan Kangas
  0 siblings, 0 replies; 61+ messages in thread
From: Stefan Kangas @ 2022-09-27 13:42 UTC (permalink / raw)
  To: Po Lu, Stephen Berman; +Cc: emacs-devel, Thierry Volpiatto

Po Lu <luangruo@yahoo.com> writes:

> Stephen Berman <stephen.berman@gmx.net> writes:
>
>> Yeah, sorry, I misread the code.  As seen above, the problem is that
>> display-monitor-attributes-list contains "XRandR 1.5", not "XRandr 1.5".
>
> Then it's my fault for providing bad instructions.  It should indeed be
> "XRandR 1.5".

OK, thanks.  I've updated the documentation I could find to mention
"XRandr 1.5" too.



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-27  7:21           ` Thierry Volpiatto
  2022-09-27  7:42             ` Po Lu
@ 2022-09-27 13:57             ` Stefan Kangas
  2022-09-27 15:43               ` Visuwesh
  2022-09-29 14:16             ` master fe7c015b20: Support XFCE in wallpaper.el Stefan Kangas
  2 siblings, 1 reply; 61+ messages in thread
From: Stefan Kangas @ 2022-09-27 13:57 UTC (permalink / raw)
  To: Thierry Volpiatto; +Cc: Po Lu, emacs-devel

Thierry Volpiatto <thievol@posteo.net> writes:

> 1) The function wallpaper--format-arg is evaluating the format-specs each
> time it is called and when display-graphic-p returns nil, user is
> prompted for height and width at each call.
>
> Here the xfce args:
>
> ("-c" "xfce4-desktop" "-p" "/backdrop/screen%S/monitor%M/workspace%W/last-image" "-s" "%f")
>
> We are prompted for height and width for each of these args.

The problem here is that all arguments to `format-spec' are evaluated
unconditionally.

Could we change `format-spec' to accept functions in the substitutions,
that are then only called when actually needed?

For example, from its docstring:

  (format-spec "su - %u %l"
               `((?u . ,(user-login-name))
                 (?l . "ls")))

Could then instead be:

  (format-spec "su - %u %l"
               `((?u . #'user-login-name)
                 (?l . "ls")))

Perhaps we should hide that behind a new optional argument though.



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-27 13:57             ` Stefan Kangas
@ 2022-09-27 15:43               ` Visuwesh
  2022-09-27 16:19                 ` Stefan Kangas
  0 siblings, 1 reply; 61+ messages in thread
From: Visuwesh @ 2022-09-27 15:43 UTC (permalink / raw)
  To: Stefan Kangas; +Cc: Thierry Volpiatto, Po Lu, emacs-devel

[செவ்வாய் செப்டம்பர் 27, 2022] Stefan Kangas wrote:

> Could we change `format-spec' to accept functions in the substitutions,
> that are then only called when actually needed?

+1. I was thinking of raising such a proposal myself.  It seems wasteful to
pre-calculate all the specifications instead of lazily evaluating them.

>
> For example, from its docstring:
>
>   (format-spec "su - %u %l"
>                `((?u . ,(user-login-name))
>                  (?l . "ls")))
>
> Could then instead be:
>
>   (format-spec "su - %u %l"
>                `((?u . #'user-login-name)
>                  (?l . "ls")))
>
> Perhaps we should hide that behind a new optional argument though.



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-27 15:43               ` Visuwesh
@ 2022-09-27 16:19                 ` Stefan Kangas
  2022-09-27 16:39                   ` Thierry Volpiatto
  2022-09-27 16:40                   ` Eli Zaretskii
  0 siblings, 2 replies; 61+ messages in thread
From: Stefan Kangas @ 2022-09-27 16:19 UTC (permalink / raw)
  To: Visuwesh; +Cc: Thierry Volpiatto, Po Lu, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 477 bytes --]

Visuwesh <visuweshm@gmail.com> writes:

> [செவ்வாய் செப்டம்பர் 27, 2022] Stefan Kangas wrote:
>
>> Could we change `format-spec' to accept functions in the substitutions,
>> that are then only called when actually needed?
>
> +1. I was thinking of raising such a proposal myself.  It seems wasteful to
> pre-calculate all the specifications instead of lazily evaluating them.

The change is just the attached, plus documentation.

[-- Attachment #2: 0001-Make-format-spec-support-functions.patch --]
[-- Type: text/x-diff, Size: 2945 bytes --]

From e0a1a678e27a6a3da5e12edfcc7323c5204f6d2a Mon Sep 17 00:00:00 2001
From: Stefan Kangas <stefankangas@gmail.com>
Date: Tue, 27 Sep 2022 18:16:51 +0200
Subject: [PATCH] Make format-spec support functions

---
 lisp/format-spec.el            | 15 +++++++++++++--
 test/lisp/format-spec-tests.el | 12 ++++++++++++
 2 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/lisp/format-spec.el b/lisp/format-spec.el
index 45c19aebc8..31e1d861c2 100644
--- a/lisp/format-spec.el
+++ b/lisp/format-spec.el
@@ -59,6 +59,16 @@ format-spec
 leading zeros or truncating leading characters until it's ten
 characters wide\".
 
+If the value is a function, it will be evaluated only when
+needed.  For example:
+
+  (format-spec \"%n\"
+               \\=`((?n . ,(lambda ()
+                          (read-number \"Number: \")))))
+
+Note that it is better to make sure the lambda is not quoted,
+like above, so that it is compiled by the byte-compiler.
+
 Any text properties of FORMAT are copied to the result, with any
 text properties of a %-spec itself copied to its substitution.
 
@@ -94,14 +104,15 @@ format-spec
                  (width (match-string 2))
                  (trunc (match-string 3))
                  (char (string-to-char (match-string 4)))
-                 (text (assq char specification)))
+                 (text (let ((res (cdr (assq char specification))))
+                         (if (and (functionp res)) (funcall res) res))))
             (when (and split
                        (not (= (1- beg) split-start)))
               (push (buffer-substring split-start (1- beg)) split-result))
             (cond (text
                    ;; Handle flags.
                    (setq text (format-spec--do-flags
-                               (format "%s" (cdr text))
+                               (format "%s" text)
                                (format-spec--parse-flags flags)
                                (and width (string-to-number width))
                                (and trunc (car (read-from-string trunc 1)))))
diff --git a/test/lisp/format-spec-tests.el b/test/lisp/format-spec-tests.el
index 4a3cc74c33..f137f94aaa 100644
--- a/test/lisp/format-spec-tests.el
+++ b/test/lisp/format-spec-tests.el
@@ -148,6 +148,18 @@ format-spec
              (format-spec fmt '((?b . "asd") (?a . "fgh")))
              #("fgh%asdasd" 0 3 (a b) 3 4 (c d) 7 10 (e f))))))
 
+(ert-deftest format-spec/function ()
+  (let* (called
+         (spec `((?a . "foo")
+                 (?f . ,(lambda ()
+                          (setq called t)
+                          "bar")))))
+    (should (equal (format-spec "%a" spec) "foo"))
+    (should-not called)
+    (should (equal (format-spec "%f" spec) "bar"))
+    (should called)))
+
+
 (ert-deftest format-spec-unknown ()
   (should-error (format-spec "foo %b %z zot" '((?b . "bar"))))
   (should-error (format-spec "foo %b %%%z zot" '((?b . "bar"))))
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-27 16:19                 ` Stefan Kangas
@ 2022-09-27 16:39                   ` Thierry Volpiatto
  2022-09-27 16:40                   ` Eli Zaretskii
  1 sibling, 0 replies; 61+ messages in thread
From: Thierry Volpiatto @ 2022-09-27 16:39 UTC (permalink / raw)
  To: Stefan Kangas; +Cc: Visuwesh, Po Lu, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 714 bytes --]


Stefan Kangas <stefankangas@gmail.com> writes:

> Visuwesh <visuweshm@gmail.com> writes:
>
>> [செவ்வாய் செப்டம்பர் 27, 2022] Stefan Kangas wrote:
>>
>>> Could we change `format-spec' to accept functions in the substitutions,
>>> that are then only called when actually needed?
>>
>> +1. I was thinking of raising such a proposal myself.  It seems wasteful to
>> pre-calculate all the specifications instead of lazily evaluating them.
>
> The change is just the attached, plus documentation.

Nice.

> [2. text/x-diff; 0001-Make-format-spec-support-functions.patch]...

(if (and (functionp res)) (funcall res) res)
    ^^^^^^^^^^^^^^^^^^^^^

-- 
Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 686 bytes --]

^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-27 16:19                 ` Stefan Kangas
  2022-09-27 16:39                   ` Thierry Volpiatto
@ 2022-09-27 16:40                   ` Eli Zaretskii
  2022-09-27 17:01                     ` Stefan Kangas
  1 sibling, 1 reply; 61+ messages in thread
From: Eli Zaretskii @ 2022-09-27 16:40 UTC (permalink / raw)
  To: Stefan Kangas; +Cc: visuweshm, thievol, luangruo, emacs-devel

> From: Stefan Kangas <stefankangas@gmail.com>
> Date: Tue, 27 Sep 2022 12:19:32 -0400
> Cc: Thierry Volpiatto <thievol@posteo.net>, Po Lu <luangruo@yahoo.com>,
>  emacs-devel@gnu.org
> 
> +If the value is a function, it will be evaluated only when
> +needed.  For example:

What does it mean "only when needed" in this context?



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-27 16:40                   ` Eli Zaretskii
@ 2022-09-27 17:01                     ` Stefan Kangas
  2022-09-27 17:14                       ` Eli Zaretskii
  0 siblings, 1 reply; 61+ messages in thread
From: Stefan Kangas @ 2022-09-27 17:01 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: visuweshm, thievol, luangruo, emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

>> +If the value is a function, it will be evaluated only when
>> +needed.  For example:
>
> What does it mean "only when needed" in this context?

I wrote this rather quickly.

Is "only when a %-spec needs it" more clear?  It should probably say
"called" instead of "evaluated", too.



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-27 17:01                     ` Stefan Kangas
@ 2022-09-27 17:14                       ` Eli Zaretskii
  2022-09-27 18:02                         ` Make format-spec accept a function as the substitution Stefan Kangas
  0 siblings, 1 reply; 61+ messages in thread
From: Eli Zaretskii @ 2022-09-27 17:14 UTC (permalink / raw)
  To: Stefan Kangas; +Cc: visuweshm, thievol, luangruo, emacs-devel

> From: Stefan Kangas <stefankangas@gmail.com>
> Date: Tue, 27 Sep 2022 13:01:11 -0400
> Cc: visuweshm@gmail.com, thievol@posteo.net, luangruo@yahoo.com, 
> 	emacs-devel@gnu.org
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> +If the value is a function, it will be evaluated only when
> >> +needed.  For example:
> >
> > What does it mean "only when needed" in this context?
> 
> I wrote this rather quickly.
> 
> Is "only when a %-spec needs it" more clear?  It should probably say
> "called" instead of "evaluated", too.

First I think you should use "substitution", not "value", because
that's how the SPECIFICATION alist is described:

  SPECIFICATION is an alist mapping format specification characters
  to their substitutions.

And then I'd suggest something like

  If the substitution for a specification character is a function, the
  function will be called only if FORMAT uses that character.



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Make format-spec accept a function as the substitution
  2022-09-27 17:14                       ` Eli Zaretskii
@ 2022-09-27 18:02                         ` Stefan Kangas
  2022-09-29  6:57                           ` Thierry Volpiatto
  0 siblings, 1 reply; 61+ messages in thread
From: Stefan Kangas @ 2022-09-27 18:02 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: visuweshm, thievol, luangruo, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 283 bytes --]

Eli Zaretskii <eliz@gnu.org> writes:

> And then I'd suggest something like
>
>   If the substitution for a specification character is a function, the
>   function will be called only if FORMAT uses that character.

Thanks.  Please find attached a complete patch with documentation.

[-- Attachment #2: 0001-Make-format-spec-support-functions.patch --]
[-- Type: text/x-diff, Size: 4695 bytes --]

From ea1bdcc9710bb730fcf765c55875a6f102089f34 Mon Sep 17 00:00:00 2001
From: Stefan Kangas <stefankangas@gmail.com>
Date: Tue, 27 Sep 2022 18:16:51 +0200
Subject: [PATCH] Make format-spec support functions

* lisp/format-spec.el (format-spec): Allow using a format as the
substitution for a character.
* doc/lispref/strings.texi (Custom Format Strings): Document the
above change.
* test/lisp/format-spec-tests.el (format-spec/function): New test.
Ref. https://lists.gnu.org/r/emacs-devel/2022-09/msg01875.html
---
 doc/lispref/strings.texi       |  5 +++++
 etc/NEWS                       |  6 ++++++
 lisp/format-spec.el            | 16 ++++++++++++++--
 test/lisp/format-spec-tests.el | 11 +++++++++++
 4 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/doc/lispref/strings.texi b/doc/lispref/strings.texi
index 374381e595..af368f5d01 100644
--- a/doc/lispref/strings.texi
+++ b/doc/lispref/strings.texi
@@ -1293,6 +1293,11 @@ Custom Format Strings
 the order of associations in @var{spec-alist}.
 @end itemize
 
+REPLACEMENT can also be a function taking no arguments.  It will only
+be called when the corresponding LETTER is used in the TEMPLATE.  This
+is useful, for example, to avoid prompting for input unless it is
+needed.
+
 The optional argument @var{ignore-missing} indicates how to handle
 specification characters in @var{template} that are not found in
 @var{spec-alist}.  If it is @code{nil} or omitted, the function
diff --git a/etc/NEWS b/etc/NEWS
index 99243481a0..97838442db 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -3910,6 +3910,12 @@ the same but works by modifying LIST destructively.
 ---
 ** 'string-split' is now an alias for 'split-string'.
 
++++
+** 'format-spec' now accepts functions in the replacement.
+The function is called only when used in the format string.  This is
+useful to avoid side-effects such as prompting, when the value is not
+actually being used for anything.
+
 +++
 ** The variable 'max-specpdl-size' has been made obsolete.
 Now 'max-lisp-eval-depth' alone is used for limiting Lisp recursion
diff --git a/lisp/format-spec.el b/lisp/format-spec.el
index 45c19aebc8..1c817ea7fa 100644
--- a/lisp/format-spec.el
+++ b/lisp/format-spec.el
@@ -59,6 +59,17 @@ format-spec
 leading zeros or truncating leading characters until it's ten
 characters wide\".
 
+If the substitution for a specification character is a function,
+the function will be called only if FORMAT uses that character.
+For example:
+
+  (format-spec \"%n\"
+               \\=`((?n . ,(lambda ()
+                          (read-number \"Number: \")))))
+
+Note that it is best to make sure the function is not quoted,
+like above, so that it is compiled by the byte-compiler.
+
 Any text properties of FORMAT are copied to the result, with any
 text properties of a %-spec itself copied to its substitution.
 
@@ -94,14 +105,15 @@ format-spec
                  (width (match-string 2))
                  (trunc (match-string 3))
                  (char (string-to-char (match-string 4)))
-                 (text (assq char specification)))
+                 (text (let ((res (cdr (assq char specification))))
+                         (if (functionp res) (funcall res) res))))
             (when (and split
                        (not (= (1- beg) split-start)))
               (push (buffer-substring split-start (1- beg)) split-result))
             (cond (text
                    ;; Handle flags.
                    (setq text (format-spec--do-flags
-                               (format "%s" (cdr text))
+                               (format "%s" text)
                                (format-spec--parse-flags flags)
                                (and width (string-to-number width))
                                (and trunc (car (read-from-string trunc 1)))))
diff --git a/test/lisp/format-spec-tests.el b/test/lisp/format-spec-tests.el
index 4a3cc74c33..bd493ae1d7 100644
--- a/test/lisp/format-spec-tests.el
+++ b/test/lisp/format-spec-tests.el
@@ -148,6 +148,17 @@ format-spec
              (format-spec fmt '((?b . "asd") (?a . "fgh")))
              #("fgh%asdasd" 0 3 (a b) 3 4 (c d) 7 10 (e f))))))
 
+(ert-deftest format-spec/function ()
+  (let* (called
+         (spec `((?a . "foo")
+                 (?f . ,(lambda ()
+                          (setq called t)
+                          "bar")))))
+    (should (equal (format-spec "%a" spec) "foo"))
+    (should-not called)
+    (should (equal (format-spec "%f" spec) "bar"))
+    (should called)))
+
 (ert-deftest format-spec-unknown ()
   (should-error (format-spec "foo %b %z zot" '((?b . "bar"))))
   (should-error (format-spec "foo %b %%%z zot" '((?b . "bar"))))
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-27  8:35                 ` Po Lu
@ 2022-09-27 18:33                   ` Stefan Kangas
  2022-09-28  0:34                     ` Po Lu
  0 siblings, 1 reply; 61+ messages in thread
From: Stefan Kangas @ 2022-09-27 18:33 UTC (permalink / raw)
  To: Po Lu, Thierry Volpiatto; +Cc: emacs-devel

Po Lu <luangruo@yahoo.com> writes:

> Thierry Volpiatto <thievol@posteo.net> writes:
>
>> Or to use xrandr directly if available.
>
> If a display is not available, what X server will the xrandr utility
> connect to?  And how will you ensure the X server that the xrandr
> utility connects to is correct?

Won't it just use whatever is in $DISPLAY?  I'm seeing this in
"emacs -Q -nw", running in an xterm:

  ELISP> (display-monitor-attributes-list)
  (((geometry 0 0 255 78)
    (workarea 0 0 255 78)
    (mm-size nil nil)
    (frames #<frame F1 0x55f85d4ed4d0>)))
  ELISP> (getenv "DISPLAY")
  ":0"
  ELISP> (shell-command "xrandr" t)
  293 (#o445, #x125)
  ELISP> Screen 0: minimum 8 x 8, current 2560 x 1440, maximum 16384 x 16384
  DVI-I-0 disconnected primary (normal left inverted right x axis y axis)
  DVI-I-1 connected 2560x1440+0+0 (normal left inverted right x axis y
axis) 597mm x 336mm
     2560x1440     59.95*+
     1920x1200     59.88
     1920x1080     60.00
     1680x1050     59.95
     1600x1200     60.00
     1280x1024     75.02    60.02
     1280x800      59.81
     1152x864      75.00
     1024x768      75.03    60.00
     800x600       75.00    60.32
     640x480       75.00    59.94
  HDMI-0 disconnected (normal left inverted right x axis y axis)
  DP-0 disconnected (normal left inverted right x axis y axis)
  DVI-D-0 disconnected (normal left inverted right x axis y axis)
  DP-1 disconnected (normal left inverted right x axis y axis)

So it seems like we could just look for "^\\([^ ]\\)+ connected" and
just use the first one?  If nothing else, couldn't we use it to get a
default value?



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-27 18:33                   ` Stefan Kangas
@ 2022-09-28  0:34                     ` Po Lu
  0 siblings, 0 replies; 61+ messages in thread
From: Po Lu @ 2022-09-28  0:34 UTC (permalink / raw)
  To: Stefan Kangas; +Cc: Thierry Volpiatto, emacs-devel

Stefan Kangas <stefankangas@gmail.com> writes:

> Won't it just use whatever is in $DISPLAY?  I'm seeing this in
> "emacs -Q -nw", running in an xterm:

Yes, but then you can do the same in Emacs:

  (x-open-connection (getenv "DISPLAY"))
  (display-monitor-attributes-list (car (last (terminal-list))))

and DISPLAY might not be set either.

>   ELISP> Screen 0: minimum 8 x 8, current 2560 x 1440, maximum 16384 x 16384
>   DVI-I-0 disconnected primary (normal left inverted right x axis y axis)
>   DVI-I-1 connected 2560x1440+0+0 (normal left inverted right x axis y
> axis) 597mm x 336mm
>      2560x1440     59.95*+
>      1920x1200     59.88
>      1920x1080     60.00
>      1680x1050     59.95
>      1600x1200     60.00
>      1280x1024     75.02    60.02
>      1280x800      59.81
>      1152x864      75.00
>      1024x768      75.03    60.00
>      800x600       75.00    60.32
>      640x480       75.00    59.94
>   HDMI-0 disconnected (normal left inverted right x axis y axis)
>   DP-0 disconnected (normal left inverted right x axis y axis)
>   DVI-D-0 disconnected (normal left inverted right x axis y axis)
>   DP-1 disconnected (normal left inverted right x axis y axis)
>
> So it seems like we could just look for "^\\([^ ]\\)+ connected" and
> just use the first one?  If nothing else, couldn't we use it to get a
> default value?

Well, then you run into the problem where the format of the texxt
returned by the XRandR utility is not exactly stable.

On servers supporting version 1.5 or later of the extension,

  xrandr --listmonitors

is also a better idea, as that is the kind of monitor XFCE will use.



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: Make format-spec accept a function as the substitution
  2022-09-27 18:02                         ` Make format-spec accept a function as the substitution Stefan Kangas
@ 2022-09-29  6:57                           ` Thierry Volpiatto
  2022-09-29 12:36                             ` Stefan Monnier
  0 siblings, 1 reply; 61+ messages in thread
From: Thierry Volpiatto @ 2022-09-29  6:57 UTC (permalink / raw)
  To: Stefan Kangas; +Cc: Eli Zaretskii, visuweshm, luangruo, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 2221 bytes --]


Hello Stefan,

Stefan Kangas <stefankangas@gmail.com> writes:

> Eli Zaretskii <eliz@gnu.org> writes:
>
>> And then I'd suggest something like
>>
>>   If the substitution for a specification character is a function, the
>>   function will be called only if FORMAT uses that character.
>
> Thanks.  Please find attached a complete patch with documentation.
>
> [2. text/x-diff; 0001-Make-format-spec-support-functions.patch]...

After thinking at it, it would be great to allow using interactive calls
in specs without wrapping them inside a function:

Using this should ask for line number and file:
(format-spec "Go to line %n in file %f %g" '((?n . (read-number "Number: "))
                                             (?g . "now")
                                             (?f . (read-file-name "File: "))))

Whereas using this should not ask for anything:
(format-spec "Go to line %g" '((?n . (read-number "Number: "))
                               (?g . "now")
                               (?f . (read-file-name "File: "))))


For this specs should be looked one by one and evaluated when needed,
here a naive version of format-spec that allow this (doesn't handle 0,
space, -_> etc..):

(defun tv/format-spec-1 (format spec)
  (cl-loop with fma = format
           with result
           for (char . val) in spec
           for target = (if (string-match "%\\([[:alpha:]]\\)" fma)
                            (string-to-char (match-string 1 fma))
                          fma)
           if (eq target char)
           return (eval val t)
           finally return target))

(defun tv/format-spec (format spec)
  (let (strs fmt-str)
    (with-temp-buffer
      (save-excursion
        (insert format))
      (setq strs (cl-loop while (re-search-forward "%\\([[:alpha:]]\\)" nil t)
                          collect (match-string 0)
                          do (replace-match "s" nil nil nil 1)))
      (setq fmt-str (buffer-string)))
    (apply #'format fmt-str
           (cl-loop for str in strs
                    collect (tv/format-spec-1 str spec)))))

Probably the idea handled by this code could be ported to format-spec?

-- 
Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 686 bytes --]

^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: Make format-spec accept a function as the substitution
  2022-09-29  6:57                           ` Thierry Volpiatto
@ 2022-09-29 12:36                             ` Stefan Monnier
  2022-09-29 12:59                               ` Stefan Kangas
                                                 ` (2 more replies)
  0 siblings, 3 replies; 61+ messages in thread
From: Stefan Monnier @ 2022-09-29 12:36 UTC (permalink / raw)
  To: Thierry Volpiatto
  Cc: Stefan Kangas, Eli Zaretskii, visuweshm, luangruo, emacs-devel

Thierry Volpiatto [2022-09-29 06:57:07] wrote:
> After thinking at it, it would be great to allow using interactive calls
> in specs without wrapping them inside a function:
>
> Using this should ask for line number and file:
> (format-spec "Go to line %n in file %f %g" '((?n . (read-number "Number: "))
>                                              (?g . "now")
>                                              (?f . (read-file-name "File: "))))

ELisp forms under a quote make me cringe.

Code should be quoted with `lambda` (which you run with `funcall` or
`apply`), not with `quote` (for which you need to use `eval`).

So we should aim for a source code of the form:

    (format-spec "Go to line %n in file %f %g"
                 `((?n . ,(λ () (read-number "Number: ")))
                   (?g . "now")
                   (?f . ,(λ () (read-file-name "File: ")))))


-- Stefan




^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: Make format-spec accept a function as the substitution
  2022-09-29 12:36                             ` Stefan Monnier
@ 2022-09-29 12:59                               ` Stefan Kangas
  2022-09-29 15:02                               ` Philip Kaludercic
  2022-09-29 15:09                               ` Thierry Volpiatto
  2 siblings, 0 replies; 61+ messages in thread
From: Stefan Kangas @ 2022-09-29 12:59 UTC (permalink / raw)
  To: Stefan Monnier, Thierry Volpiatto
  Cc: Eli Zaretskii, visuweshm, luangruo, emacs-devel

Stefan Monnier <monnier@iro.umontreal.ca> writes:

> Code should be quoted with `lambda` (which you run with `funcall` or
> `apply`), not with `quote` (for which you need to use `eval`).
>
> So we should aim for a source code of the form:
>
>     (format-spec "Go to line %n in file %f %g"
>                  `((?n . ,(λ () (read-number "Number: ")))
>                    (?g . "now")
>                    (?f . ,(λ () (read-file-name "File: ")))))

I agree, which is why that's what my patch does.



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: master fe7c015b20: Support XFCE in wallpaper.el
  2022-09-27  7:21           ` Thierry Volpiatto
  2022-09-27  7:42             ` Po Lu
  2022-09-27 13:57             ` Stefan Kangas
@ 2022-09-29 14:16             ` Stefan Kangas
  2 siblings, 0 replies; 61+ messages in thread
From: Stefan Kangas @ 2022-09-29 14:16 UTC (permalink / raw)
  To: Thierry Volpiatto; +Cc: Po Lu, emacs-devel

Thierry Volpiatto <thievol@posteo.net> writes:

> 1) The function wallpaper--format-arg is evaluating the format-specs each
> time it is called and when display-graphic-p returns nil, user is
> prompted for height and width at each call.

This should now be fixed (commit 5281946fbf and b71241742c).

> 2) display-monitor-attributes-list doesn't return the value of monitor:

I've installed a fix on master (commit 2c331dbb4e).  It works for me,
but any testing you could do would be appreciated.



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: Make format-spec accept a function as the substitution
  2022-09-29 12:36                             ` Stefan Monnier
  2022-09-29 12:59                               ` Stefan Kangas
@ 2022-09-29 15:02                               ` Philip Kaludercic
  2022-09-29 16:34                                 ` Stefan Kangas
  2022-09-29 16:56                                 ` Stefan Monnier
  2022-09-29 15:09                               ` Thierry Volpiatto
  2 siblings, 2 replies; 61+ messages in thread
From: Philip Kaludercic @ 2022-09-29 15:02 UTC (permalink / raw)
  To: Stefan Monnier
  Cc: Thierry Volpiatto, Stefan Kangas, Eli Zaretskii, visuweshm,
	luangruo, emacs-devel

Stefan Monnier <monnier@iro.umontreal.ca> writes:

> Thierry Volpiatto [2022-09-29 06:57:07] wrote:
>> After thinking at it, it would be great to allow using interactive calls
>> in specs without wrapping them inside a function:
>>
>> Using this should ask for line number and file:
>> (format-spec "Go to line %n in file %f %g" '((?n . (read-number "Number: "))
>>                                              (?g . "now")
>>                                              (?f . (read-file-name "File: "))))
>
> ELisp forms under a quote make me cringe.
>
> Code should be quoted with `lambda` (which you run with `funcall` or
> `apply`), not with `quote` (for which you need to use `eval`).
>
> So we should aim for a source code of the form:
>
>     (format-spec "Go to line %n in file %f %g"
>                  `((?n . ,(λ () (read-number "Number: ")))
>                    (?g . "now")
>                    (?f . ,(λ () (read-file-name "File: ")))))

Is there no worthwhile information to pass the lambda function?

(I like the λ notation by the way, would be nice to have a (defalias 'λ
#'lambda) in subr.el).

>
> -- Stefan



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: Make format-spec accept a function as the substitution
  2022-09-29 12:36                             ` Stefan Monnier
  2022-09-29 12:59                               ` Stefan Kangas
  2022-09-29 15:02                               ` Philip Kaludercic
@ 2022-09-29 15:09                               ` Thierry Volpiatto
  2022-09-29 16:34                                 ` Stefan Kangas
  2 siblings, 1 reply; 61+ messages in thread
From: Thierry Volpiatto @ 2022-09-29 15:09 UTC (permalink / raw)
  To: Stefan Monnier
  Cc: Stefan Kangas, Eli Zaretskii, visuweshm, luangruo, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 944 bytes --]


Stefan Monnier <monnier@iro.umontreal.ca> writes:

> Thierry Volpiatto [2022-09-29 06:57:07] wrote:
>> After thinking at it, it would be great to allow using interactive calls
>> in specs without wrapping them inside a function:
>>
>> Using this should ask for line number and file:
>> (format-spec "Go to line %n in file %f %g" '((?n . (read-number "Number: "))
>>                                              (?g . "now")
>>                                              (?f . (read-file-name "File: "))))
>
> ELisp forms under a quote make me cringe.
>
> Code should be quoted with `lambda` (which you run with `funcall` or
> `apply`), not with `quote` (for which you need to use `eval`).

Ok, that's what was proposed initially and is indeed probably the best,
however I was wondering if an implementation of format-spec not
evaluating the whole alist at once but only the needed specs would be
better.

-- 
Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 686 bytes --]

^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: Make format-spec accept a function as the substitution
  2022-09-29 15:09                               ` Thierry Volpiatto
@ 2022-09-29 16:34                                 ` Stefan Kangas
  0 siblings, 0 replies; 61+ messages in thread
From: Stefan Kangas @ 2022-09-29 16:34 UTC (permalink / raw)
  To: Thierry Volpiatto, Stefan Monnier
  Cc: Eli Zaretskii, visuweshm, luangruo, emacs-devel

Thierry Volpiatto <thievol@posteo.net> writes:

>> Code should be quoted with `lambda` (which you run with `funcall` or
>> `apply`), not with `quote` (for which you need to use `eval`).
>
> Ok, that's what was proposed initially and is indeed probably the best,
> however I was wondering if an implementation of format-spec not
> evaluating the whole alist at once but only the needed specs would be
> better.

We could do it with a new macro like `read-format-spec-lazy' of course,
but I'm not sure it's worth it.  Using a lambda seems easy enough.



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: Make format-spec accept a function as the substitution
  2022-09-29 15:02                               ` Philip Kaludercic
@ 2022-09-29 16:34                                 ` Stefan Kangas
  2022-09-29 16:53                                   ` Philip Kaludercic
  2022-09-29 16:56                                 ` Stefan Monnier
  1 sibling, 1 reply; 61+ messages in thread
From: Stefan Kangas @ 2022-09-29 16:34 UTC (permalink / raw)
  To: Philip Kaludercic, Stefan Monnier
  Cc: Thierry Volpiatto, Eli Zaretskii, visuweshm, luangruo,
	emacs-devel

Philip Kaludercic <philipk@posteo.net> writes:

> Is there no worthwhile information to pass the lambda function?

I don't know.  Any ideas?

> (I like the λ notation by the way, would be nice to have a (defalias 'λ
> #'lambda) in subr.el).

Isn't it better to do that with, e.g., `prettify-symbols-mode'?
It doesn't seem worth rewriting all the tooling to deal with λ
correctly.



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: Make format-spec accept a function as the substitution
  2022-09-29 16:34                                 ` Stefan Kangas
@ 2022-09-29 16:53                                   ` Philip Kaludercic
  2022-09-29 17:06                                     ` Stefan Kangas
  0 siblings, 1 reply; 61+ messages in thread
From: Philip Kaludercic @ 2022-09-29 16:53 UTC (permalink / raw)
  To: Stefan Kangas
  Cc: Stefan Monnier, Thierry Volpiatto, Eli Zaretskii, visuweshm,
	luangruo, emacs-devel

Stefan Kangas <stefankangas@gmail.com> writes:

> Philip Kaludercic <philipk@posteo.net> writes:
>
>> Is there no worthwhile information to pass the lambda function?
>
> I don't know.  Any ideas?

The best I can think of would be a number, indicating what %-spec is
being replaced?

>> (I like the λ notation by the way, would be nice to have a (defalias 'λ
>> #'lambda) in subr.el).
>
> Isn't it better to do that with, e.g., `prettify-symbols-mode'?
> It doesn't seem worth rewriting all the tooling to deal with λ
> correctly.

What tooling?  Isn't Elisp unicode compatible?



^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: Make format-spec accept a function as the substitution
  2022-09-29 15:02                               ` Philip Kaludercic
  2022-09-29 16:34                                 ` Stefan Kangas
@ 2022-09-29 16:56                                 ` Stefan Monnier
  1 sibling, 0 replies; 61+ messages in thread
From: Stefan Monnier @ 2022-09-29 16:56 UTC (permalink / raw)
  To: Philip Kaludercic
  Cc: Thierry Volpiatto, Stefan Kangas, Eli Zaretskii, visuweshm,
	luangruo, emacs-devel

>>     (format-spec "Go to line %n in file %f %g"
>>                  `((?n . ,(λ () (read-number "Number: ")))
>>                    (?g . "now")
>>                    (?f . ,(λ () (read-file-name "File: ")))))
>
> Is there no worthwhile information to pass the lambda function?

I was talking in very general terms, not specific to `format-spec`.
You'd need someone more knowledgeable about `format-spec` to answer
your question.

> (I like the λ notation by the way, would be nice to have a (defalias 'λ
> #'lambda) in subr.el).

I use `prettify-symbols-mode` :-)


        Stefan




^ permalink raw reply	[flat|nested] 61+ messages in thread

* Re: Make format-spec accept a function as the substitution
  2022-09-29 16:53                                   ` Philip Kaludercic
@ 2022-09-29 17:06                                     ` Stefan Kangas
  0 siblings, 0 replies; 61+ messages in thread
From: Stefan Kangas @ 2022-09-29 17:06 UTC (permalink / raw)
  To: Philip Kaludercic
  Cc: Stefan Monnier, Thierry Volpiatto, Eli Zaretskii, visuweshm,
	luangruo, emacs-devel

Philip Kaludercic <philipk@posteo.net> writes:

> What tooling?  Isn't Elisp unicode compatible?

Anywhere you look for "lambda" you now have to look for "λ", too.



^ permalink raw reply	[flat|nested] 61+ messages in thread

end of thread, other threads:[~2022-09-29 17:06 UTC | newest]

Thread overview: 61+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <166336105908.23797.12319380359602540227@vcs2.savannah.gnu.org>
     [not found] ` <20220916204419.B124FC00872@vcs2.savannah.gnu.org>
2022-09-17  2:00   ` master fe7c015b20: Support XFCE in wallpaper.el Po Lu
2022-09-17 18:03     ` Stefan Kangas
2022-09-18  1:18       ` Po Lu
2022-09-18  2:13         ` Po Lu
2022-09-18  4:48         ` Thierry Volpiatto
2022-09-18  5:15           ` Po Lu
2022-09-18 14:44             ` Thierry Volpiatto
2022-09-19  4:49               ` Po Lu
2022-09-19  6:06                 ` Thierry Volpiatto
2022-09-19  7:24                   ` Po Lu
2022-09-19  8:40                     ` Thierry Volpiatto
2022-09-19  8:52                       ` Po Lu
2022-09-19 17:46                         ` Thierry Volpiatto
2022-09-19 18:05                         ` Thierry Volpiatto
2022-09-19 18:59                           ` Stefan Kangas
2022-09-19 20:16                           ` Tomas Hlavaty
2022-09-19 21:19                             ` Stefan Monnier
2022-09-20  6:16                               ` Thierry Volpiatto
2022-09-20  2:32                             ` Eli Zaretskii
2022-09-20  2:43                               ` Po Lu
2022-09-20  6:25                                 ` Thierry Volpiatto
2022-09-20  8:22                                   ` Po Lu
2022-09-19  7:23                 ` Thierry Volpiatto
2022-09-26 19:42         ` Stefan Kangas
2022-09-26 21:01           ` Stephen Berman
2022-09-26 22:46             ` Stefan Kangas
2022-09-27  7:17               ` Stephen Berman
2022-09-27  7:45                 ` Po Lu
2022-09-27 13:42                   ` Stefan Kangas
2022-09-27  0:33             ` Po Lu
2022-09-27  5:56           ` Eli Zaretskii
2022-09-27  6:13             ` Po Lu
2022-09-27  6:45               ` Eli Zaretskii
2022-09-27  7:50                 ` Po Lu
2022-09-27  7:56                   ` Eli Zaretskii
2022-09-27  8:31                     ` Po Lu
2022-09-27  7:21           ` Thierry Volpiatto
2022-09-27  7:42             ` Po Lu
2022-09-27  7:55               ` Thierry Volpiatto
2022-09-27  8:35                 ` Po Lu
2022-09-27 18:33                   ` Stefan Kangas
2022-09-28  0:34                     ` Po Lu
2022-09-27 13:57             ` Stefan Kangas
2022-09-27 15:43               ` Visuwesh
2022-09-27 16:19                 ` Stefan Kangas
2022-09-27 16:39                   ` Thierry Volpiatto
2022-09-27 16:40                   ` Eli Zaretskii
2022-09-27 17:01                     ` Stefan Kangas
2022-09-27 17:14                       ` Eli Zaretskii
2022-09-27 18:02                         ` Make format-spec accept a function as the substitution Stefan Kangas
2022-09-29  6:57                           ` Thierry Volpiatto
2022-09-29 12:36                             ` Stefan Monnier
2022-09-29 12:59                               ` Stefan Kangas
2022-09-29 15:02                               ` Philip Kaludercic
2022-09-29 16:34                                 ` Stefan Kangas
2022-09-29 16:53                                   ` Philip Kaludercic
2022-09-29 17:06                                     ` Stefan Kangas
2022-09-29 16:56                                 ` Stefan Monnier
2022-09-29 15:09                               ` Thierry Volpiatto
2022-09-29 16:34                                 ` Stefan Kangas
2022-09-29 14:16             ` master fe7c015b20: Support XFCE in wallpaper.el Stefan Kangas

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).