#include "group.h"

/**
 *
 * Beryl group plugin
 *
 * option.c
 *
 * Copyright : (C) 2006 by Patrick Niklaus, Roi Cohen, Danny Baumann
 * Authors: Patrick Niklaus <patrick.niklaus@googlemail.com>
 *          Roi Cohen       <roico@beryl-project.org>
 *          Danny Baumann   <maniac@beryl-project.org>
 *
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 **/

/*
 * Defaults
 *
 */
#define GROUP_SELECT_MODIFIERS_DEFAULT          (CompSuperMask)
#define GROUP_SELECT_BUTTON_DEFAULT             Button1

#define GROUP_SELECT_SINGLE_MODIFIERS_DEFAULT   (CompSuperMask)
#define GROUP_SELECT_SINGLE_KEY_DEFAULT         "s"

#define GROUP_GROUPING_MODIFIERS_DEFAULT        (CompSuperMask)
#define GROUP_GROUPING_KEY_DEFAULT              "g"

#define GROUP_UNGROUPING_MODIFIERS_DEFAULT      (CompSuperMask)
#define GROUP_UNGROUPING_KEY_DEFAULT            "u"

#define GROUP_TABMODE_MODIFIERS_DEFAULT         (CompSuperMask)
#define GROUP_TABMODE_KEY_DEFAULT               "t"

#define GROUP_CHANGE_TAB_LEFT_MODIFIERS_DEFAULT (CompSuperMask)
#define GROUP_CHANGE_TAB_LEFT_KEY_DEFAULT       "Left"

#define GROUP_CHANGE_TAB_RIGHT_MODIFIERS_DEFAULT (CompSuperMask)
#define GROUP_CHANGE_TAB_RIGHT_KEY_DEFAULT       "Right"

#define GROUP_REMOVING_MODIFIERS_DEFAULT       (CompSuperMask)
#define GROUP_REMOVING_KEY_DEFAULT             "r"

#define GROUP_CLOSING_MODIFIERS_DEFAULT        (CompSuperMask)
#define GROUP_CLOSING_KEY_DEFAULT              "c"

#define GROUP_IGNORE_MODIFIERS_DEFAULT          (CompSuperMask)
#define GROUP_IGNORE_KEY_DEFAULT                "x"

#define GROUP_CHANGE_COLOR_MODIFIERS_DEFAULT	(CompSuperMask)
#define GROUP_CHANGE_COLOR_KEY_DEFAULT          "y"

#define GROUP_OPACITY_DEFAULT           80
#define GROUP_OPACITY_MIN               0
#define GROUP_OPACITY_MAX               100

#define GROUP_SATURATION_DEFAULT        20
#define GROUP_SATURATION_MIN            0
#define GROUP_SATURATION_MAX            100

#define GROUP_BRIGHTNESS_DEFAULT        70
#define GROUP_BRIGHTNESS_MIN            0
#define GROUP_BRIGHTNESS_MAX            100

#define GROUP_PRECISION_DEFAULT         25
#define GROUP_PRECISION_MIN             1
#define GROUP_PRECISION_MAX             100

#define GROUP_THUMB_SIZE_DEFAULT	128
#define GROUP_THUMB_SIZE_MIN		16
#define GROUP_THUMB_SIZE_MAX		256

#define GROUP_BORDER_WIDTH_DEFAULT	10
#define GROUP_BORDER_WIDTH_MIN		1
#define GROUP_BORDER_WIDTH_MAX		20

#define GROUP_BORDER_RADIUS_DEFAULT	10
#define GROUP_BORDER_RADIUS_MIN		1
#define GROUP_BORDER_RADIUS_MAX		20

#define GROUP_GLOW_SIZE_DEFAULT		64
#define GROUP_GLOW_SIZE_MIN		1
#define GROUP_GLOW_SIZE_MAX		300

#define GROUP_TABBAR_FONTSIZE_DEFAULT	12
#define GROUP_TABBAR_FONTSIZE_MIN	6
#define GROUP_TABBAR_FONTSIZE_MAX	24

#define GROUP_TAB_DRAG_Y_DISTANCE_DEFAULT   400
#define GROUP_TAB_DRAG_Y_DISTANCE_MIN	    10
#define GROUP_TAB_DRAG_Y_DISTANCE_MAX	    2500

#define GROUP_TAB_DRAG_SPEED_LIMIT_DEFAULT  800
#define GROUP_TAB_DRAG_SPEED_LIMIT_MIN	    0
#define GROUP_TAB_DRAG_SPEED_LIMIT_MAX	    2000

#define GROUP_MOVE_DEFAULT			TRUE
#define GROUP_RESIZE_DEFAULT			FALSE
#define GROUP_RAISE_DEFAULT			TRUE
#define GROUP_AUTO_UNGROUP_DEFAULT		FALSE
#define GROUP_AUTO_GROUP_DEFAULT		TRUE
#define GROUP_RELATIVE_DISTANCE_DEFAULT		FALSE
#define GROUP_TAB_CREATE_MIPMAPS_DEFAULT	FALSE
#define GROUP_GLOW_DEFAULT			TRUE
#define GROUP_UNTAB_ON_CLOSE_DEFAULT		FALSE
#define GROUP_SPRING_MODEL_ON_MOVE_DEFAULT	FALSE
#define GROUP_AUTOTAB_DEFAULT			FALSE
#define GROUP_DND_UNGROUP_WINDOW_DEFAULT	TRUE
#define GROUP_RESIZE_UNMAXIMIZE_DEFAULT		FALSE
#define GROUP_MINIMIZE_ALL_DEFAULT		TRUE
#define GROUP_SHADE_ALL_DEFAULT			FALSE

#define GROUP_COLOR_SELECTION_RED_DEFAULT       0x0000
#define GROUP_COLOR_SELECTION_GREEN_DEFAULT     0x0000
#define GROUP_COLOR_SELECTION_BLUE_DEFAULT      0x0000
#define GROUP_COLOR_SELECTION_ALPHA_DEFAULT     0x9999

#define GROUP_COLOR_LINE_RED_DEFAULT            0x0000
#define GROUP_COLOR_LINE_GREEN_DEFAULT          0x0000
#define GROUP_COLOR_LINE_BLUE_DEFAULT           0x0000
#define GROUP_COLOR_LINE_ALPHA_DEFAULT          0xABAB

#define GROUP_COLOR_TAB_FILL_RED_DEFAULT	0x0000
#define GROUP_COLOR_TAB_FILL_GREEN_DEFAULT	0x0000
#define GROUP_COLOR_TAB_FILL_BLUE_DEFAULT	0x0000
#define GROUP_COLOR_TAB_FILL_ALPHA_DEFAULT	0x9999

