Skip to content

Commit 997488f

Browse files
fmuellnervkareh
authored andcommitted
theme: Add background functions for single buttons
With the existing background functions, single buttons can not be styled separately - on the left side, the style of the left button is picked, and the right button's style on the right side. As theme authors may want to add rounded corners to button groups as a whole, it makes sense to treat the case of a single button in a group differently. https://bugzilla.gnome.org/show_bug.cgi?id=635683 NOTE: Patch copied from mutter and adapted for metacity.
1 parent 33c75c2 commit 997488f

File tree

4 files changed

+53
-22
lines changed

4 files changed

+53
-22
lines changed

doc/theme-format.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@ This document has separate sections for each format version. You may
2222
want to read the document in reverse order, since the base features
2323
are discussed under version 1.
2424

25+
New Features in Theme Format Version 3.3
26+
========================================
27+
28+
Add two additional button background functions - left_single_background and
29+
right_single_background - for button groups with just a single button.
30+
2531
New Features in Theme Format Version 3.2
2632
========================================
2733

src/ui/theme-parser.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
* look out for.
3939
*/
4040
#define THEME_MAJOR_VERSION 3
41-
#define THEME_MINOR_VERSION 2
41+
#define THEME_MINOR_VERSION 3
4242
#define THEME_VERSION (1000 * THEME_MAJOR_VERSION + THEME_MINOR_VERSION)
4343

4444
#define MARCO_THEME_FILENAME_FORMAT "metacity-theme-%d.xml"

src/ui/theme.c

