summaryrefslogtreecommitdiff
path: root/src/emacsgtkfixed.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emacsgtkfixed.c')
-rw-r--r--src/emacsgtkfixed.c143
1 files changed, 49 insertions, 94 deletions
diff --git a/src/emacsgtkfixed.c b/src/emacsgtkfixed.c
index c83544f0d5e..f2c9fa7b7db 100644
--- a/src/emacsgtkfixed.c
+++ b/src/emacsgtkfixed.c
@@ -22,8 +22,11 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
#include "lisp.h"
#include "frame.h"
+#ifdef HAVE_PGTK
+#include "pgtkterm.h"
+#else
#include "xterm.h"
-#include "xwidget.h"
+#endif
#include "emacsgtkfixed.h"
/* Silence a bogus diagnostic; see GNOME bug 683906. */
@@ -47,7 +50,9 @@ static void emacs_fixed_get_preferred_width (GtkWidget *widget,
static void emacs_fixed_get_preferred_height (GtkWidget *widget,
gint *minimum,
gint *natural);
+#ifndef HAVE_PGTK
static GType emacs_fixed_get_type (void);
+#endif
G_DEFINE_TYPE (EmacsFixed, emacs_fixed, GTK_TYPE_FIXED)
static EmacsFixed *
@@ -57,92 +62,6 @@ EMACS_FIXED (GtkWidget *widget)
EmacsFixed);
}
-#ifdef HAVE_XWIDGETS
-
-static EmacsFixedClass *
-EMACS_FIXED_GET_CLASS (GtkWidget *widget)
-{
- return G_TYPE_INSTANCE_GET_CLASS (widget, emacs_fixed_get_type (),
- EmacsFixedClass);
-}
-
-struct GtkFixedPrivateL
-{
- GList *children;
-};
-
-static void
-emacs_fixed_gtk_widget_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation)
-{
- /* For xwidgets.
-
- This basically re-implements the base class method and adds an
- additional case for an xwidget view.
-
- It would be nicer if the bse class method could be called first,
- and the xview modification only would remain here. It wasn't
- possible to solve it that way yet. */
- EmacsFixedClass *klass;
- GtkWidgetClass *parent_class;
- struct GtkFixedPrivateL *priv;
-
- klass = EMACS_FIXED_GET_CLASS (widget);
- parent_class = g_type_class_peek_parent (klass);
- parent_class->size_allocate (widget, allocation);
-
- priv = G_TYPE_INSTANCE_GET_PRIVATE (widget, GTK_TYPE_FIXED,
- struct GtkFixedPrivateL);
-
- gtk_widget_set_allocation (widget, allocation);
-
- if (gtk_widget_get_has_window (widget))
- {
- if (gtk_widget_get_realized (widget))
- gdk_window_move_resize (gtk_widget_get_window (widget),
- allocation->x,
- allocation->y,
- allocation->width,
- allocation->height);
- }
-
- for (GList *children = priv->children; children; children = children->next)
- {
- GtkFixedChild *child = children->data;
-
- if (!gtk_widget_get_visible (child->widget))
- continue;
-
- GtkRequisition child_requisition;
- gtk_widget_get_preferred_size (child->widget, &child_requisition, NULL);
-
- GtkAllocation child_allocation;
- child_allocation.x = child->x;
- child_allocation.y = child->y;
-
- if (!gtk_widget_get_has_window (widget))
- {
- child_allocation.x += allocation->x;
- child_allocation.y += allocation->y;
- }
-
- child_allocation.width = child_requisition.width;
- child_allocation.height = child_requisition.height;
-
- struct xwidget_view *xv
- = g_object_get_data (G_OBJECT (child->widget), XG_XWIDGET_VIEW);
- if (xv)
- {
- child_allocation.width = xv->clip_right;
- child_allocation.height = xv->clip_bottom - xv->clip_top;
- }
-
- gtk_widget_size_allocate (child->widget, &child_allocation);
- }
-}
-
-#endif /* HAVE_XWIDGETS */
-
static void
emacs_fixed_class_init (EmacsFixedClass *klass)
{
@@ -152,9 +71,6 @@ emacs_fixed_class_init (EmacsFixedClass *klass)
widget_class->get_preferred_width = emacs_fixed_get_preferred_width;
widget_class->get_preferred_height = emacs_fixed_get_preferred_height;
-#ifdef HAVE_XWIDGETS
- widget_class->size_allocate = emacs_fixed_gtk_widget_size_allocate;
-#endif
g_type_class_add_private (klass, sizeof (EmacsFixedPrivate));
}
@@ -182,9 +98,15 @@ emacs_fixed_get_preferred_width (GtkWidget *widget,
{
EmacsFixed *fixed = EMACS_FIXED (widget);
EmacsFixedPrivate *priv = fixed->priv;
+#ifdef HAVE_PGTK
+ int w = priv->f->output_data.pgtk->size_hints.min_width;
+ if (minimum) *minimum = w;
+ if (natural) *natural = priv->f->output_data.pgtk->preferred_width;
+#else
int w = priv->f->output_data.x->size_hints.min_width;
if (minimum) *minimum = w;
if (natural) *natural = w;
+#endif
}
static void
@@ -194,12 +116,20 @@ emacs_fixed_get_preferred_height (GtkWidget *widget,
{
EmacsFixed *fixed = EMACS_FIXED (widget);
EmacsFixedPrivate *priv = fixed->priv;
+#ifdef HAVE_PGTK
+ int h = priv->f->output_data.pgtk->size_hints.min_height;
+ if (minimum) *minimum = h;
+ if (natural) *natural = priv->f->output_data.pgtk->preferred_height;
+#else
int h = priv->f->output_data.x->size_hints.min_height;
if (minimum) *minimum = h;
if (natural) *natural = h;
+#endif
}
+#ifndef HAVE_PGTK
+
/* Override the X function so we can intercept Gtk+ 3 calls.
Use our values for min_width/height so that KDE don't freak out
(Bug#8919), and so users can resize our frames as they wish. */
@@ -234,10 +164,33 @@ XSetWMSizeHints (Display *d,
if ((hints->flags & PMinSize) && f)
{
- int w = f->output_data.x->size_hints.min_width;
- int h = f->output_data.x->size_hints.min_height;
- data[5] = w;
- data[6] = h;
+ /* Overriding the size hints with our own values of min_width
+ and min_height used to work, but these days just results in
+ frames resizing unpredictably and emitting GTK warnings while
+ Emacs fights with GTK over the size of the frame. So instead
+ of doing that, just respect the hints set by GTK, but make
+ sure they are an integer multiple of the resize increments so
+ that bug#8919 stays fixed. */
+
+ /* int w = f->output_data.x->size_hints.min_width;
+ int h = f->output_data.x->size_hints.min_height;
+
+ data[5] = w;
+ data[6] = h; */
+
+ /* Make sure min_width and min_height are multiples of width_inc
+ and height_inc. */
+
+ if (hints->flags & PResizeInc)
+ {
+ /* Some versions of GTK set PResizeInc even if the
+ increments are at their initial values. */
+
+ if (hints->width_inc && data[5] % hints->width_inc)
+ data[5] += (hints->width_inc - (data[5] % hints->width_inc));
+ if (hints->height_inc && data[6] % hints->height_inc)
+ data[6] += (hints->height_inc - (data[6] % hints->height_inc));
+ }
}
XChangeProperty (d, w, prop, XA_WM_SIZE_HINTS, 32, PropModeReplace,
@@ -253,3 +206,5 @@ XSetWMNormalHints (Display *d, Window w, XSizeHints *hints)
{
XSetWMSizeHints (d, w, hints, XA_WM_NORMAL_HINTS);
}
+
+#endif