#define GROUP_COLOR_TAB_BORDER_RED_DEFAULT	0x0000
#define GROUP_COLOR_TAB_BORDER_GREEN_DEFAULT	0x0000
#define GROUP_COLOR_TAB_BORDER_BLUE_DEFAULT	0x0000
#define GROUP_COLOR_TAB_BORDER_ALPHA_DEFAULT	0xABAB

#define GROUP_COLOR_TABBAR_FONT_RED_DEFAULT	0xFFFF
#define GROUP_COLOR_TABBAR_FONT_BLUE_DEFAULT	0xFFFF
#define GROUP_COLOR_TABBAR_FONT_GREEN_DEFAULT	0xFFFF
#define GROUP_COLOR_TABBAR_FONT_ALPHA_DEFAULT	0xFFFF

#define GROUP_GLOW_TYPE_DEFAULT 	GlowTextureRectangular

#define GROUP_FADE_TIME_MIN			0.0f
#define GROUP_FADE_TIME_MAX			5.0f
#define GROUP_FADE_TIME_PRECISION		0.1f
#define GROUP_FADE_TIME_DEFAULT			0.2f

#define GROUP_FADE_TEXT_TIME_MIN		0.00f
#define GROUP_FADE_TEXT_TIME_MAX		5.00f
#define GROUP_FADE_TEXT_TIME_PRECISION		0.05f
#define GROUP_FADE_TEXT_TIME_DEFAULT		0.25f

#define GROUP_CHANGE_ANIMATION_TIME_DEFAULT	0.5f
#define GROUP_CHANGE_ANIMATION_TIME_MIN		0.0f
#define GROUP_CHANGE_ANIMATION_TIME_MAX		5.0f
#define GROUP_CHANGE_ANIMATION_TIME_PRECISION	0.05f

#define GROUP_TABBING_SPEED_DEFAULT		1.2f
#define GROUP_TABBING_SPEED_MIN			0.1f
#define GROUP_TABBING_SPEED_MAX			50.0f
#define GROUP_TABBING_SPEED_PRECISION		0.1f

#define GROUP_TABBING_TIMESTEP_DEFAULT		0.1f
#define GROUP_TABBING_TIMESTEP_MIN		0.1f
#define GROUP_TABBING_TIMESTEP_MAX		50.0f
#define GROUP_TABBING_TIMESTEP_PRECISION	0.1f

#define GROUP_VISIBILITY_TIME_MIN		0.0f
#define GROUP_VISIBILITY_TIME_MAX		10.0f
#define GROUP_VISIBILITY_TIME_PRECISION		0.05f
#define GROUP_VISIBILITY_TIME_DEFAULT		0.0f

#define GROUP_TAB_DRAG_HOVER_TIME_DEFAULT	0.5f
#define GROUP_TAB_DRAG_HOVER_TIME_MIN		0.0f
#define GROUP_TAB_DRAG_HOVER_TIME_MAX		5.0f
#define GROUP_TAB_DRAG_HOVER_TIME_PRECISION	0.1f

#define GROUP_TAB_DRAG_SPRING_K_DEFAULT		8.0f
#define GROUP_TAB_DRAG_SPRING_K_MIN		0.1f
#define GROUP_TAB_DRAG_SPRING_K_MAX		30.0f
#define GROUP_TAB_DRAG_SPRING_K_PRECISION	0.1f

#define GROUP_TAB_DRAG_FRICTION_DEFAULT		35.0f
#define GROUP_TAB_DRAG_FRICTION_MIN		0.1f
#define GROUP_TAB_DRAG_FRICTION_MAX		100.0f
#define GROUP_TAB_DRAG_FRICTION_PRECISION	0.1f

char *groupDefaultTypes[] = {
	N_("Normal"),
	N_("Dialog"),
	N_("ModalDialog")
};

/*
 * groupScreenInitOptions
 *
 */
