@@ -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+
12641297static 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