| /* Flow Box | 
 |  * | 
 |  * GtkFlowBox allows flexible and responsive grids which reflow | 
 |  * as needed and support sorting and filtering. | 
 |  * | 
 |  * The children of a GtkFlowBox are regular widgets | 
 |  */ | 
 |  | 
 | #include <gtk/gtk.h> | 
 | #include <stdlib.h> | 
 | #include <string.h> | 
 |  | 
 | static void | 
 | draw_color (GtkDrawingArea *drawingarea, | 
 |             cairo_t        *cr, | 
 |             int             width, | 
 |             int             height, | 
 |             gpointer        data) | 
 | { | 
 |   const char *color_name = data; | 
 |   GdkRGBA rgba; | 
 |  | 
 |   if (gdk_rgba_parse (&rgba, color_name)) | 
 |     { | 
 |       gdk_cairo_set_source_rgba (cr, &rgba); | 
 |       cairo_paint (cr); | 
 |     } | 
 | } | 
 |  | 
 | static GtkWidget * | 
 | color_swatch_new (const gchar *color) | 
 | { | 
 |   GtkWidget *button, *area; | 
 |  | 
 |   button = gtk_button_new (); | 
 |   area = gtk_drawing_area_new (); | 
 |   gtk_drawing_area_set_content_width (GTK_DRAWING_AREA (area), 24); | 
 |   gtk_drawing_area_set_content_height (GTK_DRAWING_AREA (area), 24); | 
 |   gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (area), draw_color, (gpointer) color, NULL); | 
 |   gtk_container_add (GTK_CONTAINER (button), area); | 
 |  | 
 |   return button; | 
 | } | 
 |  | 
 | GtkWidget * | 
 | do_flowbox (GtkWidget *do_widget) | 
 | { | 
 |   static GtkWidget *window = NULL; | 
 |   GtkWidget *scrolled, *flowbox; | 
 |   const gchar *colors[] = { | 
 |     "AliceBlue", | 
 |     "AntiqueWhite", | 
 |     "AntiqueWhite1", | 
 |     "AntiqueWhite2", | 
 |     "AntiqueWhite3", | 
 |     "AntiqueWhite4", | 
 |     "aqua", | 
 |     "aquamarine", | 
 |     "aquamarine1", | 
 |     "aquamarine2", | 
 |     "aquamarine3", | 
 |     "aquamarine4", | 
 |     "azure", | 
 |     "azure1", | 
 |     "azure2", | 
 |     "azure3", | 
 |     "azure4", | 
 |     "beige", | 
 |     "bisque", | 
 |     "bisque1", | 
 |     "bisque2", | 
 |     "bisque3", | 
 |     "bisque4", | 
 |     "black", | 
 |     "BlanchedAlmond", | 
 |     "blue", | 
 |     "blue1", | 
 |     "blue2", | 
 |     "blue3", | 
 |     "blue4", | 
 |     "BlueViolet", | 
 |     "brown", | 
 |     "brown1", | 
 |     "brown2", | 
 |     "brown3", | 
 |     "brown4", | 
 |     "burlywood", | 
 |     "burlywood1", | 
 |     "burlywood2", | 
 |     "burlywood3", | 
 |     "burlywood4", | 
 |     "CadetBlue", | 
 |     "CadetBlue1", | 
 |     "CadetBlue2", | 
 |     "CadetBlue3", | 
 |     "CadetBlue4", | 
 |     "chartreuse", | 
 |     "chartreuse1", | 
 |     "chartreuse2", | 
 |     "chartreuse3", | 
 |     "chartreuse4", | 
 |     "chocolate", | 
 |     "chocolate1", | 
 |     "chocolate2", | 
 |     "chocolate3", | 
 |     "chocolate4", | 
 |     "coral", | 
 |     "coral1", | 
 |     "coral2", | 
 |     "coral3", | 
 |     "coral4", | 
 |     "CornflowerBlue", | 
 |     "cornsilk", | 
 |     "cornsilk1", | 
 |     "cornsilk2", | 
 |     "cornsilk3", | 
 |     "cornsilk4", | 
 |     "crimson", | 
 |     "cyan", | 
 |     "cyan1", | 
 |     "cyan2", | 
 |     "cyan3", | 
 |     "cyan4", | 
 |     "DarkBlue", | 
 |     "DarkCyan", | 
 |     "DarkGoldenrod", | 
 |     "DarkGoldenrod1", | 
 |     "DarkGoldenrod2", | 
 |     "DarkGoldenrod3", | 
 |     "DarkGoldenrod4", | 
 |     "DarkGray", | 
 |     "DarkGreen", | 
 |     "DarkGrey", | 
 |     "DarkKhaki", | 
 |     "DarkMagenta", | 
 |     "DarkOliveGreen", | 
 |     "DarkOliveGreen1", | 
 |     "DarkOliveGreen2", | 
 |     "DarkOliveGreen3", | 
 |     "DarkOliveGreen4", | 
 |     "DarkOrange", | 
 |     "DarkOrange1", | 
 |     "DarkOrange2", | 
 |     "DarkOrange3", | 
 |     "DarkOrange4", | 
 |     "DarkOrchid", | 
 |     "DarkOrchid1", | 
 |     "DarkOrchid2", | 
 |     "DarkOrchid3", | 
 |     "DarkOrchid4", | 
 |     "DarkRed", | 
 |     "DarkSalmon", | 
 |     "DarkSeaGreen", | 
 |     "DarkSeaGreen1", | 
 |     "DarkSeaGreen2", | 
 |     "DarkSeaGreen3", | 
 |     "DarkSeaGreen4", | 
 |     "DarkSlateBlue", | 
 |     "DarkSlateGray", | 
 |     "DarkSlateGray1", | 
 |     "DarkSlateGray2", | 
 |     "DarkSlateGray3", | 
 |     "DarkSlateGray4", | 
 |     "DarkSlateGrey", | 
 |     "DarkTurquoise", | 
 |     "DarkViolet", | 
 |     "DeepPink", | 
 |     "DeepPink1", | 
 |     "DeepPink2", | 
 |     "DeepPink3", | 
 |     "DeepPink4", | 
 |     "DeepSkyBlue", | 
 |     "DeepSkyBlue1", | 
 |     "DeepSkyBlue2", | 
 |     "DeepSkyBlue3", | 
 |     "DeepSkyBlue4", | 
 |     "DimGray", | 
 |     "DimGrey", | 
 |     "DodgerBlue", | 
 |     "DodgerBlue1", | 
 |     "DodgerBlue2", | 
 |     "DodgerBlue3", | 
 |     "DodgerBlue4", | 
 |     "firebrick", | 
 |     "firebrick1", | 
 |     "firebrick2", | 
 |     "firebrick3", | 
 |     "firebrick4", | 
 |     "FloralWhite", | 
 |     "ForestGreen", | 
 |     "fuchsia", | 
 |     "gainsboro", | 
 |     "GhostWhite", | 
 |     "gold", | 
 |     "gold1", | 
 |     "gold2", | 
 |     "gold3", | 
 |     "gold4", | 
 |     "goldenrod", | 
 |     "goldenrod1", | 
 |     "goldenrod2", | 
 |     "goldenrod3", | 
 |     "goldenrod4", | 
 |     "gray", | 
 |     "gray0", | 
 |     "gray1", | 
 |     "gray10", | 
 |     "gray100", | 
 |     "gray11", | 
 |     "gray12", | 
 |     "gray13", | 
 |     "gray14", | 
 |     "gray15", | 
 |     "gray16", | 
 |     "gray17", | 
 |     "gray18", | 
 |     "gray19", | 
 |     "gray2", | 
 |     "gray20", | 
 |     "gray21", | 
 |     "gray22", | 
 |     "gray23", | 
 |     "gray24", | 
 |     "gray25", | 
 |     "gray26", | 
 |     "gray27", | 
 |     "gray28", | 
 |     "gray29", | 
 |     "gray3", | 
 |     "gray30", | 
 |     "gray31", | 
 |     "gray32", | 
 |     "gray33", | 
 |     "gray34", | 
 |     "gray35", | 
 |     "gray36", | 
 |     "gray37", | 
 |     "gray38", | 
 |     "gray39", | 
 |     "gray4", | 
 |     "gray40", | 
 |     "gray41", | 
 |     "gray42", | 
 |     "gray43", | 
 |     "gray44", | 
 |     "gray45", | 
 |     "gray46", | 
 |     "gray47", | 
 |     "gray48", | 
 |     "gray49", | 
 |     "gray5", | 
 |     "gray50", | 
 |     "gray51", | 
 |     "gray52", | 
 |     "gray53", | 
 |     "gray54", | 
 |     "gray55", | 
 |     "gray56", | 
 |     "gray57", | 
 |     "gray58", | 
 |     "gray59", | 
 |     "gray6", | 
 |     "gray60", | 
 |     "gray61", | 
 |     "gray62", | 
 |     "gray63", | 
 |     "gray64", | 
 |     "gray65", | 
 |     "gray66", | 
 |     "gray67", | 
 |     "gray68", | 
 |     "gray69", | 
 |     "gray7", | 
 |     "gray70", | 
 |     "gray71", | 
 |     "gray72", | 
 |     "gray73", | 
 |     "gray74", | 
 |     "gray75", | 
 |     "gray76", | 
 |     "gray77", | 
 |     "gray78", | 
 |     "gray79", | 
 |     "gray8", | 
 |     "gray80", | 
 |     "gray81", | 
 |     "gray82", | 
 |     "gray83", | 
 |     "gray84", | 
 |     "gray85", | 
 |     "gray86", | 
 |     "gray87", | 
 |     "gray88", | 
 |     "gray89", | 
 |     "gray9", | 
 |     "gray90", | 
 |     "gray91", | 
 |     "gray92", | 
 |     "gray93", | 
 |     "gray94", | 
 |     "gray95", | 
 |     "gray96", | 
 |     "gray97", | 
 |     "gray98", | 
 |     "gray99", | 
 |     "green", | 
 |     "green1", | 
 |     "green2", | 
 |     "green3", | 
 |     "green4", | 
 |     "GreenYellow", | 
 |     "grey", | 
 |     "grey0", | 
 |     "grey1", | 
 |     "grey10", | 
 |     "grey100", | 
 |     "grey11", | 
 |     "grey12", | 
 |     "grey13", | 
 |     "grey14", | 
 |     "grey15", | 
 |     "grey16", | 
 |     "grey17", | 
 |     "grey18", | 
 |     "grey19", | 
 |     "grey2", | 
 |     "grey20", | 
 |     "grey21", | 
 |     "grey22", | 
 |     "grey23", | 
 |     "grey24", | 
 |     "grey25", | 
 |     "grey26", | 
 |     "grey27", | 
 |     "grey28", | 
 |     "grey29", | 
 |     "grey3", | 
 |     "grey30", | 
 |     "grey31", | 
 |     "grey32", | 
 |     "grey33", | 
 |     "grey34", | 
 |     "grey35", | 
 |     "grey36", | 
 |     "grey37", | 
 |     "grey38", | 
 |     "grey39", | 
 |     "grey4", | 
 |     "grey40", | 
 |     "grey41", | 
 |     "grey42", | 
 |     "grey43", | 
 |     "grey44", | 
 |     "grey45", | 
 |     "grey46", | 
 |     "grey47", | 
 |     "grey48", | 
 |     "grey49", | 
 |     "grey5", | 
 |     "grey50", | 
 |     "grey51", | 
 |     "grey52", | 
 |     "grey53", | 
 |     "grey54", | 
 |     "grey55", | 
 |     "grey56", | 
 |     "grey57", | 
 |     "grey58", | 
 |     "grey59", | 
 |     "grey6", | 
 |     "grey60", | 
 |     "grey61", | 
 |     "grey62", | 
 |     "grey63", | 
 |     "grey64", | 
 |     "grey65", | 
 |     "grey66", | 
 |     "grey67", | 
 |     "grey68", | 
 |     "grey69", | 
 |     "grey7", | 
 |     "grey70", | 
 |     "grey71", | 
 |     "grey72", | 
 |     "grey73", | 
 |     "grey74", | 
 |     "grey75", | 
 |     "grey76", | 
 |     "grey77", | 
 |     "grey78", | 
 |     "grey79", | 
 |     "grey8", | 
 |     "grey80", | 
 |     "grey81", | 
 |     "grey82", | 
 |     "grey83", | 
 |     "grey84", | 
 |     "grey85", | 
 |     "grey86", | 
 |     "grey87", | 
 |     "grey88", | 
 |     "grey89", | 
 |     "grey9", | 
 |     "grey90", | 
 |     "grey91", | 
 |     "grey92", | 
 |     "grey93", | 
 |     "grey94", | 
 |     "grey95", | 
 |     "grey96", | 
 |     "grey97", | 
 |     "grey98", | 
 |     "grey99", | 
 |     "honeydew", | 
 |     "honeydew1", | 
 |     "honeydew2", | 
 |     "honeydew3", | 
 |     "honeydew4", | 
 |     "HotPink", | 
 |     "HotPink1", | 
 |     "HotPink2", | 
 |     "HotPink3", | 
 |     "HotPink4", | 
 |     "IndianRed", | 
 |     "IndianRed1", | 
 |     "IndianRed2", | 
 |     "IndianRed3", | 
 |     "IndianRed4", | 
 |     "indigo", | 
 |     "ivory", | 
 |     "ivory1", | 
 |     "ivory2", | 
 |     "ivory3", | 
 |     "ivory4", | 
 |     "khaki", | 
 |     "khaki1", | 
 |     "khaki2", | 
 |     "khaki3", | 
 |     "khaki4", | 
 |     "lavender", | 
 |     "LavenderBlush", | 
 |     "LavenderBlush1", | 
 |     "LavenderBlush2", | 
 |     "LavenderBlush3", | 
 |     "LavenderBlush4", | 
 |     "LawnGreen", | 
 |     "LemonChiffon", | 
 |     "LemonChiffon1", | 
 |     "LemonChiffon2", | 
 |     "LemonChiffon3", | 
 |     "LemonChiffon4", | 
 |     "LightBlue", | 
 |     "LightBlue1", | 
 |     "LightBlue2", | 
 |     "LightBlue3", | 
 |     "LightBlue4", | 
 |     "LightCoral", | 
 |     "LightCyan", | 
 |     "LightCyan1", | 
 |     "LightCyan2", | 
 |     "LightCyan3", | 
 |     "LightCyan4", | 
 |     "LightGoldenrod", | 
 |     "LightGoldenrod1", | 
 |     "LightGoldenrod2", | 
 |     "LightGoldenrod3", | 
 |     "LightGoldenrod4", | 
 |     "LightGoldenrodYellow", | 
 |     "LightGray", | 
 |     "LightGreen", | 
 |     "LightGrey", | 
 |     "LightPink", | 
 |     "LightPink1", | 
 |     "LightPink2", | 
 |     "LightPink3", | 
 |     "LightPink4", | 
 |     "LightSalmon", | 
 |     "LightSalmon1", | 
 |     "LightSalmon2", | 
 |     "LightSalmon3", | 
 |     "LightSalmon4", | 
 |     "LightSeaGreen", | 
 |     "LightSkyBlue", | 
 |     "LightSkyBlue1", | 
 |     "LightSkyBlue2", | 
 |     "LightSkyBlue3", | 
 |     "LightSkyBlue4", | 
 |     "LightSlateBlue", | 
 |     "LightSlateGray", | 
 |     "LightSlateGrey", | 
 |     "LightSteelBlue", | 
 |     "LightSteelBlue1", | 
 |     "LightSteelBlue2", | 
 |     "LightSteelBlue3", | 
 |     "LightSteelBlue4", | 
 |     "LightYellow", | 
 |     "LightYellow1", | 
 |     "LightYellow2", | 
 |     "LightYellow3", | 
 |     "LightYellow4", | 
 |     "lime", | 
 |     "LimeGreen", | 
 |     "linen", | 
 |     "magenta", | 
 |     "magenta1", | 
 |     "magenta2", | 
 |     "magenta3", | 
 |     "magenta4", | 
 |     "maroon", | 
 |     "maroon1", | 
 |     "maroon2", | 
 |     "maroon3", | 
 |     "maroon4", | 
 |     "MediumAquamarine", | 
 |     "MediumBlue", | 
 |     "MediumOrchid", | 
 |     "MediumOrchid1", | 
 |     "MediumOrchid2", | 
 |     "MediumOrchid3", | 
 |     "MediumOrchid4", | 
 |     "MediumPurple", | 
 |     "MediumPurple1", | 
 |     "MediumPurple2", | 
 |     "MediumPurple3", | 
 |     "MediumPurple4", | 
 |     "MediumSeaGreen", | 
 |     "MediumSlateBlue", | 
 |     "MediumSpringGreen", | 
 |     "MediumTurquoise", | 
 |     "MediumVioletRed", | 
 |     "MidnightBlue", | 
 |     "MintCream", | 
 |     "MistyRose", | 
 |     "MistyRose1", | 
 |     "MistyRose2", | 
 |     "MistyRose3", | 
 |     "MistyRose4", | 
 |     "moccasin", | 
 |     "NavajoWhite", | 
 |     "NavajoWhite1", | 
 |     "NavajoWhite2", | 
 |     "NavajoWhite3", | 
 |     "NavajoWhite4", | 
 |     "navy", | 
 |     "NavyBlue", | 
 |     "OldLace", | 
 |     "olive", | 
 |     "OliveDrab", | 
 |     "OliveDrab1", | 
 |     "OliveDrab2", | 
 |     "OliveDrab3", | 
 |     "OliveDrab4", | 
 |     "orange", | 
 |     "orange1", | 
 |     "orange2", | 
 |     "orange3", | 
 |     "orange4", | 
 |     "OrangeRed", | 
 |     "OrangeRed1", | 
 |     "OrangeRed2", | 
 |     "OrangeRed3", | 
 |     "OrangeRed4", | 
 |     "orchid", | 
 |     "orchid1", | 
 |     "orchid2", | 
 |     "orchid3", | 
 |     "orchid4", | 
 |     "PaleGoldenrod", | 
 |     "PaleGreen", | 
 |     "PaleGreen1", | 
 |     "PaleGreen2", | 
 |     "PaleGreen3", | 
 |     "PaleGreen4", | 
 |     "PaleTurquoise", | 
 |     "PaleTurquoise1", | 
 |     "PaleTurquoise2", | 
 |     "PaleTurquoise3", | 
 |     "PaleTurquoise4", | 
 |     "PaleVioletRed", | 
 |     "PaleVioletRed1", | 
 |     "PaleVioletRed2", | 
 |     "PaleVioletRed3", | 
 |     "PaleVioletRed4", | 
 |     "PapayaWhip", | 
 |     "PeachPuff", | 
 |     "PeachPuff1", | 
 |     "PeachPuff2", | 
 |     "PeachPuff3", | 
 |     "PeachPuff4", | 
 |     "peru", | 
 |     "pink", | 
 |     "pink1", | 
 |     "pink2", | 
 |     "pink3", | 
 |     "pink4", | 
 |     "plum", | 
 |     "plum1", | 
 |     "plum2", | 
 |     "plum3", | 
 |     "plum4", | 
 |     "PowderBlue", | 
 |     "purple", | 
 |     "purple1", | 
 |     "purple2", | 
 |     "purple3", | 
 |     "purple4", | 
 |     "red", | 
 |     "red1", | 
 |     "red2", | 
 |     "red3", | 
 |     "red4", | 
 |     "RosyBrown", | 
 |     "RosyBrown1", | 
 |     "RosyBrown2", | 
 |     "RosyBrown3", | 
 |     "RosyBrown4", | 
 |     "RoyalBlue", | 
 |     "RoyalBlue1", | 
 |     "RoyalBlue2", | 
 |     "RoyalBlue3", | 
 |     "RoyalBlue4", | 
 |     "SaddleBrown", | 
 |     "salmon", | 
 |     "salmon1", | 
 |     "salmon2", | 
 |     "salmon3", | 
 |     "salmon4", | 
 |     "SandyBrown", | 
 |     "SeaGreen", | 
 |     "SeaGreen1", | 
 |     "SeaGreen2", | 
 |     "SeaGreen3", | 
 |     "SeaGreen4", | 
 |     "seashell", | 
 |     "seashell1", | 
 |     "seashell2", | 
 |     "seashell3", | 
 |     "seashell4", | 
 |     "sienna", | 
 |     "sienna1", | 
 |     "sienna2", | 
 |     "sienna3", | 
 |     "sienna4", | 
 |     "silver", | 
 |     "SkyBlue", | 
 |     "SkyBlue1", | 
 |     "SkyBlue2", | 
 |     "SkyBlue3", | 
 |     "SkyBlue4", | 
 |     "SlateBlue", | 
 |     "SlateBlue1", | 
 |     "SlateBlue2", | 
 |     "SlateBlue3", | 
 |     "SlateBlue4", | 
 |     "SlateGray", | 
 |     "SlateGray1", | 
 |     "SlateGray2", | 
 |     "SlateGray3", | 
 |     "SlateGray4", | 
 |     "SlateGrey", | 
 |     "snow", | 
 |     "snow1", | 
 |     "snow2", | 
 |     "snow3", | 
 |     "snow4", | 
 |     "SpringGreen", | 
 |     "SpringGreen1", | 
 |     "SpringGreen2", | 
 |     "SpringGreen3", | 
 |     "SpringGreen4", | 
 |     "SteelBlue", | 
 |     "SteelBlue1", | 
 |     "SteelBlue2", | 
 |     "SteelBlue3", | 
 |     "SteelBlue4", | 
 |     "tan", | 
 |     "tan1", | 
 |     "tan2", | 
 |     "tan3", | 
 |     "tan4", | 
 |     "teal", | 
 |     "thistle", | 
 |     "thistle1", | 
 |     "thistle2", | 
 |     "thistle3", | 
 |     "thistle4", | 
 |     "tomato", | 
 |     "tomato1", | 
 |     "tomato2", | 
 |     "tomato3", | 
 |     "tomato4", | 
 |     "turquoise", | 
 |     "turquoise1", | 
 |     "turquoise2", | 
 |     "turquoise3", | 
 |     "turquoise4", | 
 |     "violet", | 
 |     "VioletRed", | 
 |     "VioletRed1", | 
 |     "VioletRed2", | 
 |     "VioletRed3", | 
 |     "VioletRed4", | 
 |     "wheat", | 
 |     "wheat1", | 
 |     "wheat2", | 
 |     "wheat3", | 
 |     "wheat4", | 
 |     "white", | 
 |     "WhiteSmoke", | 
 |     "yellow", | 
 |     "yellow1", | 
 |     "yellow2", | 
 |     "yellow3", | 
 |     "yellow4", | 
 |     "YellowGreen", | 
 |     NULL | 
 |   }; | 
 |   gint i; | 
 |  | 
 |   if (!window) | 
 |     { | 
 |       window = gtk_window_new (GTK_WINDOW_TOPLEVEL); | 
 |       gtk_window_set_display (GTK_WINDOW (window), | 
 |                               gtk_widget_get_display (do_widget)); | 
 |       gtk_window_set_title (GTK_WINDOW (window), "Flow Box"); | 
 |       gtk_window_set_default_size (GTK_WINDOW (window), 400, 600); | 
 |  | 
 |       g_signal_connect (window, "destroy", | 
 |                         G_CALLBACK (gtk_widget_destroyed), &window); | 
 |  | 
 |       scrolled = gtk_scrolled_window_new (NULL, NULL); | 
 |       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); | 
 |       flowbox = gtk_flow_box_new (); | 
 |       gtk_widget_set_valign (flowbox, GTK_ALIGN_START); | 
 |       gtk_flow_box_set_max_children_per_line (GTK_FLOW_BOX (flowbox), 30); | 
 |       gtk_flow_box_set_selection_mode (GTK_FLOW_BOX (flowbox), GTK_SELECTION_NONE); | 
 |  | 
 |       gtk_container_add (GTK_CONTAINER (scrolled), flowbox); | 
 |       gtk_container_add (GTK_CONTAINER (window), scrolled); | 
 |  | 
 |       for (i = 0; colors[i]; i++) | 
 |         gtk_container_add (GTK_CONTAINER (flowbox), color_swatch_new (colors[i])); | 
 |     } | 
 |  | 
 |   if (!gtk_widget_get_visible (window)) | 
 |     gtk_widget_show (window); | 
 |   else | 
 |     gtk_widget_destroy (window); | 
 |  | 
 |   return window; | 
 | } |