void groupScreenInitOptions(GroupScreen * gs)
{

	CompOption *o;
	int i;

	o = &gs->opt[GROUP_SCREEN_OPTION_TYPES];
	o->name = "mask";
	o->group = N_("General");
	o->subGroup = N_("");
	o->displayHints = "";
	o->advanced = True;
	o->shortDesc = N_("Window Types");
	o->longDesc = N_("The types of windows which will be grouped");
	o->type = CompOptionTypeList;
	o->value.list.type = CompOptionTypeString;
	o->value.list.nValue = N_WIN_TYPE;
	o->value.list.value = malloc(sizeof(CompOptionValue) * N_WIN_TYPE);
	for (i = 0; i < N_WIN_TYPE; i++)
		o->value.list.value[i].s = strdup(groupDefaultTypes[i]);
	o->rest.s.string = (char **) windowTypeString;
	o->rest.s.nString = nWindowTypeString;

	o = &gs->opt[GROUP_SCREEN_OPTION_OPACITY];
	o->name = "opacity";
	o->group = N_("Selection");
	o->subGroup = N_("Options");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Opacity");
	o->longDesc = N_("Opacity of selected windows");
	o->type = CompOptionTypeInt;
	o->value.i = GROUP_OPACITY_DEFAULT;
	o->rest.i.min = GROUP_OPACITY_MIN;
	o->rest.i.max = GROUP_OPACITY_MAX;

	o = &gs->opt[GROUP_SCREEN_OPTION_SATURATION];
	o->name = "saturation";
	o->group = N_("Selection");
	o->subGroup = N_("Options");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Saturation");
	o->longDesc = N_("Saturation of selected windows");
	o->type = CompOptionTypeInt;
	o->value.i = GROUP_SATURATION_DEFAULT;
	o->rest.i.min = GROUP_SATURATION_MIN;
	o->rest.i.max = GROUP_SATURATION_MAX;

	o = &gs->opt[GROUP_SCREEN_OPTION_BRIGHTNESS];
	o->name = "brightness";
	o->group = N_("Selection");
	o->subGroup = N_("Options");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Brightness");
	o->longDesc = N_("Brightness of selected windows");
	o->type = CompOptionTypeInt;
	o->value.i = GROUP_BRIGHTNESS_DEFAULT;
	o->rest.i.min = GROUP_BRIGHTNESS_MIN;
	o->rest.i.max = GROUP_BRIGHTNESS_MAX;

	o = &gs->opt[GROUP_SCREEN_OPTION_PRECISION];
	o->name = "precision";
	o->group = N_("Selection");
	o->subGroup = N_("Options");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Precision");
	o->longDesc = N_("Precision of the seletion, which means its the percent "
					 "of the window area that has to be visible and in the selection.");
	o->type = CompOptionTypeInt;
	o->value.i = GROUP_PRECISION_DEFAULT;
	o->rest.i.min = GROUP_PRECISION_MIN;
	o->rest.i.max = GROUP_PRECISION_MAX;

	o = &gs->opt[GROUP_SCREEN_OPTION_TABBING_SPEED];
	o->name = "tabbing_speed";
	o->group = N_("Tabbing");
	o->subGroup = N_("Animation Options");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Tabbing Speed");
	o->longDesc =
	    N_("Tabbing Speed");
	o->type = CompOptionTypeFloat;
	o->value.f = GROUP_TABBING_SPEED_DEFAULT;
	o->rest.f.min = GROUP_TABBING_SPEED_MIN;
	o->rest.f.max = GROUP_TABBING_SPEED_MAX;
	o->rest.f.precision = GROUP_TABBING_SPEED_PRECISION;

	o = &gs->opt[GROUP_SCREEN_OPTION_TABBING_TIMESTEP];
	o->name = "tabbing_timestep";
	o->group = N_("Tabbing");
	o->subGroup = N_("Animation Options");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Tabbing Timestep");
	o->longDesc =
	    N_("The duration (in s) of the tabbing animation.");
	o->type = CompOptionTypeFloat;
	o->value.f = GROUP_TABBING_TIMESTEP_DEFAULT;
	o->rest.f.min = GROUP_TABBING_TIMESTEP_MIN;
	o->rest.f.max = GROUP_TABBING_TIMESTEP_MAX;
	o->rest.f.precision = GROUP_TABBING_TIMESTEP_PRECISION;

	o = &gs->opt[GROUP_SCREEN_OPTION_THUMB_SIZE];
	o->name = "thumb_size";
	o->group = N_("Tabbing");
	o->subGroup = N_("Misc. Options");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Thumb Size");
	o->longDesc =
	    N_("The size of the window thumbs in the tab bar.");
	o->type = CompOptionTypeInt;
	o->value.i = GROUP_THUMB_SIZE_DEFAULT;
	o->rest.i.min = GROUP_THUMB_SIZE_MIN;
	o->rest.i.max = GROUP_THUMB_SIZE_MAX;

	o = &gs->opt[GROUP_SCREEN_OPTION_BORDER_WIDTH];
	o->name = "border_width";
	o->group = N_("Tabbing");
	o->subGroup = N_("Misc. Options");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Border Width");
	o->longDesc =
	    N_("The width of the border around the tab bar.");
	o->type = CompOptionTypeInt;
	o->value.i = GROUP_BORDER_WIDTH_DEFAULT;
	o->rest.i.min = GROUP_BORDER_WIDTH_MIN;
	o->rest.i.max = GROUP_BORDER_WIDTH_MAX;

	o = &gs->opt[GROUP_SCREEN_OPTION_BORDER_RADIUS];
	o->name = "border_radius";
	o->group = N_("Tabbing");
	o->subGroup = N_("Misc. Options");
	o->displayHints = "";
	o->advanced = True;
	o->shortDesc = N_("Border Radius");
	o->longDesc =
	    N_("The radius for the edges of the tab bar.");
	o->type = CompOptionTypeInt;
	o->value.i = GROUP_BORDER_RADIUS_DEFAULT;
	o->rest.i.min = GROUP_BORDER_RADIUS_MIN;
	o->rest.i.max = GROUP_BORDER_RADIUS_MAX;

	o = &gs->opt[GROUP_SCREEN_OPTION_TABBAR_FONTSIZE];
	o->name = "tabbar_font_size";
	o->group = N_("Tabbing");
	o->subGroup = N_("Window title font");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Font Size");
	o->longDesc =
	    N_("The size of window title font in the tab bar.");
	o->type = CompOptionTypeInt;
	o->value.i = GROUP_TABBAR_FONTSIZE_DEFAULT;
	o->rest.i.min = GROUP_TABBAR_FONTSIZE_MIN;
	o->rest.i.max = GROUP_TABBAR_FONTSIZE_MAX;

	o = &gs->opt[GROUP_SCREEN_OPTION_TABBAR_FONTCOLOR];
	o->name = "tabbar_font_color";
	o->group = N_("Tabbing");
	o->subGroup = N_("Window title font");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Font Color");
	o->longDesc = N_("The color of the window title in the tab bar.");
	o->type = CompOptionTypeColor;
	o->value.c[0] = GROUP_COLOR_TABBAR_FONT_RED_DEFAULT;
	o->value.c[1] = GROUP_COLOR_TABBAR_FONT_GREEN_DEFAULT;
	o->value.c[2] = GROUP_COLOR_TABBAR_FONT_BLUE_DEFAULT;
	o->value.c[3] = GROUP_COLOR_TABBAR_FONT_ALPHA_DEFAULT;

	o = &gs->opt[GROUP_SCREEN_OPTION_MOVE];
	o->name = "move";
	o->group = N_("General");
	o->subGroup = N_("");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Move every window in the group");
	o->longDesc = N_("If one window in the group gets moved, "
			 "every other window in the group gets moved as well.");
	o->type = CompOptionTypeBool;
	o->value.b = GROUP_MOVE_DEFAULT;

	o = &gs->opt[GROUP_SCREEN_OPTION_RESIZE];
	o->name = "resize";
	o->group = N_("General");
	o->subGroup = N_("");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Resize every window in the group");
	o->longDesc = N_("If one window in the group gets resized, "
			 "every other window in the group gets resized as well.");
	o->type = CompOptionTypeBool;
	o->value.b = GROUP_RESIZE_DEFAULT;

	o = &gs->opt[GROUP_SCREEN_OPTION_RAISE];
	o->name = "raise";
	o->group = N_("General");
	o->subGroup = N_("");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Raise every window in the group");
	o->longDesc = N_("If one window in the group gets selected, "
			 "every window in the group gets raised.");
	o->type = CompOptionTypeBool;
	o->value.b = GROUP_RAISE_DEFAULT;

	o = &gs->opt[GROUP_SCREEN_OPTION_AUTO_GROUP];
	o->name = "auto_group";
	o->group = N_("General");
	o->subGroup = N_("");
	o->displayHints = "";
	o->advanced = True;
	o->shortDesc = N_("Group the windows after selection");
	o->longDesc = N_("If you have selected your windows,"
			 "this automatically groups them. "
			 "(Doesn't work with selection mode 'normal')");
	o->type = CompOptionTypeBool;
	o->value.b = GROUP_AUTO_GROUP_DEFAULT;

	o = &gs->opt[GROUP_SCREEN_OPTION_AUTO_UNGROUP];
	o->name = "auto_ungroup";
	o->group = N_("General");
	o->subGroup = N_("");
	o->displayHints = "";
	o->advanced = True;
	o->shortDesc =
	    N_("Ungroup the windows if only one window is left");
	o->longDesc =
	    N_
	    ("If there is only 1 window in the group left, it will be ungrouped.");
	o->type = CompOptionTypeBool;
	o->value.b = GROUP_AUTO_UNGROUP_DEFAULT;

	o = &gs->opt[GROUP_SCREEN_OPTION_RELATIVE_DISTANCE];
	o->name = "relative_distance";
	o->group = N_("General");
	o->subGroup = N_("");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Compute distance relative");
	o->longDesc =
	    N_
	    ("The distance between the windows is computed relative to the window size. "
	     "This allows you to have windows staying next to eachother.");
	o->type = CompOptionTypeBool;
	o->value.b = GROUP_RELATIVE_DISTANCE_DEFAULT;

	o = &gs->opt[GROUP_SCREEN_OPTION_SELECTION_COLOR];
	o->name = "fill_color";
	o->group = N_("Selection");
	o->subGroup = N_("Colors");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Selection Color");
	o->longDesc = N_("Fill color of the selection.");
	o->type = CompOptionTypeColor;
	o->value.c[0] = GROUP_COLOR_SELECTION_RED_DEFAULT;
	o->value.c[1] = GROUP_COLOR_SELECTION_GREEN_DEFAULT;
	o->value.c[2] = GROUP_COLOR_SELECTION_BLUE_DEFAULT;
	o->value.c[3] = GROUP_COLOR_SELECTION_ALPHA_DEFAULT;

	o = &gs->opt[GROUP_SCREEN_OPTION_LINE_COLOR];
	o->name = "line_color";
	o->group = N_("Selection");
	o->subGroup = N_("Colors");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Line Color");
	o->longDesc = N_("Line color of the selection.");
	o->type = CompOptionTypeColor;
	o->value.c[0] = GROUP_COLOR_LINE_RED_DEFAULT;
	o->value.c[1] = GROUP_COLOR_LINE_GREEN_DEFAULT;
	o->value.c[2] = GROUP_COLOR_LINE_BLUE_DEFAULT;
	o->value.c[3] = GROUP_COLOR_LINE_ALPHA_DEFAULT;

	o = &gs->opt[GROUP_SCREEN_OPTION_TAB_FILL_COLOR];
	o->name = "tab_color";
	o->group = N_("Tabbing");
	o->subGroup = N_("Colors");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Tab Color");
	o->longDesc = N_("Fill color of the tab bar.");
	o->type = CompOptionTypeColor;
	o->value.c[0] = GROUP_COLOR_TAB_FILL_RED_DEFAULT;
	o->value.c[1] = GROUP_COLOR_TAB_FILL_GREEN_DEFAULT;
	o->value.c[2] = GROUP_COLOR_TAB_FILL_BLUE_DEFAULT;
	o->value.c[3] = GROUP_COLOR_TAB_FILL_ALPHA_DEFAULT;

	o = &gs->opt[GROUP_SCREEN_OPTION_TAB_BORDER_COLOR];
	o->name = "border_color";
	o->group = N_("Tabbing");
	o->subGroup = N_("Colors");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Tab Border Color");
	o->longDesc = N_("Border color of the tab bar.");
	o->type = CompOptionTypeColor;
	o->value.c[0] = GROUP_COLOR_TAB_BORDER_RED_DEFAULT;
	o->value.c[1] = GROUP_COLOR_TAB_BORDER_GREEN_DEFAULT;
	o->value.c[2] = GROUP_COLOR_TAB_BORDER_BLUE_DEFAULT;
	o->value.c[3] = GROUP_COLOR_TAB_BORDER_ALPHA_DEFAULT;

	o = &gs->opt[GROUP_SCREEN_OPTION_TAB_CREATE_MIPMAPS];
	o->name                 = "mipmaps";
	o->shortDesc        	= N_("Create mipmaps for thumbnails.");
	o->group                = N_("Tabbing");
	o->subGroup             = N_("Misc. Options");
	o->displayHints         = "";
	o->advanced 		= True;
	o->longDesc             = N_("Create mipmaps for thumbnails in the tab-bar.");
	o->type                 = CompOptionTypeBool;
	o->value.b              = GROUP_TAB_CREATE_MIPMAPS_DEFAULT;

	o = &gs->opt[GROUP_SCREEN_OPTION_GLOW];
	o->name                 = "glow";
	o->shortDesc        	= N_("Enable Glow");
	o->group                = N_("Glow");
	o->subGroup             = N_("");
	o->displayHints         = "";
	o->advanced 		= False;
	o->longDesc             = N_("Enable grouped window glowing.");
	o->type                 = CompOptionTypeBool;
	o->value.b              = GROUP_GLOW_DEFAULT;

	o = &gs->opt[GROUP_SCREEN_OPTION_GLOW_SIZE];
	o->name = "glow_size";
	o->group = N_("Glow");
	o->subGroup = N_("");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Glow size");
	o->longDesc =
	    N_("The size of the grouped window glow.");
	o->type = CompOptionTypeInt;
	o->value.i = GROUP_GLOW_SIZE_DEFAULT;
	o->rest.i.min = GROUP_GLOW_SIZE_MIN;
	o->rest.i.max = GROUP_GLOW_SIZE_MAX;

	o = &gs->opt[GROUP_SCREEN_OPTION_GLOW_TYPE];
	o->name = "glow_type";
	o->group = N_("Glow");
	o->subGroup = N_("");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Glow type");
	o->longDesc =
	    N_("The type of the glow.");
	o->type = CompOptionTypeString;
	o->value.s = strdup(glowTextureName[GROUP_GLOW_TYPE_DEFAULT]);
	o->rest.s.string = (char **) glowTextureName;
	o->rest.s.nString = nGlowTextureNames; 

	/* initialize glowType here to prevent code duplication in init.c */
	gs->glowType = GROUP_GLOW_TYPE_DEFAULT;
	
	o = &gs->opt[GROUP_SCREEN_OPTION_FADE_TIME];
	o->name = "fade_time";
	o->group = N_("Tabbing");
	o->subGroup = N_("Animation Options");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Fade time for tab-bar animations.");
	o->longDesc = N_("Duration (in s) of the fading animation of the tab-bar when unmapping / mapping it.");
	o->type = CompOptionTypeFloat;
	o->value.f = GROUP_FADE_TIME_DEFAULT;
	o->rest.f.min = GROUP_FADE_TIME_MIN;
	o->rest.f.max = GROUP_FADE_TIME_MAX;
	o->rest.f.precision = GROUP_FADE_TIME_PRECISION;

	o = &gs->opt[GROUP_SCREEN_OPTION_FADE_TEXT_TIME];
	o->name = "fade_text_time";
	o->group = N_("Tabbing");
	o->subGroup = N_("Animation Options");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Fade time for text animations.");
	o->longDesc = N_("Duration (in s) of the fading animation of the text when showing / hiding it.");
	o->type = CompOptionTypeFloat;
	o->value.f = GROUP_FADE_TEXT_TIME_DEFAULT;
	o->rest.f.min = GROUP_FADE_TEXT_TIME_MIN;
	o->rest.f.max = GROUP_FADE_TEXT_TIME_MAX;
	o->rest.f.precision = GROUP_FADE_TEXT_TIME_PRECISION;

	o = &gs->opt[GROUP_SCREEN_OPTION_VISIBILITY_TIME];
	o->name = "visibility_time";
	o->group = N_("Tabbing");
	o->subGroup = N_("Misc. Options");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Tab bar visibility time after tab change");
	o->longDesc = N_("Time (in s) the tab bar is visible after a tab change.");
	o->type = CompOptionTypeFloat;
	o->value.f = GROUP_VISIBILITY_TIME_DEFAULT;
	o->rest.f.min = GROUP_VISIBILITY_TIME_MIN;
	o->rest.f.max = GROUP_VISIBILITY_TIME_MAX;
	o->rest.f.precision = GROUP_VISIBILITY_TIME_PRECISION;
	
	o = &gs->opt[GROUP_SCREEN_OPTION_UNTAB_ON_CLOSE];
	o->name = "untab_on_close";
	o->group = N_("Tabbing");
	o->subGroup = N_("Misc. Options");
	o->displayHints = "";
	o->advanced = True;
	o->shortDesc = N_("Untab when closing the window.");
	o->longDesc = N_("Untab the group when closing the tabbed window, "
			 "instead of changing tab.");
	o->type = CompOptionTypeBool;
	o->value.b = GROUP_UNTAB_ON_CLOSE_DEFAULT;
	
	o = &gs->opt[GROUP_SCREEN_OPTION_CHANGE_ANIMATION_TIME];
	o->name = "change_animation_time";
	o->group = N_("Tabbing");
	o->subGroup = N_("Animation Options");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Change Tab Animation Duration");
	o->longDesc =
	    N_("The duration (in s) of the animation that happens when changing tabs.");
	o->type = CompOptionTypeFloat;
	o->value.f = GROUP_CHANGE_ANIMATION_TIME_DEFAULT;
	o->rest.f.min = GROUP_CHANGE_ANIMATION_TIME_MIN;
	o->rest.f.max = GROUP_CHANGE_ANIMATION_TIME_MAX;
	o->rest.f.precision = GROUP_CHANGE_ANIMATION_TIME_PRECISION;

	o = &gs->opt[GROUP_SCREEN_OPTION_TAB_DRAG_HOVER_TIME];
	o->name = "drag_hover_time";
	o->group = N_("Tabbing");
	o->subGroup = N_("Slot dragging");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Hover time for slot dragging");
	o->longDesc = N_("Timespan (in s) after which a grouped window is activated if " 
		"a window of another group is dragged over it.");
	o->type = CompOptionTypeFloat;
	o->value.f = GROUP_TAB_DRAG_HOVER_TIME_DEFAULT;
	o->rest.f.min = GROUP_TAB_DRAG_HOVER_TIME_MIN;
	o->rest.f.max = GROUP_TAB_DRAG_HOVER_TIME_MAX;
	o->rest.f.precision = GROUP_TAB_DRAG_HOVER_TIME_PRECISION;

	o = &gs->opt[GROUP_SCREEN_OPTION_TAB_DRAG_SPRING_K];
	o->name = "drag_spring_k";
	o->group = N_("Tabbing");
	o->subGroup = N_("Slot dragging");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Slot drag Spring K");
	o->longDesc = N_("Spring Konstant used for slot dragging.");
	o->type = CompOptionTypeFloat;
	o->value.f = GROUP_TAB_DRAG_SPRING_K_DEFAULT;
	o->rest.f.min = GROUP_TAB_DRAG_SPRING_K_MIN;
	o->rest.f.max = GROUP_TAB_DRAG_SPRING_K_MAX;
	o->rest.f.precision = GROUP_TAB_DRAG_SPRING_K_PRECISION;

	o = &gs->opt[GROUP_SCREEN_OPTION_TAB_DRAG_FRICTION];
	o->name = "drag_friction";
	o->group = N_("Tabbing");
	o->subGroup = N_("Slot dragging");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Slot drag friction");
	o->longDesc = N_("Spring friction for slot dragging.");
	o->type = CompOptionTypeFloat;
	o->value.f = GROUP_TAB_DRAG_FRICTION_DEFAULT;
	o->rest.f.min = GROUP_TAB_DRAG_FRICTION_MIN;
	o->rest.f.max = GROUP_TAB_DRAG_FRICTION_MAX;
	o->rest.f.precision = GROUP_TAB_DRAG_FRICTION_PRECISION;

	o = &gs->opt[GROUP_SCREEN_OPTION_TAB_DRAG_Y_DISTANCE];
	o->name = "drag_y_distance";
	o->group = N_("Tabbing");
	o->subGroup = N_("Slot dragging");
	o->displayHints = "";
	o->advanced = True;
	o->shortDesc = N_("Y distance for spring model");
	o->longDesc = N_("Distance (in pixels) between the tab bar and the"
		"dragged slot for applying the spring model. If the distance"
		"is larger than that value, the model isn't applied.");
	o->type = CompOptionTypeInt;
	o->value.i = GROUP_TAB_DRAG_Y_DISTANCE_DEFAULT;
	o->rest.i.min = GROUP_TAB_DRAG_Y_DISTANCE_MIN;
	o->rest.i.max = GROUP_TAB_DRAG_Y_DISTANCE_MAX;

	o = &gs->opt[GROUP_SCREEN_OPTION_TAB_DRAG_SPEED_LIMIT];
	o->name = "drag_speed_limit";
	o->group = N_("Tabbing");
	o->subGroup = N_("Slot dragging");
	o->displayHints = "";
	o->advanced = True;
	o->shortDesc = N_("Speed limit");
	o->longDesc = N_("Mouse pointer movement speed limit (in pixels/secons)"
		"for the spring model.");
	o->type = CompOptionTypeInt;
	o->value.i = GROUP_TAB_DRAG_SPEED_LIMIT_DEFAULT;
	o->rest.i.min = GROUP_TAB_DRAG_SPEED_LIMIT_MIN;
	o->rest.i.max = GROUP_TAB_DRAG_SPEED_LIMIT_MAX;

	o = &gs->opt[GROUP_SCREEN_OPTION_SPRING_MODEL_ON_MOVE];
	o->name = "spring_model_on_move";
	o->group = N_("Tabbing");
	o->subGroup = N_("Slot dragging");
	o->displayHints = "";
	o->advanced = True;
	o->shortDesc = N_("Spring model on move");
	o->longDesc = N_("Use spring model for the tab-bar when moving the window.");
	o->type = CompOptionTypeBool;
	o->value.b = GROUP_SPRING_MODEL_ON_MOVE_DEFAULT;
	
	o=&gs->opt[GROUP_SCREEN_OPTION_AUTOTAB];
	o->name="autotab_create";
	o->group = N_("Tabbing");
	o->subGroup = N_("Misc. Options");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Autotab windows on creation");
	o->longDesc = N_("Autotab windows with themselves on window creation");
	o->type = CompOptionTypeBool;
	o->value.b = GROUP_AUTOTAB_DEFAULT;
	
	o = &gs->opt[GROUP_SCREEN_OPTION_DND_UNGROUP_WINDOW];
	o->name = "dnd_ungroup_window";
	o->group = N_("Tabbing");
	o->subGroup = N_("Slot dragging");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Remove window from group after dropping it outside a tab-bar.");
	o->longDesc = N_("Remove window from group after droping it outside a tab-bar.");
	o->type = CompOptionTypeBool;
	o->value.b = GROUP_DND_UNGROUP_WINDOW_DEFAULT;

	o = &gs->opt[GROUP_SCREEN_OPTION_RESIZE_UNMAXIMIZE];
	o->name = "resize_unmaximize";
	o->group = N_("General");
	o->subGroup = N_("");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Maximize/unmaximize with group.");
	o->longDesc = N_("Maximize/unmaximize with group.");
	o->type = CompOptionTypeBool;
	o->value.b = GROUP_RESIZE_UNMAXIMIZE_DEFAULT;

	o = &gs->opt[GROUP_SCREEN_OPTION_MINIMIZE_ALL];
	o->name = "minimize_all";
	o->group = N_("General");
	o->subGroup = N_("");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Minimize with group.");
	o->longDesc = N_("Minimize with group.");
	o->type = CompOptionTypeBool;
	o->value.b = GROUP_MINIMIZE_ALL_DEFAULT;

	o = &gs->opt[GROUP_SCREEN_OPTION_SHADE_ALL];
	o->name = "shade_all";
	o->group = N_("General");
	o->subGroup = N_("");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Shade with group.");
	o->longDesc = N_("Shade with group.");
	o->type = CompOptionTypeBool;
	o->value.b = GROUP_SHADE_ALL_DEFAULT;
}

