Patch 7.4.2089
Problem:    Color handling of X11 GUIs is too complicated.
Solution:   Simplify the code.  Use RGBA where appropriate. (Kazunobu
            Kuriyama)
Files:      src/gui.h, src/gui_beval.c, src/gui_gtk_x11.c, src/netbeans.c


*** ../vim-7.4.2088/src/gui.h   2016-03-19 22:11:47.436674835 +0100
--- src/gui.h   2016-07-21 21:46:49.941821567 +0200
***************
*** 380,388 ****
--- 380,394 ----
      GtkWidget *menubar_h;         /* menubar handle */
      GtkWidget *toolbar_h;         /* toolbar handle */
  # endif
+ # ifdef USE_GTK3
+     GdkRGBA   *fgcolor;           /* GDK-styled foreground color */
+     GdkRGBA   *bgcolor;           /* GDK-styled background color */
+     GdkRGBA   *spcolor;           /* GDK-styled special color */
+ # else
      GdkColor  *fgcolor;           /* GDK-styled foreground color */
      GdkColor  *bgcolor;           /* GDK-styled background color */
      GdkColor  *spcolor;           /* GDK-styled special color */
+ # endif
  # ifdef USE_GTK3
      cairo_surface_t *surface;       /* drawarea surface */
      gboolean       by_signal;     /* cause of draw operation */
*** ../vim-7.4.2088/src/gui_beval.c     2016-06-04 17:40:59.686126379 +0200
--- src/gui_beval.c     2016-07-21 21:46:49.941821567 +0200
***************
*** 1044,1050 ****
--- 1044,1055 ----
        attrentry_T     *aep;
        PangoAttribute  *attr;
        guicolor_T      pixel;
+ #if GTK_CHECK_VERSION(3,0,0)
+       GdkRGBA         color = { 0.0, 0.0, 0.0, 1.0 };
+       PangoAttribute  *attr_alpha;
+ #else
        GdkColor        color = { 0, 0, 0, 0 };
+ #endif
  
        /* Look up the RGB values of the SpecialKey foreground color. */
        aep = syn_gui_attr2entry(hl_attr(HLF_8));
