[mate-panel] 06/06: debian/patches: Add 0000_hidpi.patch. HiDPI support.

Martin Wimpress flexiondotorg-guest at moszumanska.debian.org
Tue Jan 23 16:43:02 UTC 2018


This is an automated email from the git hooks/post-receive script.

flexiondotorg-guest pushed a commit to branch ubuntu/bionic
in repository mate-panel.

commit 857e49b5ba9e6de79a89a88d2e4095485811115b
Author: Martin Wimpress <martin.wimpress at ubuntu.com>
Date:   Tue Jan 23 16:37:03 2018 +0000

    debian/patches: Add 0000_hidpi.patch. HiDPI support.
---
 debian/patches/0000_hidpi.patch | 268 ++++++++++++++++++++++++++++++++++++++++
 debian/patches/series           |   1 +
 2 files changed, 269 insertions(+)

diff --git a/debian/patches/0000_hidpi.patch b/debian/patches/0000_hidpi.patch
new file mode 100644
index 0000000..6cc22c5
--- /dev/null
+++ b/debian/patches/0000_hidpi.patch
@@ -0,0 +1,268 @@
+diff --git a/mate-panel/main.c b/mate-panel/main.c
+index 06fdc2f4..4289c158 100644
+--- a/mate-panel/main.c
++++ b/mate-panel/main.c
+@@ -85,9 +85,6 @@ main (int argc, char **argv)
+ 
+ 	gtk_init (&argc, &argv);
+ 
+-    /* FIXME: High dpi scaling does not work... */
+-    gdk_x11_display_set_window_scale (gdk_display_get_default (), 1);
+-
+ 	error = NULL;
+ 	if (!g_option_context_parse (context, &argc, &argv, &error)) {
+ 		g_printerr ("%s\n", error->message);
+diff --git a/mate-panel/panel-run-dialog.c b/mate-panel/panel-run-dialog.c
+index e00d0c51..a696138e 100644
+--- a/mate-panel/panel-run-dialog.c
++++ b/mate-panel/panel-run-dialog.c
+@@ -1695,6 +1695,7 @@ panel_run_dialog_setup_entry (PanelRunDialog *dialog,
+ 	GdkScreen             *screen;
+ 	int                    width_request;
+ 	GtkWidget             *entry;
++	gint                   scale;
+ 
+ 	dialog->combobox = PANEL_GTK_BUILDER_GET (gui, "comboboxentry");
+ 
+@@ -1707,9 +1708,10 @@ panel_run_dialog_setup_entry (PanelRunDialog *dialog,
+ 		(GTK_COMBO_BOX (dialog->combobox), 0);
+ 
+ 	screen = gtk_window_get_screen (GTK_WINDOW (dialog->run_dialog));
++	scale = gtk_widget_get_scale_factor (GTK_WINDOW (dialog->run_dialog));
+ 
+         /* 1/4 the width of the first monitor should be a good value */
+-	width_request = panel_multiscreen_width (screen, 0) / 4;
++	width_request = panel_multiscreen_width (screen, 0) / (4 * scale);
+ 	g_object_set (G_OBJECT (dialog->combobox),
+ 		      "width_request", width_request,
+ 		      NULL);
+diff --git a/mate-panel/panel-struts.c b/mate-panel/panel-struts.c
+index 644dafb0..d59587e5 100644
+--- a/mate-panel/panel-struts.c
++++ b/mate-panel/panel-struts.c
+@@ -404,7 +404,8 @@ panel_struts_register_strut (PanelToplevel    *toplevel,
+ 			     PanelOrientation  orientation,
+ 			     int               strut_size,
+ 			     int               strut_start,
+-			     int               strut_end)
++			     int               strut_end,
++			     gint              scale)
+ {
+ 	PanelStrut *strut;
+ 	gboolean    new_strut = FALSE;
+@@ -440,24 +441,24 @@ panel_struts_register_strut (PanelToplevel    *toplevel,
+ 		strut->geometry.x      = strut->strut_start;
+ 		strut->geometry.y      = monitor_y;
+ 		strut->geometry.width  = strut->strut_end - strut->strut_start + 1;
+-		strut->geometry.height = strut->strut_size;
++		strut->geometry.height = strut->strut_size / scale;
+ 		break;
+ 	case PANEL_ORIENTATION_BOTTOM:
+ 		strut->geometry.x      = strut->strut_start;
+ 		strut->geometry.y      = monitor_y + monitor_height - strut->strut_size;
+ 		strut->geometry.width  = strut->strut_end - strut->strut_start + 1;
+-		strut->geometry.height = strut->strut_size;
++		strut->geometry.height = strut->strut_size / scale;
+ 		break;
+ 	case PANEL_ORIENTATION_LEFT:
+ 		strut->geometry.x      = monitor_x;
+ 		strut->geometry.y      = strut->strut_start;
+-		strut->geometry.width  = strut->strut_size;
++		strut->geometry.width  = strut->strut_size / scale;
+ 		strut->geometry.height = strut->strut_end - strut->strut_start + 1;
+ 		break;
+ 	case PANEL_ORIENTATION_RIGHT:
+ 		strut->geometry.x      = monitor_x + monitor_width - strut->strut_size;
+ 		strut->geometry.y      = strut->strut_start;
+-		strut->geometry.width  = strut->strut_size;
++		strut->geometry.width  = strut->strut_size / scale;
+ 		strut->geometry.height = strut->strut_end - strut->strut_start + 1;
+ 		break;
+ 	}
+diff --git a/mate-panel/panel-struts.h b/mate-panel/panel-struts.h
+index b96b93e6..e7d8185f 100644
+--- a/mate-panel/panel-struts.h
++++ b/mate-panel/panel-struts.h
+@@ -36,7 +36,8 @@ gboolean panel_struts_register_strut           (PanelToplevel    *toplevel,
+ 						PanelOrientation  orientation,
+ 						int               strut_size,
+ 						int               strut_start,
+-						int               strut_end);
++						int               strut_end,
++						gint              scale);
+ 
+ void     panel_struts_unregister_strut         (PanelToplevel    *toplevel);
+ 
+diff --git a/mate-panel/panel-toplevel.c b/mate-panel/panel-toplevel.c
+index 7aa61e42..26416e72 100644
+--- a/mate-panel/panel-toplevel.c
++++ b/mate-panel/panel-toplevel.c
+@@ -83,6 +83,7 @@ struct _PanelToplevelPrivate {
+ 	gboolean                expand;
+ 	PanelOrientation        orientation;
+ 	int                     size;
++	gint                    scale;
+ 
+ 	/* relative to the monitor origin */
+ 	int                     x;
+@@ -284,8 +285,15 @@ static GdkScreen* panel_toplevel_get_screen_geometry(PanelToplevel* toplevel, in
+ 
+ 	screen = gtk_window_get_screen(GTK_WINDOW(toplevel));
+ 
+-	*width  = WidthOfScreen (gdk_x11_screen_get_xscreen (screen));
+-	*height = HeightOfScreen (gdk_x11_screen_get_xscreen (screen));
++	/* To scale the panels up for HiDPI displays, we can either multiply a lot of
++	 * toplevel geometry attributes by the scale factor, then correct for all
++	 * sorts of awful misalignments and pretend it's all good. Or we can just
++	 * make this thing think that the screen is scaled down, and because GTK+
++	 * already scaled everything up without the panel knowing about it, the whole
++	 * thing somehow works well... sigh.
++	 * @see panel_toplevel_get_monitor_geometry() */
++	*width  = WidthOfScreen (gdk_x11_screen_get_xscreen (screen)) / toplevel->priv->scale;
++	*height = HeightOfScreen (gdk_x11_screen_get_xscreen (screen)) / toplevel->priv->scale;
+ 
+ 	return screen;
+ }
+@@ -299,17 +307,26 @@ static GdkScreen* panel_toplevel_get_monitor_geometry(PanelToplevel* toplevel, i
+ 
+ 	screen = gtk_window_get_screen(GTK_WINDOW(toplevel));
+ 
++	/* FIXME: When using a scale factor > 1, i suspect that these coordinates will probably break
++	 * something on multi-monitor displays. */
+ 	if (x) *x = panel_multiscreen_x(screen, toplevel->priv->monitor);
+ 	if (y) *y = panel_multiscreen_y(screen, toplevel->priv->monitor);
+ 
++	/* To scale the panels up for HiDPI displays, we can either multiply a lot of
++	 * toplevel geometry attributes by the scale factor, then correct for all
++	 * sorts of awful misalignments and pretend it's all good. Or we can just
++	 * make this thing think that the screen is scaled down, and because GTK+
++	 * already scaled everything up without the panel knowing about it, the whole
++	 * thing somehow works well... sigh.
++	 * @see panel_toplevel_get_screen_geometry() */
+ 	if (width)
+ 	{
+-		*width  = panel_multiscreen_width(screen, toplevel->priv->monitor);
++		*width  = panel_multiscreen_width(screen, toplevel->priv->monitor) / toplevel->priv->scale;
+ 	}
+ 
+ 	if (height)
+ 	{
+-		*height = panel_multiscreen_height(screen, toplevel->priv->monitor);
++		*height = panel_multiscreen_height(screen, toplevel->priv->monitor) / toplevel->priv->scale;
+ 	}
+ 
+ 	return screen;
+@@ -1504,6 +1521,10 @@ static gboolean panel_toplevel_update_struts(PanelToplevel* toplevel, gboolean e
+ 		}
+ 	}
+ 
++	/* Adjust strut size based on scale factor */
++	if (strut > 0)
++		strut += toplevel->priv->size * (toplevel->priv->scale - 1);
++
+ 	if (orientation != toplevel->priv->orientation) {
+ 		toplevel->priv->orientation = orientation;
+ 		g_object_notify (G_OBJECT (toplevel), "orientation");
+@@ -1519,7 +1540,8 @@ static gboolean panel_toplevel_update_struts(PanelToplevel* toplevel, gboolean e
+ 								orientation,
+ 								strut,
+ 								strut_start,
+-								strut_end);
++								strut_end,
++								toplevel->priv->scale);
+ 	else
+ 		panel_struts_unregister_strut (toplevel);
+ 
+@@ -2336,7 +2358,8 @@ panel_toplevel_update_size_from_hints (PanelToplevel  *toplevel,
+ 	int total_size;
+ 	int full_hints;
+ 
+-	total_size = non_panel_widget_size + requisition_size;
++	/* Scale down the size so that the panel only takes what it needs for the applets it has. */
++	total_size = non_panel_widget_size + (requisition_size / toplevel->priv->scale);
+ 
+ 	nb_size_hints = toplevel->priv->panel_widget->nb_applets_size_hints;
+ 	if (nb_size_hints <= 0)
+@@ -4317,7 +4340,7 @@ panel_toplevel_class_init (PanelToplevelClass *klass)
+ 	widget_class->button_press_event   = panel_toplevel_button_press_event;
+ 	widget_class->button_release_event = panel_toplevel_button_release_event;
+ #if GTK_CHECK_VERSION (3, 18, 0)
+-	widget_class->configure_event      = panel_toplevel_configure_event;	
++	widget_class->configure_event      = panel_toplevel_configure_event;
+ #endif
+ 	widget_class->key_press_event      = panel_toplevel_key_press_event;
+ 	widget_class->motion_notify_event  = panel_toplevel_motion_notify_event;
+@@ -4752,6 +4775,7 @@ panel_toplevel_init (PanelToplevel *toplevel)
+ 	toplevel->priv->expand          = TRUE;
+ 	toplevel->priv->orientation     = PANEL_ORIENTATION_BOTTOM;
+ 	toplevel->priv->size            = DEFAULT_SIZE;
++	toplevel->priv->scale           = gtk_widget_get_scale_factor (GTK_WIDGET (toplevel));
+ 	toplevel->priv->x               = 0;
+ 	toplevel->priv->y               = 0;
+ 	toplevel->priv->x_right         = -1;
+@@ -4826,6 +4850,7 @@ panel_toplevel_init (PanelToplevel *toplevel)
+ 	toplevel->priv->attach_hidden     = FALSE;
+ 	toplevel->priv->updated_geometry_initial = FALSE;
+ 	toplevel->priv->initial_animation_done   = FALSE;
++
+ #if GTK_CHECK_VERSION (3, 18, 0)
+ 	widget = GTK_WIDGET (toplevel);
+ 	gtk_widget_add_events (widget,
+diff --git a/mate-panel/panel-widget.c b/mate-panel/panel-widget.c
+index cedcbb21..ce9d88b0 100644
+--- a/mate-panel/panel-widget.c
++++ b/mate-panel/panel-widget.c
+@@ -1214,6 +1214,7 @@ panel_widget_get_preferred_size(GtkWidget	     *widget,
+ 	GList *list;
+ 	GList *ad_with_hints;
+ 	gboolean dont_fill;
++	gint scale;
+ 
+ 	g_return_if_fail(PANEL_IS_WIDGET(widget));
+ 	g_return_if_fail(minimum_size != NULL);
+@@ -1231,6 +1232,7 @@ panel_widget_get_preferred_size(GtkWidget	     *widget,
+ 	natural_size->height = minimum_size->height;
+ 
+ 	ad_with_hints = NULL;
++	scale = gtk_widget_get_scale_factor(widget);
+ 
+ 	for (list = panel->applet_list; list!=NULL; list = g_list_next(list)) {
+ 		AppletData *ad = list->data;
+@@ -1254,8 +1256,10 @@ panel_widget_get_preferred_size(GtkWidget	     *widget,
+ 
+ 			else if (panel->packed)
+ 			{
+-				minimum_size->width += child_min_size.width;
+-				natural_size->width += child_natural_size.width;
++				/* Just because everything is bigger when scaled up doesn't mean
++				 * that the applets need any less room when the panel is packed. */
++				minimum_size->width += child_min_size.width * scale;
++				natural_size->width += child_natural_size.width * scale;
+ 			}
+ 		} else {
+ 			if (minimum_size->width < child_min_size.width &&
+@@ -1271,8 +1275,10 @@ panel_widget_get_preferred_size(GtkWidget	     *widget,
+ 
+ 			else if (panel->packed)
+ 			{
+-				minimum_size->height += child_min_size.height;
+-				natural_size->height += child_natural_size.height;
++				/* Just because everything is bigger when scaled up doesn't mean
++				 * that the applets need any less room when the panel is packed. */
++				minimum_size->height += child_min_size.height * scale;
++				natural_size->height += child_natural_size.height * scale;
+ 			}
+ 		}
+ 	}
+@@ -1409,9 +1415,9 @@ panel_widget_size_allocate(GtkWidget *widget, GtkAllocation *allocation)
+ 	gtk_widget_set_allocation (widget, allocation);
+ 	if (gtk_widget_get_realized (widget))
+ 		gdk_window_move_resize (gtk_widget_get_window (widget),
+-					allocation->x, 
++					allocation->x,
+ 					allocation->y,
+-					allocation->width, 
++					allocation->width,
+ 					allocation->height);
+ 
+ 	if(panel->orient == GTK_ORIENTATION_HORIZONTAL)
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644
index 0000000..8f7d3a1
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1 @@
+0000_hidpi.patch

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-mate/mate-panel.git



More information about the pkg-mate-commits mailing list