/*
 * groupGetScreenOptions
 *
 */
CompOption *groupGetScreenOptions(CompScreen * s, int *count)
{
	if (s) {
		GROUP_SCREEN(s);

		*count = NUM_OPTIONS(gs);
		return gs->opt;
	} else {
		GroupScreen *gs = malloc(sizeof(GroupScreen));
		groupScreenInitOptions(gs);
		*count = NUM_OPTIONS(gs);
		return gs->opt;
	}
}


/*
 * groupSetScreenOption
 *
 */
Bool
groupSetScreenOption(CompScreen * s, char *name, CompOptionValue * value)
{

	CompOption *o;
	int index;

	GROUP_SCREEN(s);

	o = compFindOption(gs->opt, NUM_OPTIONS(gs), name, &index);
	if (!o)
		return FALSE;

	switch (index) {
	case GROUP_SCREEN_OPTION_TYPES:
		if (compSetOptionList(o, value)) {
			gs->wMask =
			    compWindowTypeMaskFromStringList(&o->value);
			return TRUE;
		}
		break;

	case GROUP_SCREEN_OPTION_SELECTION_COLOR:
	case GROUP_SCREEN_OPTION_LINE_COLOR:
	case GROUP_SCREEN_OPTION_TAB_FILL_COLOR:
	case GROUP_SCREEN_OPTION_TAB_BORDER_COLOR:
		if (compSetColorOption(o, value)) {
			return TRUE;
		}
		break;

	case GROUP_SCREEN_OPTION_TABBAR_FONTCOLOR:
		if (compSetColorOption(o, value)) {
			GroupSelection *group;

			for (group = gs->groups; group; group = group->next) 
				groupRenderWindowTitle(group);

			return TRUE;
		}
		break;

	case GROUP_SCREEN_OPTION_GLOW_TYPE:
		if (compSetStringOption(o, value)) {
			int i;
			for (i = 0; i < GlowTextureNum; i++) {
				if (strcmp (o->value.s, glowTextureName[i]) == 0) {
					if (i != gs->glowType) {
						gs->glowType = i;

						finiTexture (s, &gs->glowTexture);
 						initTexture (s, &gs->glowTexture);

 						RGBAimageToTexture (s, &gs->glowTexture, 
							glowTextureProperties[gs->glowType].textureData,
							glowTextureProperties[gs->glowType].textureSize,
							glowTextureProperties[gs->glowType].textureSize);

						if (gs->opt[GROUP_SCREEN_OPTION_GLOW].value.b && gs->groups) {
							groupRecomputeGlow (s);
							damageScreen (s);
						}
					}
					return TRUE;
				}
			}
		}
		break;

	case GROUP_SCREEN_OPTION_OPACITY:
	case GROUP_SCREEN_OPTION_BRIGHTNESS:
	case GROUP_SCREEN_OPTION_SATURATION:
	case GROUP_SCREEN_OPTION_PRECISION:
	case GROUP_SCREEN_OPTION_TAB_DRAG_Y_DISTANCE:
	case GROUP_SCREEN_OPTION_TAB_DRAG_SPEED_LIMIT:
		if (compSetIntOption(o, value)) {
			return TRUE;
		}
		break;
	
	case GROUP_SCREEN_OPTION_THUMB_SIZE:
	case GROUP_SCREEN_OPTION_BORDER_WIDTH:
		if (compSetIntOption(o, value)) {
			GroupSelection *group;
			
			for (group = gs->groups; group; group = group->next)
			{
				if(group->tabBar)
					groupRecalcTabBarPos(group, (group->tabBar->region->extents.x1 + group->tabBar->region->extents.x2) / 2,
					                            group->tabBar->region->extents.x1, group->tabBar->region->extents.x2);
			}
			
			return TRUE;
		}
		break;
	
	case GROUP_SCREEN_OPTION_BORDER_RADIUS:
		if (compSetIntOption(o, value)) {
			GroupSelection *group;
			
			for (group = gs->groups; group; group = group->next)
			{
				if(group->tabBar)
					groupRenderTabBarBackground(group);		
			}
			
			return TRUE;
		}
		break;

	case GROUP_SCREEN_OPTION_TABBAR_FONTSIZE:
		if (compSetIntOption(o, value)) {
			GroupSelection *group;
			for (group = gs->groups; group; group = group->next) {
				groupRenderWindowTitle(group);
			}
			return TRUE;
		}
		break;

	case GROUP_SCREEN_OPTION_TABBING_SPEED:
	case GROUP_SCREEN_OPTION_TABBING_TIMESTEP:
	case GROUP_SCREEN_OPTION_FADE_TIME:
	case GROUP_SCREEN_OPTION_FADE_TEXT_TIME:
	case GROUP_SCREEN_OPTION_VISIBILITY_TIME:
	case GROUP_SCREEN_OPTION_CHANGE_ANIMATION_TIME:
	case GROUP_SCREEN_OPTION_TAB_DRAG_HOVER_TIME:
	case GROUP_SCREEN_OPTION_TAB_DRAG_SPRING_K:
	case GROUP_SCREEN_OPTION_TAB_DRAG_FRICTION:
		if (compSetFloatOption(o, value)) {
			return TRUE;
		}
		break;

	case GROUP_SCREEN_OPTION_GLOW_SIZE:
		if (compSetIntOption(o, value)) {
			if (gs->opt[GROUP_SCREEN_OPTION_GLOW].value.b) {
				CompWindow *w;

				groupRecomputeGlow (s);

				for (w = s->windows; w; w = w->next) {
					GROUP_WINDOW (w);

					if (gw->glowQuads) {
						damageWindowOutputExtents (w);
						updateWindowOutputExtents (w);
						damageWindowOutputExtents (w);
					}
				}
			}
			return TRUE;
		}
		break;

	case GROUP_SCREEN_OPTION_GLOW:
		if (compSetBoolOption(o, value)) {
			CompWindow *w;

			groupRecomputeGlow (s);

			for (w = s->windows; w; w = w->next) {
				GROUP_WINDOW (w);

				if (gw->glowQuads) {
					damageWindowOutputExtents (w);
					updateWindowOutputExtents (w);
					damageWindowOutputExtents (w);
				}
			}
			return TRUE;
		}
		break;

	case GROUP_SCREEN_OPTION_MOVE:
	case GROUP_SCREEN_OPTION_RESIZE:
	case GROUP_SCREEN_OPTION_RAISE:
	case GROUP_SCREEN_OPTION_AUTO_UNGROUP:
	case GROUP_SCREEN_OPTION_AUTO_GROUP:
	case GROUP_SCREEN_OPTION_RELATIVE_DISTANCE:
	case GROUP_SCREEN_OPTION_TAB_CREATE_MIPMAPS:
	case GROUP_SCREEN_OPTION_UNTAB_ON_CLOSE:
	case GROUP_SCREEN_OPTION_SPRING_MODEL_ON_MOVE:
	case GROUP_SCREEN_OPTION_AUTOTAB:
	case GROUP_SCREEN_OPTION_DND_UNGROUP_WINDOW:
	case GROUP_SCREEN_OPTION_RESIZE_UNMAXIMIZE:
	case GROUP_SCREEN_OPTION_MINIMIZE_ALL:
	case GROUP_SCREEN_OPTION_SHADE_ALL:
		if (compSetBoolOption(o, value)) {
			return TRUE;
		}
		break;

	default:
		break;
	}

	return FALSE;
}

