[gnome-panel] toplevel: turn handles into widget
- From: Alberts Muktupāvels <muktupavels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-panel] toplevel: turn handles into widget
- Date: Sun, 25 Apr 2021 12:00:16 +0000 (UTC)
commit 78b392af3d6a792a086c99cece946c286127bca1
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date: Sun Apr 25 14:53:20 2021 +0300
toplevel: turn handles into widget
gnome-panel/panel-toplevel.c | 190 +++++++++++++------------------------------
1 file changed, 56 insertions(+), 134 deletions(-)
---
diff --git a/gnome-panel/panel-toplevel.c b/gnome-panel/panel-toplevel.c
index ab53d344f..6a172e6a4 100644
--- a/gnome-panel/panel-toplevel.c
+++ b/gnome-panel/panel-toplevel.c
@@ -37,6 +37,7 @@
#include <libpanel-util/panel-glib.h>
#include "gp-arrow-button.h"
+#include "gp-handle.h"
#include "gp-theme.h"
#include "panel-xutils.h"
#include "panel-multiscreen.h"
@@ -56,7 +57,6 @@
#define MINIMUM_WIDTH 100
#define MAXIMUM_SIZE_SCREEN_RATIO 5
#define SNAP_TOLERANCE_FACTOR 6
-#define HANDLE_SIZE 10
typedef enum {
PANEL_STATE_NORMAL = 0,
@@ -142,6 +142,8 @@ struct _PanelToplevelPrivate {
GtkWidget *box;
GtkWidget *hide_button_start;
GtkWidget *hide_button_end;
+ GtkWidget *handle_start;
+ GtkWidget *handle_end;
gint n_autohide_disablers;
@@ -1305,6 +1307,36 @@ panel_toplevel_update_hide_buttons (PanelToplevel *toplevel)
}
}
+static GtkWidget *
+add_handle (PanelToplevel *self)
+{
+ GtkWidget *handle;
+
+ handle = gp_handle_new ();
+
+ g_object_bind_property (self,
+ "orientation",
+ handle,
+ "orientation",
+ G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
+
+ return handle;
+}
+
+static void
+update_handles (PanelToplevel *self)
+{
+ gtk_widget_hide (self->priv->handle_start);
+ gtk_widget_hide (self->priv->handle_end);
+
+ if (self->priv->expand ||
+ self->priv->buttons_enabled)
+ return;
+
+ gtk_widget_show (self->priv->handle_start);
+ gtk_widget_show (self->priv->handle_end);
+}
+
static gboolean
panel_toplevel_contains_pointer (PanelToplevel *toplevel)
{
@@ -1811,8 +1843,7 @@ calculate_minimum_height (GtkWidget *widget,
static int
panel_toplevel_update_size_from_hints (PanelToplevel *toplevel,
int requisition_size,
- int monitor_size,
- int non_panel_widget_size)
+ int monitor_size)
{
int nb_size_hints;
AppletSizeHints *applets_hints;
@@ -1822,7 +1853,7 @@ panel_toplevel_update_size_from_hints (PanelToplevel *toplevel,
int total_size;
int full_hints;
- total_size = non_panel_widget_size + requisition_size;
+ total_size = requisition_size;
nb_size_hints = toplevel->priv->panel_widget->nb_applets_size_hints;
if (nb_size_hints <= 0)
@@ -1916,7 +1947,6 @@ panel_toplevel_update_size (PanelToplevel *toplevel,
int width, height;
int size;
int minimum_height;
- int non_panel_widget_size;
if (toplevel->priv->animating)
return;
@@ -1927,12 +1957,6 @@ panel_toplevel_update_size (PanelToplevel *toplevel,
width = requisition->width;
height = requisition->height;
- if (!toplevel->priv->expand &&
- !toplevel->priv->buttons_enabled)
- non_panel_widget_size = 2 * HANDLE_SIZE;
- else
- non_panel_widget_size = 0;
-
minimum_height = calculate_minimum_height (GTK_WIDGET (toplevel),
toplevel->priv->orientation);
@@ -1948,8 +1972,7 @@ panel_toplevel_update_size (PanelToplevel *toplevel,
width = panel_toplevel_update_size_from_hints (
toplevel,
requisition->width,
- monitor_width,
- non_panel_widget_size);
+ monitor_width);
width = MAX (MINIMUM_WIDTH, width);
size = height;
@@ -1964,8 +1987,7 @@ panel_toplevel_update_size (PanelToplevel *toplevel,
height = panel_toplevel_update_size_from_hints (
toplevel,
requisition->height,
- monitor_height,
- non_panel_widget_size);
+ monitor_height);
height = MAX (MINIMUM_WIDTH, height);
size = width;
@@ -2281,123 +2303,6 @@ panel_toplevel_get_preferred_height(GtkWidget *widget, gint *minimal_height, gin
*minimal_height = *natural_height = requisition.height;
}
-static void
-panel_toplevel_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation)
-{
- PanelToplevel *toplevel = (PanelToplevel *) widget;
- GtkBin *bin = (GtkBin *) widget;
- GtkWidget *child;
- GtkAllocation challoc;
- GtkAllocation child_allocation;
-
- gtk_widget_set_allocation (widget, allocation);
-
- if (toplevel->priv->expand ||
- toplevel->priv->buttons_enabled)
- challoc = *allocation;
- else {
- if (toplevel->priv->orientation & PANEL_HORIZONTAL_MASK) {
- challoc.x = HANDLE_SIZE;
- challoc.y = 0;
- challoc.width = allocation->width - 2 * HANDLE_SIZE;
- challoc.height = allocation->height;
- } else {
- challoc.x = 0;
- challoc.y = HANDLE_SIZE;
- challoc.width = allocation->width;
- challoc.height = allocation->height - 2 * HANDLE_SIZE;
- }
- }
-
- challoc.width = MAX (1, challoc.width);
- challoc.height = MAX (1, challoc.height);
-
- child = gtk_bin_get_child (bin);
- gtk_widget_get_allocation (child, &child_allocation);
-
- if (gtk_widget_get_mapped (widget) &&
- (challoc.x != child_allocation.x ||
- challoc.y != child_allocation.y ||
- challoc.width != child_allocation.width ||
- challoc.height != child_allocation.height)) {
- GtkAllocation tmp;
-
- gtk_widget_get_allocation (widget, &tmp);
- gdk_window_invalidate_rect (gtk_widget_get_window (widget), &tmp, FALSE);
- }
-
- if (child && gtk_widget_get_visible (child))
- gtk_widget_size_allocate (child, &challoc);
-}
-
-static gboolean
-panel_toplevel_draw (GtkWidget *widget,
- cairo_t *cr)
-{
- PanelToplevel *toplevel = (PanelToplevel *) widget;
- gboolean retval = FALSE;
- GtkStyleContext *context;
- GtkStateFlags state;
- int awidth, aheight;
-
- if (GTK_WIDGET_CLASS (panel_toplevel_parent_class)->draw)
- retval = GTK_WIDGET_CLASS (panel_toplevel_parent_class)->draw (widget, cr);
-
- if (toplevel->priv->expand ||
- toplevel->priv->buttons_enabled)
- return retval;
-
- state = gtk_widget_get_state_flags (widget);
- awidth = gtk_widget_get_allocated_width (widget);
- aheight = gtk_widget_get_allocated_height (widget);
-
- context = gtk_widget_get_style_context (widget);
-
- gtk_style_context_save (context);
- gtk_style_context_set_state (context, state);
-
- if (toplevel->priv->orientation & PANEL_HORIZONTAL_MASK) {
- int x, y, width, height;
-
- x = 0;
- y = 0;
- width = HANDLE_SIZE;
- height = aheight;
-
- cairo_save (cr);
- gtk_render_handle (context, cr, x, y, width, height);
- cairo_restore (cr);
-
- x = awidth - HANDLE_SIZE;
-
- cairo_save (cr);
- gtk_render_handle (context, cr, x, y, width, height);
- cairo_restore (cr);
- } else {
- int x, y, width, height;
-
- x = 0;
- y = 0;
- width = awidth;
- height = HANDLE_SIZE;
-
- cairo_save (cr);
- gtk_render_handle (context, cr, x, y, width, height);
- cairo_restore (cr);
-
- y = aheight - HANDLE_SIZE;
-
- cairo_save (cr);
- gtk_render_handle (context, cr, x, y, width, height);
- cairo_restore (cr);
- }
-
- gtk_style_context_restore (context);
-
- return retval;
-}
-
static gboolean
panel_toplevel_button_press_event (GtkWidget *widget,
GdkEventButton *event)
@@ -3222,8 +3127,6 @@ panel_toplevel_class_init (PanelToplevelClass *klass)
widget_class->unrealize = panel_toplevel_unrealize;
widget_class->get_preferred_width = panel_toplevel_get_preferred_width;
widget_class->get_preferred_height = panel_toplevel_get_preferred_height;
- widget_class->size_allocate = panel_toplevel_size_allocate;
- widget_class->draw = panel_toplevel_draw;
widget_class->button_press_event = panel_toplevel_button_press_event;
widget_class->button_release_event = panel_toplevel_button_release_event;
widget_class->key_press_event = panel_toplevel_key_press_event;
@@ -3516,11 +3419,20 @@ panel_toplevel_setup_widgets (PanelToplevel *toplevel)
arrow = orientation == GTK_ORIENTATION_HORIZONTAL ? GTK_ARROW_RIGHT : GTK_ARROW_DOWN;
toplevel->priv->hide_button_end = add_hide_button (toplevel, arrow);
+ toplevel->priv->handle_start = add_handle (toplevel);
+ toplevel->priv->handle_end = add_handle (toplevel);
+
container = panel_widget_new (toplevel,
!toplevel->priv->expand,
orientation,
toplevel->priv->size);
+ gtk_box_pack_start (GTK_BOX (toplevel->priv->box),
+ toplevel->priv->handle_start,
+ FALSE,
+ FALSE,
+ 0);
+
gtk_box_pack_start (GTK_BOX (toplevel->priv->box),
toplevel->priv->hide_button_start,
FALSE,
@@ -3539,6 +3451,12 @@ panel_toplevel_setup_widgets (PanelToplevel *toplevel)
FALSE,
0);
+ gtk_box_pack_start (GTK_BOX (toplevel->priv->box),
+ toplevel->priv->handle_end,
+ FALSE,
+ FALSE,
+ 0);
+
toplevel->priv->panel_widget = PANEL_WIDGET (container);
gtk_widget_set_hexpand (container, TRUE);
@@ -3603,6 +3521,8 @@ panel_toplevel_init (PanelToplevel *toplevel)
toplevel->priv->box = NULL;
toplevel->priv->hide_button_start = NULL;
toplevel->priv->hide_button_end = NULL;
+ toplevel->priv->handle_start = NULL;
+ toplevel->priv->handle_end = NULL;
toplevel->priv->n_autohide_disablers = 0;
@@ -3861,6 +3781,7 @@ panel_toplevel_set_expand (PanelToplevel *toplevel,
gtk_widget_queue_resize (GTK_WIDGET (toplevel));
panel_widget_set_packed (toplevel->priv->panel_widget, !toplevel->priv->expand);
+ update_handles (toplevel);
g_object_notify (G_OBJECT (toplevel), "expand");
}
@@ -4179,6 +4100,7 @@ panel_toplevel_set_enable_buttons (PanelToplevel *toplevel,
toplevel->priv->buttons_enabled = enable_buttons;
panel_toplevel_update_hide_buttons (toplevel);
+ update_handles (toplevel);
g_object_notify (G_OBJECT (toplevel), "buttons-enabled");
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]