Skip to content

Commit fa5cde3

Browse files
info-cppsplukefromdc
authored andcommitted
Fix hide buttons make panel bigger
fix #733
1 parent 6bbc333 commit fa5cde3

File tree

1 file changed

+79
-44
lines changed

1 file changed

+79
-44
lines changed

mate-panel/panel-toplevel.c

Lines changed: 79 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1171,42 +1171,18 @@ panel_toplevel_add_hide_button (PanelToplevel *toplevel,
11711171
int left,
11721172
int top)
11731173
{
1174+
11741175
GtkWidget *button;
11751176
AtkObject *obj;
11761177
GtkWidget *arrow;
1177-
int arrow_size;
11781178

11791179
button = gtk_button_new ();
11801180
obj = gtk_widget_get_accessible (button);
11811181
atk_object_set_name (obj, _("Hide Panel"));
11821182
gtk_widget_set_can_default (button, FALSE);
11831183

1184-
gtk_widget_style_get (GTK_WIDGET (toplevel),
1185-
"arrow-size", &arrow_size,
1186-
NULL);
1187-
1188-
switch (arrow_type) {
1189-
case GTK_ARROW_UP:
1190-
gtk_widget_set_size_request (button, -1, arrow_size);
1191-
break;
1192-
case GTK_ARROW_DOWN:
1193-
gtk_widget_set_size_request (button, -1, arrow_size);
1194-
break;
1195-
case GTK_ARROW_LEFT:
1196-
gtk_widget_set_size_request (button, arrow_size, -1);
1197-
break;
1198-
case GTK_ARROW_RIGHT:
1199-
gtk_widget_set_size_request (button, arrow_size, -1);
1200-
break;
1201-
default:
1202-
g_assert_not_reached ();
1203-
break;
1204-
}
1205-
12061184
arrow = gtk_image_new ();
12071185
set_arrow_type (GTK_IMAGE (arrow), arrow_type);
1208-
gtk_widget_set_margin_start(GTK_WIDGET(arrow), 0);
1209-
gtk_widget_set_margin_end(GTK_WIDGET(arrow), 0);
12101186
gtk_container_add (GTK_CONTAINER (button), arrow);
12111187
gtk_widget_show (arrow);
12121188

@@ -1261,11 +1237,77 @@ static void panel_toplevel_update_buttons_showing(PanelToplevel* toplevel)
12611237
}
12621238
}
12631239