***************
*** 1052,1081 ****
        if (pixel != INVALCOLOR)
  # if GTK_CHECK_VERSION(3,0,0)
        {
!           GdkVisual * const visual = gtk_widget_get_visual(gui.drawarea);
! 
!           if (visual == NULL)
!           {
!               color.red = 0;
!               color.green = 0;
!               color.blue = 0;
!           }
!           else
!           {
!               guint32 r_mask, g_mask, b_mask;
!               gint r_shift, g_shift, b_shift;
! 
!               gdk_visual_get_red_pixel_details(visual, &r_mask, &r_shift,
!                                                NULL);
!               gdk_visual_get_green_pixel_details(visual, &g_mask, &g_shift,
!                                                  NULL);
!               gdk_visual_get_blue_pixel_details(visual, &b_mask, &b_shift,
!                                                 NULL);
! 
!               color.red = ((pixel & r_mask) >> r_shift) / 255.0 * 65535;
!               color.green = ((pixel & g_mask) >> g_shift) / 255.0 * 65535;
!               color.blue = ((pixel & b_mask) >> b_shift) / 255.0 * 65535;
!           }
        }
  # else
            gdk_colormap_query_color(gtk_widget_get_colormap(gui.drawarea),
--- 1057,1066 ----
        if (pixel != INVALCOLOR)
  # if GTK_CHECK_VERSION(3,0,0)
        {
!           color.red = ((pixel & 0xff0000) >> 16) / 255.0;
!           color.green = ((pixel & 0xff00) >> 8) / 255.0;
!           color.blue = (pixel & 0xff) / 255.0;
!           color.alpha = 1.0;
        }
  # else
            gdk_colormap_query_color(gtk_widget_get_colormap(gui.drawarea),
***************
*** 1124,1134 ****
--- 1109,1135 ----
                    }
                    if (pixel != INVALCOLOR)
                    {
+ #if GTK_CHECK_VERSION(3,0,0)
+ # define DOUBLE2UINT16(val) ((guint16)((val) * 65535 + 0.5))
+                       attr = pango_attr_foreground_new(
+                               DOUBLE2UINT16(color.red),
+                               DOUBLE2UINT16(color.green),
+                               DOUBLE2UINT16(color.blue));
+                       attr_alpha = pango_attr_foreground_alpha_new(
+                               DOUBLE2UINT16(color.alpha));
+ # undef DOUBLE2UINT16
+ #else
                        attr = pango_attr_foreground_new(
                                color.red, color.green, color.blue);
+ #endif
                        attr->start_index = pdest - buf;
                        attr->end_index   = pdest - buf + outlen;
                        pango_attr_list_insert(attr_list, attr);
+ #if GTK_CHECK_VERSION(3,0,0)
+                       attr_alpha->start_index = pdest - buf;
+                       attr_alpha->end_index   = pdest - buf + outlen;
+                       pango_attr_list_insert(attr_list, attr_alpha);
+ #endif
                    }
                    pdest += outlen;
                    p += charlen;
*** ../vim-7.4.2088/src/gui_gtk_x11.c   2016-07-15 17:49:53.211486136 +0200
--- src/gui_gtk_x11.c   2016-07-21 21:46:49.945821525 +0200
***************
*** 2865,2872 ****
      GdkPixmap *blank_mask;
  #endif
      GdkCursor *cursor;
      GdkColor  color = { 0, 0, 0, 0 };
- #if !GTK_CHECK_VERSION(3,0,0)
      char      blank_data[] = { 0x0 };
  #endif
  
--- 2865,2874 ----
      GdkPixmap *blank_mask;
  #endif
      GdkCursor *cursor;
+ #if GTK_CHECK_VERSION(3,0,0)
+     GdkRGBA   color = { 0.0, 0.0, 0.0, 1.0 };
+ #else
      GdkColor  color = { 0, 0, 0, 0 };
      char      blank_data[] = { 0x0 };
  #endif
  
***************
*** 2892,2901 ****
        surf = cairo_image_surface_create(CAIRO_FORMAT_A1, 1, 1);
        cr = cairo_create(surf);
  
!       cairo_set_source_rgb(cr,
!                            color.red / 65535.0,
!                            color.green / 65535.0,
!                            color.blue / 65535.0);
        cairo_rectangle(cr, 0, 0, 1, 1);
        cairo_fill(cr);
        cairo_destroy(cr);
--- 2894,2904 ----
        surf = cairo_image_surface_create(CAIRO_FORMAT_A1, 1, 1);
        cr = cairo_create(surf);
  
!       cairo_set_source_rgba(cr,
!                            color.red,
!                            color.green,
!                            color.blue,
!                            color.alpha);
        cairo_rectangle(cr, 0, 0, 1, 1);
        cairo_fill(cr);
        cairo_destroy(cr);
***************
*** 3824,3835 ****
--- 3827,3844 ----
      gui.border_width = 2;
      gui.scrollbar_width = SB_DEFAULT_WIDTH;
      gui.scrollbar_height = SB_DEFAULT_WIDTH;
+ #if GTK_CHECK_VERSION(3,0,0)
+     gui.fgcolor = g_new(GdkRGBA, 1);
+     gui.bgcolor = g_new(GdkRGBA, 1);
+     gui.spcolor = g_new(GdkRGBA, 1);
+ #else
      /* LINTED: avoid warning: conversion to 'unsigned long' */
      gui.fgcolor = g_new0(GdkColor, 1);
      /* LINTED: avoid warning: conversion to 'unsigned long' */
      gui.bgcolor = g_new0(GdkColor, 1);
      /* LINTED: avoid warning: conversion to 'unsigned long' */
      gui.spcolor = g_new0(GdkColor, 1);
+ #endif
  
      /* Initialise atoms */
      html_atom = gdk_atom_intern("text/html", FALSE);
***************
*** 4344,4406 ****
  #endif /* FEAT_GUI_GNOME && FEAT_SESSION */
  
  #if GTK_CHECK_VERSION(3,0,0)
!     static void
! gui_gtk_get_rgb_from_pixel(guint32 pixel, GdkRGBA *result)
  {
!     GdkVisual * const visual = gtk_widget_get_visual(gui.drawarea);
!     guint32 r_mask, g_mask, b_mask;
!     gint r_shift, g_shift, b_shift;
! 
!     if (visual == NULL)
!     {
!       result->red = 0.0;
!       result->green = 0.0;
!       result->blue = 0.0;
!       result->alpha = 0.0;
!       return;
!     }
! 
!     gdk_visual_get_red_pixel_details(visual, &r_mask, &r_shift, NULL);
!     gdk_visual_get_green_pixel_details(visual, &g_mask, &g_shift, NULL);
!     gdk_visual_get_blue_pixel_details(visual, &b_mask, &b_shift, NULL);
! 
!     result->red = ((pixel & r_mask) >> r_shift) / 255.0;
!     result->green = ((pixel & g_mask) >> g_shift) / 255.0;
!     result->blue = ((pixel & b_mask) >> b_shift) / 255.0;
!     result->alpha = 1.0;
! }
! 
! /* Convert a GdRGBA into a pixel value using drawarea's visual */
!     static guint32
! gui_gtk_get_pixel_from_rgb(const GdkRGBA *rgba)
! {
!     GdkVisual * const visual = gtk_widget_get_visual(gui.drawarea);
!     guint32 r_mask, g_mask, b_mask;
!     gint r_shift, g_shift, b_shift;
!     guint32 r, g, b;
! 
!     if (visual == NULL)
!       return 0;
! 
!     gdk_visual_get_red_pixel_details(visual, &r_mask, &r_shift, NULL);
!     gdk_visual_get_green_pixel_details(visual, &g_mask, &g_shift, NULL);
!     gdk_visual_get_blue_pixel_details(visual, &b_mask, &b_shift, NULL);
! 
!     r = rgba->red * 65535;
!     g = rgba->green * 65535;
!     b = rgba->blue * 65535;
! 
!     return ((r << r_shift) & r_mask) |
!          ((g << g_shift) & g_mask) |
!          ((b << b_shift) & b_mask);
  }
  
      static void
! set_cairo_source_rgb_from_pixel(cairo_t *cr, guint32 pixel)
  {
!     GdkRGBA result;
!     gui_gtk_get_rgb_from_pixel(pixel, &result);
!     cairo_set_source_rgb(cr, result.red, result.green, result.blue);
  }
  #endif /* GTK_CHECK_VERSION(3,0,0) */
  
--- 4353,4374 ----
  #endif /* FEAT_GUI_GNOME && FEAT_SESSION */
  
  #if GTK_CHECK_VERSION(3,0,0)
!     static GdkRGBA
! color_to_rgba(guicolor_T color)
  {
!     GdkRGBA rgba;
!     rgba.red   = ((color & 0xff0000) >> 16) / 255.0;
!     rgba.green = ((color & 0xff00) >> 8) / 255.0;
!     rgba.blue  = ((color & 0xff)) / 255.0;
!     rgba.alpha = 1.0;
!     return rgba;
  }
  
      static void
! set_cairo_source_rgba_from_color(cairo_t *cr, guicolor_T color)
  {
!     const GdkRGBA rgba = color_to_rgba(color);
!     cairo_set_source_rgba(cr, rgba.red, rgba.green, rgba.blue, rgba.alpha);
  }
  #endif /* GTK_CHECK_VERSION(3,0,0) */
  
***************
*** 4421,4439 ****
  #endif
      {
  #if GTK_CHECK_VERSION(3,4,0)
!       GdkRGBA color;
  
!       gui_gtk_get_rgb_from_pixel(gui.back_pixel, &color);
        {
            cairo_pattern_t * const pat = cairo_pattern_create_rgba(
!                   color.red, color.green, color.blue, color.alpha);
            if (pat != NULL)
            {
                gdk_window_set_background_pattern(da_win, pat);
                cairo_pattern_destroy(pat);
            }
            else
!               gdk_window_set_background_rgba(da_win, &color);
        }
  #else /* !GTK_CHECK_VERSION(3,4,0) */
        GdkColor color = { 0, 0, 0, 0 };
--- 4389,4407 ----
  #endif
      {
  #if GTK_CHECK_VERSION(3,4,0)
!       GdkRGBA rgba;
  
!       rgba = color_to_rgba(gui.back_pixel);
        {
            cairo_pattern_t * const pat = cairo_pattern_create_rgba(
!                   rgba.red, rgba.green, rgba.blue, rgba.alpha);
            if (pat != NULL)
            {
                gdk_window_set_background_pattern(da_win, pat);
                cairo_pattern_destroy(pat);
            }
            else
!               gdk_window_set_background_rgba(da_win, &rgba);
        }
  #else /* !GTK_CHECK_VERSION(3,4,0) */
        GdkColor color = { 0, 0, 0, 0 };
***************
*** 5518,5610 ****
  }
  
  /*
!  * Return the Pixel value (color) for the given color name.  This routine was
!  * pretty much taken from example code in the Silicon Graphics OSF/Motif
!  * Programmer's Guide.
   * Return INVALCOLOR for error.
   */
      guicolor_T
  gui_mch_get_color(char_u *name)
  {
-     /* A number of colors that some X11 systems don't have */
-     static const char *const vimnames[][2] =
-     {
-       {"LightRed",    "#FFBBBB"},
-       {"LightGreen",  "#88FF88"},
-       {"LightMagenta","#FFBBFF"},
-       {"DarkCyan",    "#008888"},
-       {"DarkBlue",    "#0000BB"},
-       {"DarkRed",     "#BB0000"},
-       {"DarkMagenta", "#BB00BB"},
-       {"DarkGrey",    "#BBBBBB"},
-       {"DarkYellow",  "#BBBB00"},
-       {"Gray10",      "#1A1A1A"},
-       {"Grey10",      "#1A1A1A"},
-       {"Gray20",      "#333333"},
-       {"Grey20",      "#333333"},
-       {"Gray30",      "#4D4D4D"},
-       {"Grey30",      "#4D4D4D"},
-       {"Gray40",      "#666666"},
-       {"Grey40",      "#666666"},
-       {"Gray50",      "#7F7F7F"},
-       {"Grey50",      "#7F7F7F"},
-       {"Gray60",      "#999999"},
-       {"Grey60",      "#999999"},
-       {"Gray70",      "#B3B3B3"},
-       {"Grey70",      "#B3B3B3"},
-       {"Gray80",      "#CCCCCC"},
-       {"Grey80",      "#CCCCCC"},
-       {"Gray90",      "#E5E5E5"},
-       {"Grey90",      "#E5E5E5"},
-       {NULL, NULL}
-     };
- 
      if (!gui.in_use)          /* can't do this when GUI not running */
        return INVALCOLOR;
  
-     while (name != NULL)
-     {
  #if GTK_CHECK_VERSION(3,0,0)
!       GdkRGBA     color;
  #else
!       GdkColor    color;
! #endif
!       int         parsed;
!       int         i;
  
! #if GTK_CHECK_VERSION(3,0,0)
!       parsed = gdk_rgba_parse(&color, (const gchar *)name);
! #else
!       parsed = gdk_color_parse((const char *)name, &color);
! #endif
  
!       if (parsed)
!       {
! #if GTK_CHECK_VERSION(3,0,0)
!           return (guicolor_T)gui_gtk_get_pixel_from_rgb(&color);
! #else
!           gdk_colormap_alloc_color(gtk_widget_get_colormap(gui.drawarea),
!                                    &color, FALSE, TRUE);
!           return (guicolor_T)color.pixel;
! #endif
!       }
!       /* add a few builtin names and try again */
!       for (i = 0; ; ++i)
!       {
!           if (vimnames[i][0] == NULL)
!           {
!               name = NULL;
!               break;
!           }
!           if (STRICMP(name, vimnames[i][0]) == 0)
!           {
!               name = (char_u *)vimnames[i][1];
!               break;
!           }
!       }
!     }
  
!     return INVALCOLOR;
  }
  
  /*
--- 5486,5521 ----
  }
  
  /*
!  * Return the Pixel value (color) for the given color name.
!  *
   * Return INVALCOLOR for error.
   */
      guicolor_T
  gui_mch_get_color(char_u *name)
  {
      if (!gui.in_use)          /* can't do this when GUI not running */
        return INVALCOLOR;
  
  #if GTK_CHECK_VERSION(3,0,0)
!     return name != NULL ? gui_get_color_cmn(name) : INVALCOLOR;
  #else
!     guicolor_T color;
!     GdkColor gcolor;
!     int ret;
  
!     color = (name != NULL) ? gui_get_color_cmn(name) : INVALCOLOR;
!     if (color == INVALCOLOR)
!       return INVALCOLOR;
  
!     gcolor.red = (guint16)(((color & 0xff0000) >> 16) / 255.0 * 65535 + 0.5);
!     gcolor.green = (guint16)(((color & 0xff00) >> 8) / 255.0 * 65535 + 0.5);
!     gcolor.blue = (guint16)((color & 0xff) / 255.0 * 65535 + 0.5);
  
!     ret = gdk_colormap_alloc_color(gtk_widget_get_colormap(gui.drawarea),
!           &gcolor, FALSE, TRUE);
! 
!     return ret != 0 ? (guicolor_T)gcolor.pixel : INVALCOLOR;
! #endif
  }
  
  /*
***************
*** 5613,5619 ****
--- 5524,5534 ----
      void
  gui_mch_set_fg_color(guicolor_T color)
  {
+ #if GTK_CHECK_VERSION(3,0,0)
+     *gui.fgcolor = color_to_rgba(color);
+ #else
      gui.fgcolor->pixel = (unsigned long)color;
+ #endif
  }
  
  /*
***************
*** 5622,5628 ****
--- 5537,5547 ----
      void
  gui_mch_set_bg_color(guicolor_T color)
  {
+ #if GTK_CHECK_VERSION(3,0,0)
+     *gui.bgcolor = color_to_rgba(color);
+ #else
      gui.bgcolor->pixel = (unsigned long)color;
+ #endif
  }
  
  /*
***************
*** 5631,5637 ****
--- 5550,5560 ----
      void
  gui_mch_set_sp_color(guicolor_T color)
  {
+ #if GTK_CHECK_VERSION(3,0,0)
+     *gui.spcolor = color_to_rgba(color);
+ #else
      gui.spcolor->pixel = (unsigned long)color;
+ #endif
  }
  
  /*
***************
*** 5792,5798 ****
      if (!(flags & DRAW_TRANSP))
      {
  #if GTK_CHECK_VERSION(3,0,0)
!       set_cairo_source_rgb_from_pixel(cr, gui.bgcolor->pixel);
        cairo_rectangle(cr,
                        FILL_X(col), FILL_Y(row),
                        num_cells * gui.char_width, gui.char_height);
--- 5715,5723 ----
      if (!(flags & DRAW_TRANSP))
      {
  #if GTK_CHECK_VERSION(3,0,0)
!       cairo_set_source_rgba(cr,
!               gui.bgcolor->red, gui.bgcolor->green, gui.bgcolor->blue,
!               gui.bgcolor->alpha);
        cairo_rectangle(cr,
                        FILL_X(col), FILL_Y(row),
                        num_cells * gui.char_width, gui.char_height);
***************
*** 5811,5817 ****
      }
  
  #if GTK_CHECK_VERSION(3,0,0)
!     set_cairo_source_rgb_from_pixel(cr, gui.fgcolor->pixel);
      cairo_move_to(cr, TEXT_X(col), TEXT_Y(row));
      pango_cairo_show_glyph_string(cr, font, glyphs);
  #else
--- 5736,5744 ----
      }
  
  #if GTK_CHECK_VERSION(3,0,0)
!     cairo_set_source_rgba(cr,
!           gui.fgcolor->red, gui.fgcolor->green, gui.fgcolor->blue,
!           gui.fgcolor->alpha);
      cairo_move_to(cr, TEXT_X(col), TEXT_Y(row));
      pango_cairo_show_glyph_string(cr, font, glyphs);
  #else
***************
*** 5829,5835 ****
      if ((flags & DRAW_BOLD) && !gui.font_can_bold)
  #if GTK_CHECK_VERSION(3,0,0)
      {
!       set_cairo_source_rgb_from_pixel(cr, gui.fgcolor->pixel);
        cairo_move_to(cr, TEXT_X(col) + 1, TEXT_Y(row));
        pango_cairo_show_glyph_string(cr, font, glyphs);
      }
--- 5756,5764 ----
      if ((flags & DRAW_BOLD) && !gui.font_can_bold)
  #if GTK_CHECK_VERSION(3,0,0)
      {
!       cairo_set_source_rgba(cr,
!               gui.fgcolor->red, gui.fgcolor->green, gui.fgcolor->blue,
!               gui.fgcolor->alpha);
        cairo_move_to(cr, TEXT_X(col) + 1, TEXT_Y(row));
        pango_cairo_show_glyph_string(cr, font, glyphs);
      }
***************
*** 5865,5871 ****
  #if GTK_CHECK_VERSION(3,0,0)
        cairo_set_line_width(cr, 1.0);
        cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
!       set_cairo_source_rgb_from_pixel(cr, gui.spcolor->pixel);
        for (i = FILL_X(col); i < FILL_X(col + cells); ++i)
        {
            offset = val[i % 8];
--- 5794,5802 ----
  #if GTK_CHECK_VERSION(3,0,0)
        cairo_set_line_width(cr, 1.0);
        cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
!       cairo_set_source_rgba(cr,
!               gui.spcolor->red, gui.spcolor->green, gui.spcolor->blue,
!               gui.spcolor->alpha);
        for (i = FILL_X(col); i < FILL_X(col + cells); ++i)
        {
            offset = val[i % 8];
***************
*** 5894,5900 ****
        {
            cairo_set_line_width(cr, 1.0);
            cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
!           set_cairo_source_rgb_from_pixel(cr, gui.fgcolor->pixel);
            cairo_move_to(cr, FILL_X(col), y + 0.5);
            cairo_line_to(cr, FILL_X(col + cells), y + 0.5);
            cairo_stroke(cr);
--- 5825,5833 ----
        {
            cairo_set_line_width(cr, 1.0);
            cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
!           cairo_set_source_rgba(cr,
!                   gui.fgcolor->red, gui.fgcolor->green, gui.fgcolor->blue,
!                   gui.fgcolor->alpha);
            cairo_move_to(cr, FILL_X(col), y + 0.5);
            cairo_line_to(cr, FILL_X(col + cells), y + 0.5);
            cairo_stroke(cr);
***************
*** 6361,6367 ****
      };
      cairo_t * const cr = cairo_create(gui.surface);
  
!     set_cairo_source_rgb_from_pixel(cr, gui.norm_pixel ^ gui.back_pixel);
  # if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1,9,2)
      cairo_set_operator(cr, CAIRO_OPERATOR_DIFFERENCE);
  # else
--- 6294,6300 ----
      };
      cairo_t * const cr = cairo_create(gui.surface);
  
!     set_cairo_source_rgba_from_color(cr, gui.norm_pixel ^ gui.back_pixel);
  # if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1,9,2)
      cairo_set_operator(cr, CAIRO_OPERATOR_DIFFERENCE);
  # else
***************
*** 6445,6451 ****
      gui_mch_set_fg_color(color);
  
  #if GTK_CHECK_VERSION(3,0,0)
!     set_cairo_source_rgb_from_pixel(cr, gui.fgcolor->pixel);
  #else
      gdk_gc_set_foreground(gui.text_gc, gui.fgcolor);
  #endif
--- 6378,6386 ----
      gui_mch_set_fg_color(color);
  
  #if GTK_CHECK_VERSION(3,0,0)
!     cairo_set_source_rgba(cr,
!           gui.fgcolor->red, gui.fgcolor->green, gui.fgcolor->blue,
!           gui.fgcolor->alpha);
  #else
      gdk_gc_set_foreground(gui.text_gc, gui.fgcolor);
  #endif
***************
*** 6488,6494 ****
        cairo_t *cr;
  
        cr = cairo_create(gui.surface);
!       set_cairo_source_rgb_from_pixel(cr, gui.fgcolor->pixel);
        cairo_rectangle(cr,
  # ifdef FEAT_RIGHTLEFT
            /* vertical line should be on the right of current point */
--- 6423,6431 ----
        cairo_t *cr;
  
        cr = cairo_create(gui.surface);
!       cairo_set_source_rgba(cr,
!               gui.fgcolor->red, gui.fgcolor->green, gui.fgcolor->blue,
!               gui.fgcolor->alpha);
        cairo_rectangle(cr,
  # ifdef FEAT_RIGHTLEFT
            /* vertical line should be on the right of current point */
***************
*** 6686,6692 ****
        if (pat != NULL)
            cairo_set_source(cr, pat);
        else
!           set_cairo_source_rgb_from_pixel(cr, gui.back_pixel);
        gdk_cairo_rectangle(cr, &rect);
        cairo_fill(cr);
        cairo_destroy(cr);
--- 6623,6629 ----
        if (pat != NULL)
            cairo_set_source(cr, pat);
        else
!           set_cairo_source_rgba_from_color(cr, gui.back_pixel);
        gdk_cairo_rectangle(cr, &rect);
        cairo_fill(cr);
        cairo_destroy(cr);
***************
*** 6719,6725 ****
      if (pat != NULL)
        cairo_set_source(cr, pat);
      else
!       set_cairo_source_rgb_from_pixel(cr, gui.back_pixel);
      gdk_cairo_rectangle(cr, &rect);
      cairo_fill(cr);
      cairo_destroy(cr);
--- 6656,6662 ----
      if (pat != NULL)
        cairo_set_source(cr, pat);
      else
!       set_cairo_source_rgba_from_color(cr, gui.back_pixel);
      gdk_cairo_rectangle(cr, &rect);
      cairo_fill(cr);
      cairo_destroy(cr);
***************
*** 7079,7101 ****
      long_u
  gui_mch_get_rgb(guicolor_T pixel)
  {
-     GdkColor color;
  #if GTK_CHECK_VERSION(3,0,0)
!     GdkRGBA rgba;
! 
!     gui_gtk_get_rgb_from_pixel(pixel, &rgba);
! 
!     color.red = rgba.red * 65535;
!     color.green = rgba.green * 65535;
!     color.blue = rgba.blue * 65535;
  #else
      gdk_colormap_query_color(gtk_widget_get_colormap(gui.drawarea),
                             (unsigned long)pixel, &color);
- #endif
  
      return (((unsigned)color.red   & 0xff00) << 8)
         |  ((unsigned)color.green & 0xff00)
         | (((unsigned)color.blue  & 0xff00) >> 8);
  }
  
  /*
--- 7016,7033 ----
      long_u
  gui_mch_get_rgb(guicolor_T pixel)
  {
  #if GTK_CHECK_VERSION(3,0,0)
!     return (long_u)pixel;
  #else
+     GdkColor color;
+ 
      gdk_colormap_query_color(gtk_widget_get_colormap(gui.drawarea),
                             (unsigned long)pixel, &color);
  
      return (((unsigned)color.red   & 0xff00) << 8)
         |  ((unsigned)color.green & 0xff00)
         | (((unsigned)color.blue  & 0xff00) >> 8);
+ #endif
  }
  
  /*
***************
*** 7355,7361 ****
                    cairo_surface_get_content(gui.surface),
                    SIGN_WIDTH, SIGN_HEIGHT);
            bg_cr = cairo_create(bg_surf);
!           set_cairo_source_rgb_from_pixel(bg_cr, gui.bgcolor->pixel);
            cairo_paint(bg_cr);
  
            sign_surf = cairo_surface_create_similar(gui.surface,
--- 7287,7295 ----
                    cairo_surface_get_content(gui.surface),
                    SIGN_WIDTH, SIGN_HEIGHT);
            bg_cr = cairo_create(bg_surf);
!           cairo_set_source_rgba(bg_cr,
!                   gui.bgcolor->red, gui.bgcolor->green, gui.bgcolor->blue,
!                   gui.bgcolor->alpha);
            cairo_paint(bg_cr);
  
            sign_surf = cairo_surface_create_similar(gui.surface,
*** ../vim-7.4.2088/src/netbeans.c      2016-07-10 22:11:11.870751341 +0200
--- src/netbeans.c      2016-07-21 21:46:49.945821525 +0200
***************
*** 3097,3120 ****
  
  #if GTK_CHECK_VERSION(3,0,0)
      cr = cairo_create(gui.surface);
!     {
!       GdkVisual *visual = NULL;
!       guint32 r_mask, g_mask, b_mask;
!       gint r_shift, g_shift, b_shift;
! 
!       visual = gdk_window_get_visual(gtk_widget_get_window(gui.drawarea));
!       if (visual != NULL)
!       {
!           gdk_visual_get_red_pixel_details(visual, &r_mask, &r_shift, NULL);
!           gdk_visual_get_green_pixel_details(visual, &g_mask, &g_shift, NULL);
!           gdk_visual_get_blue_pixel_details(visual, &b_mask, &b_shift, NULL);
! 
!           cairo_set_source_rgb(cr,
!                   ((gui.fgcolor->red & r_mask) >> r_shift) / 255.0,
!                   ((gui.fgcolor->green & g_mask) >> g_shift) / 255.0,
!                   ((gui.fgcolor->blue & b_mask) >> b_shift) / 255.0);
!       }
!     }
  #endif
  
      x = 0;
--- 3097,3105 ----
  
  #if GTK_CHECK_VERSION(3,0,0)
      cr = cairo_create(gui.surface);
!     cairo_set_source_rgba(cr,
!           gui.fgcolor->red, gui.fgcolor->green, gui.fgcolor->blue,
!           gui.fgcolor->alpha);
  #endif
  
      x = 0;
*** ../vim-7.4.2088/src/version.c       2016-07-21 22:02:57.371744932 +0200
--- src/version.c       2016-07-21 22:09:18.831743247 +0200
***************
*** 760,761 ****
--- 760,763 ----
  {   /* Add new patch number below this line */
+ /**/
+     2089,
  /**/

-- 
The early bird gets the worm. If you want something else for
breakfast, get up later.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui