file report here > http://bugzilla.gnome.org/browse.cgi?product=libgnome

[]s
--
Regards,
+--------------------------------------------+
Jorge Pereira,
Blog: http://blog.jorgepereira.com.br/
GPG-Key-ID: 1024D/EC6FB924
+--------------------------------------------+


On Wed, Jul 8, 2009 at 12:50 PM, Adam Jackson <[email protected]> wrote:

> Some monitors have names longer than 13 bytes, and thus need multiple
> name records.
> ---
>  libgnome-desktop/edid-parse.c      |   50
> ++++++++++++++++++++++++++++++------
>  libgnome-desktop/edid.h            |    7 +++--
>  libgnome-desktop/gnome-rr-config.c |    2 +-
>  3 files changed, 47 insertions(+), 12 deletions(-)
>
> diff --git a/libgnome-desktop/edid-parse.c b/libgnome-desktop/edid-parse.c
> index 225778a..f7daa7f 100644
> --- a/libgnome-desktop/edid-parse.c
> +++ b/libgnome-desktop/edid-parse.c
> @@ -349,27 +349,47 @@ decode_standard_timings (const uchar *edid,
> MonitorInfo *info)
>     return TRUE;
>  }
>
> -static void
> -decode_lf_string (const uchar *s, int n_chars, char *result)
> +static char *
> +decode_lf_string (const uchar *s, int n_chars, char *prev)
>  {
>     int i;
> +    char *ret, *tmp;
> +
> +    tmp = g_malloc0(n_chars);
> +
> +    if (!tmp)
> +       return prev;
> +
>     for (i = 0; i < n_chars; ++i)
>     {
>        if (s[i] == 0x0a)
>        {
> -           *result++ = '\0';
> +           tmp[i] = '\0';
>            break;
>        }
>        else if (s[i] == 0x00)
>        {
>            /* Convert embedded 0's to spaces */
> -           *result++ = ' ';
> +           tmp[i] = ' ';
>        }
>        else
>        {
> -           *result++ = s[i];
> +           tmp[i] = s[i];
>        }
>     }
> +
> +    if (prev)
> +    {
> +       ret = g_strjoin(NULL, prev, tmp, NULL);
> +       g_free(prev);
> +       g_free(tmp);
> +    }
> +    else
> +    {
> +       ret = tmp;
> +    }
> +
> +    return ret;
>  }
>
>  static void
> @@ -379,13 +399,15 @@ decode_display_descriptor (const uchar *desc,
>     switch (desc[0x03])
>     {
>     case 0xFC:
> -       decode_lf_string (desc + 5, 13, info->dsc_product_name);
> +       info->dsc_product_name = decode_lf_string (desc + 5, 13,
> +                                                  info->dsc_product_name);
>        break;
>     case 0xFF:
> -       decode_lf_string (desc + 5, 13, info->dsc_serial_number);
> +       info->dsc_serial_number = decode_lf_string (desc + 5, 13,
> +
> info->dsc_serial_number);
>        break;
>     case 0xFE:
> -       decode_lf_string (desc + 5, 13, info->dsc_string);
> +       info->dsc_string = decode_lf_string (desc + 5, 13,
> info->dsc_string);
>        break;
>     case 0xFD:
>        /* Range Limits */
> @@ -514,6 +536,18 @@ decode_check_sum (const uchar *edid,
>     info->checksum = check;
>  }
>
> +void
> +free_edid (MonitorInfo *info)
> +{
> +    if (info)
> +    {
> +       g_free (info->dsc_product_name);
> +       g_free (info->dsc_serial_number);
> +       g_free (info->dsc_string);
> +    }
> +    g_free (info);
> +}
> +
>  MonitorInfo *
>  decode_edid (const uchar *edid)
>  {
> diff --git a/libgnome-desktop/edid.h b/libgnome-desktop/edid.h
> index 3b4e338..ffa9064 100644
> --- a/libgnome-desktop/edid.h
> +++ b/libgnome-desktop/edid.h
> @@ -183,12 +183,13 @@ struct MonitorInfo
>                                                 */
>
>     /* Optional product description */
> -    char               dsc_serial_number[14];
> -    char               dsc_product_name[14];
> -    char               dsc_string[14];         /* Unspecified ASCII data
> */
> +    char               *dsc_serial_number;
> +    char               *dsc_product_name;
> +    char               *dsc_string;            /* Unspecified ASCII data
> */
>  };
>
>  MonitorInfo *decode_edid (const uchar *data);
> +void free_edid (MonitorInfo *info);
>  char *       make_display_name (const char        *output_name,
>                                const MonitorInfo *info);
>
> diff --git a/libgnome-desktop/gnome-rr-config.c
> b/libgnome-desktop/gnome-rr-config.c
> index 900f144..8c3b233 100644
> --- a/libgnome-desktop/gnome-rr-config.c
> +++ b/libgnome-desktop/gnome-rr-config.c
> @@ -491,7 +491,7 @@ gnome_rr_config_new_current (GnomeRRScreen *screen)
>            output->display_name = make_display_name (
>                gnome_rr_output_get_name (rr_output), info);
>
> -           g_free (info);
> +           free_edid (info);
>
>            crtc = gnome_rr_output_get_crtc (rr_output);
>            mode = crtc? gnome_rr_crtc_get_current_mode (crtc) : NULL;
> --
> 1.6.2.2
>
> _______________________________________________
> desktop-devel-list mailing list
> [email protected]
> http://mail.gnome.org/mailman/listinfo/desktop-devel-list
>
_______________________________________________
desktop-devel-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/desktop-devel-list

Reply via email to