1240+
/* force set hide button size on panel size < 30px */
1241+
static void panel_toplevel_update_hide_buttons_size(GtkWidget* button, int panel_size)
1242+
{
1243+
1244+
GtkStyleContext *context = NULL;
1245+
context = gtk_widget_get_style_context(button);
1246+
gtk_style_context_add_class(context, "panel-button");
1247+
1248+
/* memory is managed by gtk */
1249+
GtkCssProvider *css_provider = NULL;
1250+
css_provider = gtk_css_provider_get_default ();
1251+
1252+
/* get arrow image */
1253+
GtkWidget *arrow = NULL;
1254+
arrow = gtk_bin_get_child (GTK_BIN (button));
1255+
1256+
/* get defaults from theme */
1257+
GtkSettings * settings = NULL;
1258+
settings = gtk_settings_get_default ();
1259+
gchar *gtk_theme_name = NULL;
1260+
g_object_get (settings, "gtk-theme-name", &gtk_theme_name, NULL);
1261+
css_provider = gtk_css_provider_get_named (gtk_theme_name, NULL);
1262+
g_free (gtk_theme_name);
1263+
1264+
1265+
/* set custom css by adding our custom code to the default theme css
1266+
*
1267+
* NOTE that contriary to the documentation:
1268+
* https://developer.gnome.org/gtk3/stable/GtkCssProvider.html#gtk-css-provider-load-from-data
1269+
* the previously loaded theme is NOT cleared from the css_provider. (reason unknown)
1270+
* In other words, this works exactly, how we need it here.
1271+
* ALSO NOTE that using gtk_css_provider_to_string () to convert the theme css data into a string
1272+
* and then adding the custom css, then adding this updated css to a css_provider
1273+
* with the gtk_css_provider_load_from_data () also works,
1274+
* however some themes can't be easily converted to strings, beacuse of the binary data
1275+
* they contain. This causes a delay of minutes in loading the mate-panel,
1276+
* and so this approach is not viable. */
1277+
if (panel_size < 30) {
1278+
gtk_css_provider_load_from_data (css_provider, ".panel-button {min-height: 13px; min-width: 13px; padding: 0px;}", -1, NULL);
1279+
}
1280+
1281+
1282+
gtk_style_context_add_provider (context, GTK_STYLE_PROVIDER (css_provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
1283+
1284+
/* set image size */
1285+
if (panel_size < 20) {
1286+
gtk_image_set_pixel_size (GTK_IMAGE (arrow), 12);
1287+
} else if (panel_size < 40) {
1288+
gtk_image_set_pixel_size (GTK_IMAGE (arrow), 16);
1289+
} else if (panel_size < 60) {
1290+
gtk_image_set_pixel_size (GTK_IMAGE (arrow), 24);
1291+
} else {
1292+
gtk_image_set_pixel_size (GTK_IMAGE (arrow), 32);
1293+
}
1294+
1295+
}
1296+
12641297
static void panel_toplevel_update_hide_buttons(PanelToplevel* toplevel)
12651298
{
1266-
if (toplevel->priv->buttons_enabled)
1299+
1300+
int panel_size = toplevel->priv->size;
1301+
1302+
if (toplevel->priv->buttons_enabled) {
12671303
panel_toplevel_update_buttons_showing (toplevel);
1268-
else {
1304+
1305+
panel_toplevel_update_hide_buttons_size (toplevel->priv->hide_button_top, panel_size);
1306+
panel_toplevel_update_hide_buttons_size (toplevel->priv->hide_button_bottom, panel_size);
1307+
panel_toplevel_update_hide_buttons_size (toplevel->priv->hide_button_left, panel_size);
1308+
panel_toplevel_update_hide_buttons_size (toplevel->priv->hide_button_right, panel_size);
1309+
1310+
} else {
12691311
g_object_set (
12701312
G_OBJECT (toplevel->priv->hide_button_top),
12711313
"visible", toplevel->priv->state == PANEL_STATE_HIDDEN_DOWN,
@@ -1285,35 +1327,26 @@ static void panel_toplevel_update_hide_buttons(PanelToplevel* toplevel)
12851327
}
12861328

12871329
if (toplevel->priv->arrows_enabled) {
1288-
int arrow_size;
12891330

12901331
gtk_widget_show (gtk_bin_get_child (GTK_BIN (toplevel->priv->hide_button_top)));
12911332
gtk_widget_show (gtk_bin_get_child (GTK_BIN (toplevel->priv->hide_button_bottom)));
12921333
gtk_widget_show (gtk_bin_get_child (GTK_BIN (toplevel->priv->hide_button_left)));
12931334
gtk_widget_show (gtk_bin_get_child (GTK_BIN (toplevel->priv->hide_button_right)));
12941335

1295-
gtk_widget_style_get (GTK_WIDGET (toplevel),
1296-
"arrow-size", &arrow_size,
1297-
NULL);
1298-
1299-
gtk_widget_set_size_request (toplevel->priv->hide_button_top,
1300-
-1, arrow_size);
1301-
gtk_widget_set_size_request (toplevel->priv->hide_button_bottom,
1302-
-1, arrow_size);
1303-
gtk_widget_set_size_request (toplevel->priv->hide_button_left,
1304-
arrow_size, -1);
1305-
gtk_widget_set_size_request (toplevel->priv->hide_button_right,
1306-
arrow_size, -1);
13071336
} else {
1337+
13081338
gtk_widget_hide (gtk_bin_get_child (GTK_BIN (toplevel->priv->hide_button_top)));
13091339
gtk_widget_hide (gtk_bin_get_child (GTK_BIN (toplevel->priv->hide_button_bottom)));
13101340
gtk_widget_hide (gtk_bin_get_child (GTK_BIN (toplevel->priv->hide_button_left)));
13111341
gtk_widget_hide (gtk_bin_get_child (GTK_BIN (toplevel->priv->hide_button_right)));
1342+
}
13121343

1313-
gtk_widget_set_size_request (toplevel->priv->hide_button_top, -1, -1);
1314-
gtk_widget_set_size_request (toplevel->priv->hide_button_bottom, -1, -1);
1315-
gtk_widget_set_size_request (toplevel->priv->hide_button_left, -1, -1);
1316-
gtk_widget_set_size_request (toplevel->priv->hide_button_right, -1, -1);
1344+
/* set size after setting the arrow */
1345+
if (toplevel->priv->buttons_enabled) {
1346+
gtk_widget_set_size_request (toplevel->priv->hide_button_top, panel_size, panel_size);
1347+
gtk_widget_set_size_request (toplevel->priv->hide_button_bottom, panel_size, panel_size);
1348+
gtk_widget_set_size_request (toplevel->priv->hide_button_left, panel_size, panel_size);
1349+
gtk_widget_set_size_request (toplevel->priv->hide_button_right, panel_size, panel_size);
13171350
}
13181351
}
13191352

@@ -5050,6 +5083,8 @@ panel_toplevel_set_size (PanelToplevel *toplevel,
50505083

50515084
gtk_widget_queue_resize (GTK_WIDGET (toplevel));
50525085

5086+
panel_toplevel_update_hide_buttons (toplevel);
5087+
50535088
g_object_notify (G_OBJECT (toplevel), "size");
50545089
}
50555090

0 commit comments

Comments
 (0)