Lines changed: 41 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -731,14 +731,10 @@ meta_frame_layout_calc_geometry (const MetaFrameLayout *layout,
731731

732732
for (i = 0; i < n_left; i++)
733733
{
734-
if (i == 0) /* For the first button (From left to right) */
735-
{
736-
if (n_left > 1) /* Set left_left_background
737-
if we have more than one button */
738-
left_bg_rects[i] = &fgeom->left_left_background;
739-
else /* No background if we have only one single button */
740-
left_bg_rects[i] = &fgeom->left_single_background;
741-
}
734+
if (n_left == 1)
735+
left_bg_rects[i] = &fgeom->left_single_background;
736+
else if (i == 0)
737+
left_bg_rects[i] = &fgeom->left_left_background;
742738
else if (i == (n_left - 1))
743739
left_bg_rects[i] = &fgeom->left_right_background;
744740
else
@@ -747,14 +743,10 @@ meta_frame_layout_calc_geometry (const MetaFrameLayout *layout,
747743

748744
for (i = 0; i < n_right; i++)
749745
{
750-
if (i == (n_right - 1)) /* For the first button (From right to left) */
751-
{
752-
if (n_right > 1) /* Set right_right_background
753-
if we have more than one button */
754-
right_bg_rects[i] = &fgeom->right_right_background;
755-
else /* No background if we have only one single button */
756-
right_bg_rects[i] = &fgeom->right_single_background;
757-
}
746+
if (n_right == 1)
747+
right_bg_rects[i] = &fgeom->right_single_background;
748+
else if (i == (n_right - 1))
749+
right_bg_rects[i] = &fgeom->right_right_background;
758750
else if (i == 0)
759751
right_bg_rects[i] = &fgeom->right_left_background;
760752
else
@@ -4342,6 +4334,7 @@ map_button_state (MetaButtonType button_type,
43424334

43434335
/* Map position buttons to the corresponding function */
43444336
case META_BUTTON_TYPE_RIGHT_LEFT_BACKGROUND:
4337+
case META_BUTTON_TYPE_RIGHT_SINGLE_BACKGROUND:
43454338
if (fgeom->n_right_buttons > 0)
43464339
function = fgeom->button_layout.right_buttons[0];
43474340
break;
@@ -4354,6 +4347,7 @@ map_button_state (MetaButtonType button_type,
43544347
function = fgeom->button_layout.right_buttons[middle_bg_offset + 1];
43554348
break;
43564349
case META_BUTTON_TYPE_LEFT_LEFT_BACKGROUND:
4350+
case META_BUTTON_TYPE_LEFT_SINGLE_BACKGROUND:
43574351
if (fgeom->n_left_buttons > 0)
43584352
function = fgeom->button_layout.left_buttons[0];
43594353
break;
@@ -4391,10 +4385,19 @@ get_button (MetaFrameStyle *style,
43914385
parent = parent->parent;
43924386
}
43934387

4394-
/* We fall back to middle button backgrounds if we don't
4395-
* have the ones on the sides
4388+
/* We fall back to the side buttons if we don't have
4389+
* single button backgrounds, and to middle button
4390+
* backgrounds if we don't have the ones on the sides
43964391
*/
43974392

4393+
if (op_list == NULL &&
4394+
type == META_BUTTON_TYPE_LEFT_SINGLE_BACKGROUND)
4395+
return get_button (style, META_BUTTON_TYPE_LEFT_LEFT_BACKGROUND, state);
4396+
4397+
if (op_list == NULL &&
4398+
type == META_BUTTON_TYPE_RIGHT_SINGLE_BACKGROUND)
4399+
return get_button (style, META_BUTTON_TYPE_RIGHT_RIGHT_BACKGROUND, state);
4400+
43984401
if (op_list == NULL &&
43994402
(type == META_BUTTON_TYPE_LEFT_LEFT_BACKGROUND ||
44004403
type == META_BUTTON_TYPE_LEFT_RIGHT_BACKGROUND))
@@ -4470,6 +4473,10 @@ get_button_rect (MetaButtonType type,
44704473
*rect = fgeom->left_right_background;
44714474
break;
44724475

4476+
case META_BUTTON_TYPE_LEFT_SINGLE_BACKGROUND:
4477+
*rect = fgeom->left_single_background;
4478+
break;
4479+
44734480
case META_BUTTON_TYPE_RIGHT_LEFT_BACKGROUND:
44744481
*rect = fgeom->right_left_background;
44754482
break;
@@ -4482,6 +4489,10 @@ get_button_rect (MetaButtonType type,
44824489
*rect = fgeom->right_right_background;
44834490
break;
44844491

4492+
case META_BUTTON_TYPE_RIGHT_SINGLE_BACKGROUND:
4493+
*rect = fgeom->right_single_background;
4494+
break;
4495+
44854496
case META_BUTTON_TYPE_CLOSE:
44864497
*rect = fgeom->close_rect.visible;
44874498
break;
@@ -5983,12 +5994,16 @@ meta_button_type_from_string (const char *str, MetaTheme *theme)
59835994
return META_BUTTON_TYPE_LEFT_MIDDLE_BACKGROUND;
59845995
else if (strcmp ("left_right_background", str) == 0)
59855996
return META_BUTTON_TYPE_LEFT_RIGHT_BACKGROUND;
5997+
else if (strcmp ("left_single_background", str) == 0)
5998+
return META_BUTTON_TYPE_LEFT_SINGLE_BACKGROUND;
59865999
else if (strcmp ("right_left_background", str) == 0)
59876000
return META_BUTTON_TYPE_RIGHT_LEFT_BACKGROUND;
59886001
else if (strcmp ("right_middle_background", str) == 0)
59896002
return META_BUTTON_TYPE_RIGHT_MIDDLE_BACKGROUND;
59906003
else if (strcmp ("right_right_background", str) == 0)
59916004
return META_BUTTON_TYPE_RIGHT_RIGHT_BACKGROUND;
6005+
else if (strcmp ("right_single_background", str) == 0)
6006+
return META_BUTTON_TYPE_RIGHT_SINGLE_BACKGROUND;
59926007
else
59936008
return META_BUTTON_TYPE_LAST;
59946009
}
@@ -6024,12 +6039,16 @@ meta_button_type_to_string (MetaButtonType type)
60246039
return "left_middle_background";
60256040
case META_BUTTON_TYPE_LEFT_RIGHT_BACKGROUND:
60266041
return "left_right_background";
6042+
case META_BUTTON_TYPE_LEFT_SINGLE_BACKGROUND:
6043+
return "left_single_background";
60276044
case META_BUTTON_TYPE_RIGHT_LEFT_BACKGROUND:
60286045
return "right_left_background";
60296046
case META_BUTTON_TYPE_RIGHT_MIDDLE_BACKGROUND:
60306047
return "right_middle_background";
60316048
case META_BUTTON_TYPE_RIGHT_RIGHT_BACKGROUND:
60326049
return "right_right_background";
6050+
case META_BUTTON_TYPE_RIGHT_SINGLE_BACKGROUND:
6051+
return "right_single_background";
60336052
case META_BUTTON_TYPE_LAST:
60346053
break;
60356054
}
@@ -6889,6 +6908,10 @@ meta_theme_earliest_version_with_button (MetaButtonType type)
68896908
case META_BUTTON_TYPE_UNSTICK:
68906909
return 2000;
68916910

6911+
case META_BUTTON_TYPE_LEFT_SINGLE_BACKGROUND:
6912+
case META_BUTTON_TYPE_RIGHT_SINGLE_BACKGROUND:
6913+
return 3003;
6914+
68926915
default:
68936916
meta_warning("Unknown button %d\n", type);
68946917
return 1000;

src/ui/theme.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ struct _MetaFrameGeometry
185185

186186
/* used for a memset hack */
187187
#define ADDRESS_OF_BUTTON_RECTS(fgeom) (((char*)(fgeom)) + G_STRUCT_OFFSET (MetaFrameGeometry, close_rect))
188-
#define LENGTH_OF_BUTTON_RECTS (G_STRUCT_OFFSET (MetaFrameGeometry, right_right_background) + sizeof (GdkRectangle) - G_STRUCT_OFFSET (MetaFrameGeometry, close_rect))
188+
#define LENGTH_OF_BUTTON_RECTS (G_STRUCT_OFFSET (MetaFrameGeometry, right_single_background) + sizeof (GdkRectangle) - G_STRUCT_OFFSET (MetaFrameGeometry, close_rect))
189189

190190
/* The button rects (if changed adjust memset hack) */
191191
MetaButtonSpace close_rect;
@@ -200,14 +200,14 @@ struct _MetaFrameGeometry
200200
MetaButtonSpace unstick_rect;
201201

202202
#define MAX_MIDDLE_BACKGROUNDS (MAX_BUTTONS_PER_CORNER - 2)
203-
GdkRectangle left_single_background;
204203
GdkRectangle left_left_background;
205204
GdkRectangle left_middle_backgrounds[MAX_MIDDLE_BACKGROUNDS];
206205
GdkRectangle left_right_background;
207-
GdkRectangle right_single_background;
206+
GdkRectangle left_single_background;
208207
GdkRectangle right_left_background;
209208
GdkRectangle right_middle_backgrounds[MAX_MIDDLE_BACKGROUNDS];
210209
GdkRectangle right_right_background;
210+
GdkRectangle right_single_background;
211211
/* End of button rects (if changed adjust memset hack) */
212212

213213
/* Saved button layout */
@@ -595,9 +595,11 @@ typedef enum
595595
META_BUTTON_TYPE_LEFT_LEFT_BACKGROUND,
596596
META_BUTTON_TYPE_LEFT_MIDDLE_BACKGROUND,
597597
META_BUTTON_TYPE_LEFT_RIGHT_BACKGROUND,
598+
META_BUTTON_TYPE_LEFT_SINGLE_BACKGROUND,
598599
META_BUTTON_TYPE_RIGHT_LEFT_BACKGROUND,
599600
META_BUTTON_TYPE_RIGHT_MIDDLE_BACKGROUND,
600601
META_BUTTON_TYPE_RIGHT_RIGHT_BACKGROUND,
602+
META_BUTTON_TYPE_RIGHT_SINGLE_BACKGROUND,
601603
META_BUTTON_TYPE_CLOSE,
602604
META_BUTTON_TYPE_MAXIMIZE,
603605
META_BUTTON_TYPE_MINIMIZE,

0 commit comments

Comments
 (0)