/*
 * groupDisplayInitOptions
 *
 */
void groupDisplayInitOptions(GroupDisplay * gd)
{
	CompOption *o;

	o = &gd->opt[GROUP_DISPLAY_OPTION_SELECT];
	o->name = "select";
	o->group = N_("Selection");
	o->subGroup = N_("Key bindings");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Select");
	o->longDesc = N_("The key for starting selecting windows.");
	o->type = CompOptionTypeAction;
	o->value.action.initiate = groupSelect;
	o->value.action.terminate = groupSelectTerminate;
	o->value.action.bell = FALSE;
	o->value.action.edgeMask = 0;
	o->value.action.state = CompActionStateInitButton;
	o->value.action.type = CompBindingTypeButton;
	o->value.action.button.modifiers = GROUP_SELECT_MODIFIERS_DEFAULT;
	o->value.action.button.button = GROUP_SELECT_BUTTON_DEFAULT;

	o = &gd->opt[GROUP_DISPLAY_OPTION_SELECT_SINGLE];
	o->name = "select_single";
	o->group = N_("Selection");
	o->subGroup = N_("Key bindings");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Select single window");
	o->longDesc = N_("The key for selecting the current window.");
	o->type = CompOptionTypeAction;
	o->value.action.initiate = groupSelectSingle;
	o->value.action.terminate = 0;
	o->value.action.bell = FALSE;
	o->value.action.edgeMask = 0;
	o->value.action.state = CompActionStateInitKey;
	o->value.action.type = CompBindingTypeKey;
	o->value.action.key.modifiers =
	    GROUP_SELECT_SINGLE_MODIFIERS_DEFAULT;
	o->value.action.key.keysym =
	    XStringToKeysym(GROUP_SELECT_SINGLE_KEY_DEFAULT);

	o = &gd->opt[GROUP_DISPLAY_OPTION_GROUPING];
	o->name = "group";
	o->group = N_("Grouping");
	o->subGroup = N_("Key bindings");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Group");
	o->longDesc = N_("The key for grouing windows.");
	o->type = CompOptionTypeAction;
	o->value.action.initiate = groupGroupWindows;
	o->value.action.terminate = 0;
	o->value.action.bell = FALSE;
	o->value.action.edgeMask = 0;
	o->value.action.state = CompActionStateInitKey;
	o->value.action.type = CompBindingTypeKey;
	o->value.action.key.modifiers = GROUP_GROUPING_MODIFIERS_DEFAULT;
	o->value.action.key.keysym =
	    XStringToKeysym(GROUP_GROUPING_KEY_DEFAULT);

	o = &gd->opt[GROUP_DISPLAY_OPTION_UNGROUPING];
	o->name = "ungroup";
	o->group = N_("Grouping");
	o->subGroup = N_("Key bindings");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Ungroup");
	o->longDesc = N_("The key for ungrouing windows.");
	o->type = CompOptionTypeAction;
	o->value.action.initiate = groupUnGroupWindows;
	o->value.action.terminate = 0;
	o->value.action.bell = FALSE;
	o->value.action.edgeMask = 0;
	o->value.action.state = CompActionStateInitKey;
	o->value.action.type = CompBindingTypeKey;
	o->value.action.key.modifiers = GROUP_UNGROUPING_MODIFIERS_DEFAULT;
	o->value.action.key.keysym =
	    XStringToKeysym(GROUP_UNGROUPING_KEY_DEFAULT);

	o = &gd->opt[GROUP_DISPLAY_OPTION_TABMODE];
	o->name = "tabmode";
	o->group = N_("Tabbing");
	o->subGroup = N_("Key bindings");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Tab");
	o->longDesc = N_("The key for entering the tab mode.");
	o->type = CompOptionTypeAction;
	o->value.action.initiate = groupInitTab;
	o->value.action.terminate = 0;
	o->value.action.bell = FALSE;
	o->value.action.edgeMask = 0;
	o->value.action.state = CompActionStateInitKey;
	o->value.action.type = CompBindingTypeKey;
	o->value.action.key.modifiers = GROUP_TABMODE_MODIFIERS_DEFAULT;
	o->value.action.key.keysym =
	    XStringToKeysym(GROUP_TABMODE_KEY_DEFAULT);

	o = &gd->opt[GROUP_DISPLAY_OPTION_CHANGE_TAB_LEFT];
	o->name = "change_tab_left";
	o->group = N_("Tabbing");
	o->subGroup = N_("Key bindings");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Change Tab Left");
	o->longDesc = N_("The key for changing the tab to the left.");
	o->type = CompOptionTypeAction;
	o->value.action.initiate = groupChangeTabLeft;
	o->value.action.terminate = 0;
	o->value.action.bell = FALSE;
	o->value.action.edgeMask = 0;
	o->value.action.state = CompActionStateInitKey;
	o->value.action.type = CompBindingTypeKey;
	o->value.action.key.modifiers = GROUP_CHANGE_TAB_LEFT_MODIFIERS_DEFAULT;
	o->value.action.key.keysym =
	    XStringToKeysym(GROUP_CHANGE_TAB_LEFT_KEY_DEFAULT);

	o = &gd->opt[GROUP_DISPLAY_OPTION_CHANGE_TAB_RIGHT];
	o->name = "change_tab_right";
	o->group = N_("Tabbing");
	o->subGroup = N_("Key bindings");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Change Tab Right");
	o->longDesc = N_("The key for changing the tab to the right.");
	o->type = CompOptionTypeAction;
	o->value.action.initiate = groupChangeTabRight;
	o->value.action.terminate = 0;
	o->value.action.bell = FALSE;
	o->value.action.edgeMask = 0;
	o->value.action.state = CompActionStateInitKey;
	o->value.action.type = CompBindingTypeKey;
	o->value.action.key.modifiers = GROUP_CHANGE_TAB_RIGHT_MODIFIERS_DEFAULT;
	o->value.action.key.keysym =
	    XStringToKeysym(GROUP_CHANGE_TAB_RIGHT_KEY_DEFAULT);

	o = &gd->opt[GROUP_DISPLAY_OPTION_REMOVING];
	o->name = "remove";
	o->group = N_("Grouping");
	o->subGroup = N_("Key bindings");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Remove Window");
	o->longDesc = N_("The key for removing the selected window.");
	o->type = CompOptionTypeAction;
	o->value.action.initiate = groupRemoveWindow;
	o->value.action.terminate = 0;
	o->value.action.bell = FALSE;
	o->value.action.edgeMask = 0;
	o->value.action.state = CompActionStateInitKey;
	o->value.action.type = CompBindingTypeKey;
	o->value.action.key.modifiers = GROUP_REMOVING_MODIFIERS_DEFAULT;
	o->value.action.key.keysym =
	    XStringToKeysym(GROUP_REMOVING_KEY_DEFAULT);

	o = &gd->opt[GROUP_DISPLAY_OPTION_CLOSING];
	o->name = "close";
	o->group = N_("Grouping");
	o->subGroup = N_("Key bindings");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Close Windows");
	o->longDesc = N_("The key for closing all windows in the group.");
	o->type = CompOptionTypeAction;
	o->value.action.initiate = groupCloseWindows;
	o->value.action.terminate = 0;
	o->value.action.bell = FALSE;
	o->value.action.edgeMask = 0;
	o->value.action.state = CompActionStateInitKey;
	o->value.action.type = CompBindingTypeKey;
	o->value.action.key.modifiers = GROUP_CLOSING_MODIFIERS_DEFAULT;
	o->value.action.key.keysym =
	    XStringToKeysym(GROUP_CLOSING_KEY_DEFAULT);

	o = &gd->opt[GROUP_DISPLAY_OPTION_IGNORE];
	o->name = "ignore";
	o->group = N_("Grouping");
	o->subGroup = N_("Key bindings");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Ignore Group");
	o->longDesc = N_("The key for ignoring the group."
			 "If this key is pressed you can resize/move a single"
			 "window in the group.");
	o->type = CompOptionTypeAction;
	o->value.action.initiate = groupSetIgnore;
	o->value.action.terminate = groupUnsetIgnore;
	o->value.action.bell = FALSE;
	o->value.action.edgeMask = 0;
	o->value.action.state = CompActionStateInitKey;
	o->value.action.type = CompBindingTypeKey;
	o->value.action.key.modifiers = GROUP_IGNORE_MODIFIERS_DEFAULT;
	o->value.action.key.keysym =
	    XStringToKeysym(GROUP_IGNORE_KEY_DEFAULT);

	o = &gd->opt[GROUP_DISPLAY_OPTION_CHANGE_COLOR];
	o->name = "change_color";
	o->group = N_("Glow");
	o->subGroup = N_("Key bindings");
	o->displayHints = "";
	o->advanced = False;
	o->shortDesc = N_("Change the glow color");
	o->longDesc =
	    N_("If you don't like the current color of the glow, with this key you can change it.");
	o->type = CompOptionTypeAction;
	o->value.action.initiate = groupChangeColor;
	o->value.action.terminate = 0;
	o->value.action.bell = FALSE;
	o->value.action.edgeMask = 0;
	o->value.action.state = CompActionStateInitKey;
	//o->value.action.type = CompBindingTypeKey;
	o->value.action.type = 0;
	o->value.action.key.modifiers =
	    GROUP_CHANGE_COLOR_MODIFIERS_DEFAULT;
	o->value.action.key.keysym =
	    XStringToKeysym(GROUP_CHANGE_COLOR_KEY_DEFAULT);
}

/*
 * groupGetDisplayOptions
 *
 */
CompOption *groupGetDisplayOptions(CompDisplay * d, int *count)
{
	if (d) {
		GROUP_DISPLAY(d);

		*count = NUM_OPTIONS(gd);
		return gd->opt;
	} else {
		GroupDisplay *gd = malloc(sizeof(GroupDisplay));
		groupDisplayInitOptions(gd);
		*count = NUM_OPTIONS(gd);
		return gd->opt;
	}
}

/*
 * groupSetDisplayOption
 *
 */
Bool
groupSetDisplayOption(CompDisplay * d, char *name, CompOptionValue * value)
{
	CompOption *o;
	int index;

	GROUP_DISPLAY(d);

	o = compFindOption(gd->opt, NUM_OPTIONS(gd), name, &index);
	if (!o)
		return FALSE;

	switch (index) {

	case GROUP_DISPLAY_OPTION_SELECT:
	case GROUP_DISPLAY_OPTION_SELECT_SINGLE:
	case GROUP_DISPLAY_OPTION_GROUPING:
	case GROUP_DISPLAY_OPTION_UNGROUPING:
	case GROUP_DISPLAY_OPTION_REMOVING:
	case GROUP_DISPLAY_OPTION_CLOSING:
	case GROUP_DISPLAY_OPTION_CHANGE_COLOR:
	case GROUP_DISPLAY_OPTION_IGNORE:
	case GROUP_DISPLAY_OPTION_TABMODE:
	case GROUP_DISPLAY_OPTION_CHANGE_TAB_LEFT:
	case GROUP_DISPLAY_OPTION_CHANGE_TAB_RIGHT:
		if (setDisplayAction(d, o, value))
			return TRUE;
		break;

	default:
		break;
	}

	return FALSE;
}


syntax highlighted by Code2HTML, v. 0.9.1