[Libdlo] Equivalent for $DISPLAY

Bernie Thompson bernie at berniethompson.com
Sun May 24 15:40:41 PDT 2009


Hi Phil,

In general, I like the idea of replacing find_first_device with this
more deterministic claim_first_device.  Thanks so much, Phil for
coding this up to make it easy to evaluate.

Any comments from anyone else on the command line format and/or
general precedents for users to configure their devices in a situation
like this (e.g. where many apps may share many display devices)?

Thanks!
Bernie

On Sat, May 23, 2009 at 10:00 AM, Phil Endecott
<spam_from_libdlo at chezphil.org> wrote:
> Phil Endecott wrote:
>> Dear All,
>>
>> libdlo provides a convenient function, dlo_claim_first_device(), to get
>> the first attached device.  This is great if you only have one device
>> connected.  But there's a danger that we'll end up with utilities that
>> call this and so cannot be made to work on systems with more than one
>> device attached.
>>
>> I'd like to propose that we remove dlo_claim_first_device() and instead
>> provide something like dlo_claim_default_device().  This will behave
>> like X applications and check for an environment variable or
>> command-line option that specifies the device to use, and will fall
>> back to the first unclaimed device if nothing else is specified.
>
> Here is a proposal for discussion.  The command-line option is
> --dlo:display=serialnumber; this is inspired by the way that DirectFB apps
> take various --dfb:something options.  Like DirectFB we could add options
> for things like the screen mode, compression settings and so on.  Requiring
> that the serial number is joined to the option with an = rather than being
> a separate token makes it possible to skip all --dlo:* options without
> knowing whether they take an argument; on the other hand, it's less
> consistent with X's -display.  The environment variable is DLODISPLAY.
>
> I haven't thought any more about how displays are identified; for now this
> just matches the serial number, but I believe we probably want something
> better than that.
>
> I'm unsure how this should interact with the claimed/unclaimed stuff, i.e.
> if the specified display is already claimed should it fail or choose the next
> one?  This gets more complicated if the display spec is something that could
> match multiple devices.
>
> Thoughts?
>
> Phil.
>
> ---
>
> index 12e6f33..1810cb5 100644
> --- a/src/libdlo.c
> +++ b/src/libdlo.c
> @@ -467,8 +467,48 @@ error:
>  }
>
>
> -dlo_dev_t dlo_claim_first_device(const dlo_claim_t flags, const uint32_t timeout)
> +static const char* parse_cmdline(int *argc_p, char *argv[])
>  {
> +  /* Scan the command line looking for --dlo:display.  Return the value found, if
> +   * any, else return NULL.  Remove all --dlo:* options from argv.
> +   */
> +
> +  const char *display = NULL;
> +  int n;
> +  int m = 1;
> +
> +  if (!argc_p) {
> +    return NULL;
> +  }
> +
> +  for (n=1; n<*argc_p; ++n) {
> +    const char* arg = argv[n];
> +    if (strncmp(arg,"--dlo:",6)==0) {
> +      const char* dlo_arg = arg + 6;
> +      if (strncmp(dlo_arg,"display=",8)==0) {
> +        display = dlo_arg + 8;
> +      }
> +    } else {
> +      argv[m] = arg;
> +      ++m;
> +    }
> +  }
> +  *argc_p = m;
> +  return display;
> +}
> +
> +dlo_dev_t dlo_claim_default_device(int *argc_p, char *argv[],
> +                                   const dlo_claim_t flags, const uint32_t timeout)
> +{
> +  const char *display = parse_cmdline(argc_p, argv);
> +  if (!display) {
> +    display = getenv("DLODISPLAY");
> +  }
> +
> +  // For now, assume that display is simply the serial number.  Some thought about
> +  // exactly what its format should be is needed.
> +  const char *serial = display;
> +
>   dlo_devlist_t *node;
>   dlo_devlist_t *next;
>   dlo_dev_t      uid = 0;
> @@ -481,7 +521,8 @@ dlo_dev_t dlo_claim_first_device(const dlo_claim_t flags, const uint32_t timeout
>   {
>     dlo_device_t *dev = (dlo_device_t *)node->dev.uid;
>
> -    if (!uid && !dev->claimed)
> +    if (!uid && !dev->claimed
> +        && (!serial || strcmp(serial,dev->serial)==0))
>     {
>       uid = dlo_claim_device(node->dev.uid, flags, timeout);
>     }
> diff --git a/src/libdlo.h b/src/libdlo.h
> index 1b8de1c..282fa8e 100644
> --- a/src/libdlo.h
> +++ b/src/libdlo.h
> @@ -604,22 +604,31 @@ extern dlo_devlist_t *dlo_enumerate_devices(void);
>  extern dlo_dev_t dlo_claim_device(const dlo_dev_t uid, const dlo_claim_t flags, const uint32_t timeout);
>
>
> -/** Claim the first available (unclaimed) device.
> +/** Claim the default device.
>  *
> + *  @param  argc_p   Pointer to main program's argc.
> + *  @param  argv     Main program's argv.
>  *  @param  flags    Flags word describing how the device is to be accessed.
>  *  @param  timeout  Timeout in milliseconds (zero for infinite).
>  *
>  *  @return  Unique ID of the claimed device (or NULL if failed).
>  *
> - *  This call performs a very similar function to @c dlo_claim_device() except
> - *  that it performs the enumeration of connected devices on behalf of the caller
> - *  and returns the unique ID of the first available (unclaimed device). This
> - *  device is claimed automatically.
> + *  This call enumerates the connected devices and returns the unique ID of the default
> + *  device.  The default device is selected by the DLODISPLAY environment variable or the
> + *  --dlo:display command-line option; if neither is specified the first device found is
> + *  selected.  This selected device is claimed.
>  *
> - *  If no unclaimed devices are found, or if the claim operation itself fails in
> - *  some way, the function will return a device handle of zero.
> + *  If no default device is found, or if the claim operation fails, the function will
> + *  return a device handle of zero.
> + *
> + *  The main program should pass a pointer to argc and argv to this function so that any
> + *  --dlo:display option can be found.  This function will update argc and argv to remove
> + *  any --dlo:* options that it finds, so the main program need not worry about the
> + *  presence of these options in the command line if it calls this function first.
> + *  Pass NULL as argc_p to disable command-line parsing.
>  */
> -extern dlo_dev_t dlo_claim_first_device(const dlo_claim_t flags, const uint32_t timeout);
> +extern dlo_dev_t dlo_claim_default_device(int *argc_p, char *argv[],
> +                                          const dlo_claim_t flags, const uint32_t timeout);
>
>
>  /** Release the specified device.
>
>
>
>
> _______________________________________________
> Libdlo mailing list
> Libdlo at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/libdlo
>


More information about the Libdlo mailing list