[Xfce4-commits] <xfce4-panel:devel> * Move itembar enum type to the header for use in application.c. * Drop URI target since we're not going to use it anyway. * Add flag macros to private.h. * Introduce panel border flags and make it work properly.
Nick Schermer
nick at xfce.org
Tue Aug 11 20:22:31 CEST 2009
Updating branch refs/heads/devel
to 56876a55c129676671a7e72790c88da2454fd04d (commit)
from 31550205b53b19614a36aa60b013cf740a15f85f (commit)
commit 56876a55c129676671a7e72790c88da2454fd04d
Author: Nick Schermer <nick at xfce.org>
Date: Sat Jun 21 13:53:49 2008 +0200
* Move itembar enum type to the header for use in application.c.
* Drop URI target since we're not going to use it anyway.
* Add flag macros to private.h.
* Introduce panel border flags and make it work properly.
panel/panel-application.c | 9 +--
panel/panel-itembar.c | 13 +--
panel/panel-itembar.h | 6 +
panel/panel-private.h | 5 +
panel/panel-window.c | 256 +++++++++++++++++++++++++++++++++++----------
panel/panel-window.h | 9 ++
6 files changed, 226 insertions(+), 72 deletions(-)
diff --git a/panel/panel-application.c b/panel/panel-application.c
index 0d8c2e2..c967ef6 100644
--- a/panel/panel-application.c
+++ b/panel/panel-application.c
@@ -929,14 +929,9 @@ panel_application_drag_data_received (GtkWidget *itembar,
/* get the widget screen */
screen = gtk_widget_get_screen (itembar);
- /* TODO replace with enums */
switch (info)
{
- case 0:
- /* uri */
- break;
-
- case 1:
+ case PANEL_ITEMBAR_TARGET_PLUGIN_NAME:
if (G_LIKELY (selection_data->length > 0))
{
/* get the name from the selection data */
@@ -948,7 +943,7 @@ panel_application_drag_data_received (GtkWidget *itembar,
}
break;
- case 2:
+ case PANEL_ITEMBAR_TARGET_PLUGIN_WIDGET:
/* make the itembar sensitive again */
panel_application_windows_sensitive (application, TRUE);
diff --git a/panel/panel-itembar.c b/panel/panel-itembar.c
index 8363945..9d07332 100644
--- a/panel/panel-itembar.c
+++ b/panel/panel-itembar.c
@@ -114,19 +114,12 @@ enum
G_DEFINE_TYPE (PanelItembar, panel_itembar, GTK_TYPE_CONTAINER);
-/* todo move this */
-enum
-{
- TARGET_TEXT_URI_LIST,
- TARGET_PLUGIN_NAME,
- TARGET_PLUGIN_WIDGET
-};
+/* drop targets */
static const GtkTargetEntry drop_targets[] =
{
- { "text/uri-list", 0, TARGET_TEXT_URI_LIST, },
- { "application/x-xfce-panel-plugin-name", 0, TARGET_PLUGIN_NAME },
- { "application/x-xfce-panel-plugin-widget", 0, TARGET_PLUGIN_WIDGET },
+ { "application/x-xfce-panel-plugin-name", 0, PANEL_ITEMBAR_TARGET_PLUGIN_NAME },
+ { "application/x-xfce-panel-plugin-widget", 0, PANEL_ITEMBAR_TARGET_PLUGIN_WIDGET },
};
diff --git a/panel/panel-itembar.h b/panel/panel-itembar.h
index d7c1c5e..a583264 100644
--- a/panel/panel-itembar.h
+++ b/panel/panel-itembar.h
@@ -26,6 +26,12 @@ typedef struct _PanelItembarClass PanelItembarClass;
typedef struct _PanelItembar PanelItembar;
typedef struct _PanelItembarChild PanelItembarChild;
+enum
+{
+ PANEL_ITEMBAR_TARGET_PLUGIN_NAME,
+ PANEL_ITEMBAR_TARGET_PLUGIN_WIDGET
+};
+
#define PANEL_TYPE_ITEMBAR (panel_itembar_get_type ())
#define PANEL_ITEMBAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PANEL_TYPE_ITEMBAR, PanelItembar))
#define PANEL_ITEMBAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PANEL_TYPE_ITEMBAR, PanelItembarClass))
diff --git a/panel/panel-private.h b/panel/panel-private.h
index 853b6e5..bce78d2 100644
--- a/panel/panel-private.h
+++ b/panel/panel-private.h
@@ -22,6 +22,11 @@
G_BEGIN_DECLS
+/* handling flags */
+#define PANEL_SET_FLAG(flags,flag) G_STMT_START{ ((flags) |= (flag)); }G_STMT_END
+#define PANEL_UNSET_FLAG(flags,flag) G_STMT_START{ ((flags) &= ~(flag)); }G_STMT_END
+#define PANEL_HAS_FLAG(flags,flag) (((flags) & (flag)) != 0)
+
/* handling deprecated functions in gtk */
#if GTK_CHECK_VERSION (2,12,0)
#define _widget_set_tooltip_text(widget,text) gtk_widget_set_tooltip_text (widget, text)
diff --git a/panel/panel-window.c b/panel/panel-window.c
index 03ed0b2..82ebe69 100644
--- a/panel/panel-window.c
+++ b/panel/panel-window.c
@@ -58,13 +58,14 @@ static void panel_window_size_request (GtkWidget *widget, GtkRequisition *requis
static void panel_window_size_allocate (GtkWidget *widget, GtkAllocation *allocation);
static void panel_window_screen_changed (GtkWidget *widget, GdkScreen *previous_screen);
static void panel_window_paint_handle (PanelWindow *window, gboolean start, GtkStateType state, cairo_t *rc);
-static void panel_window_paint_border (PanelWindow *window, GtkStateType state, cairo_t *rc);
+static void panel_window_paint_borders (PanelWindow *window, GtkStateType state, cairo_t *rc);
static void panel_window_calculate_position (PanelWindow *window, gint width, gint height, gint *x, gint *y);
static void panel_window_working_area (PanelWindow *window, gint root_x, gint root_y, GdkRectangle *dest);
static gboolean panel_window_struts_are_possible (PanelWindow *window, gint x, gint y, gint width, gint height);
static void panel_window_struts_update (PanelWindow *window, gint x, gint y, gint width, gint height);
static void panel_window_set_colormap (PanelWindow *window);
static void panel_window_get_position (PanelWindow *window, gint *root_x, gint *root_y);
+static void panel_window_set_borders (PanelWindow *window);
enum
{
@@ -124,6 +125,9 @@ struct _PanelWindow
/* snapping edge of the window */
PanelWindowSnapEdge snap_edge;
+ /* the borders we're going to draw */
+ PanelWindowBorders borders;
+
/* whether we should apply struts for this screen position */
gint struts_possible;
@@ -247,6 +251,7 @@ panel_window_init (PanelWindow *window)
window->struts_possible = -1;
window->size = 48;
window->snap_edge = PANEL_SNAP_EGDE_NONE;
+ window->borders = 0;
window->span_monitors = FALSE;
window->length = 0.25;
window->horizontal = TRUE;
@@ -377,8 +382,8 @@ panel_window_expose_event (GtkWidget *widget,
panel_window_paint_handle (window, FALSE, state, cr);
}
- /* paint the panel border */
- panel_window_paint_border (window, state, cr);
+ /* paint the panel borders */
+ panel_window_paint_borders (window, state, cr);
/* destroy cairo context */
cairo_destroy (cr);
@@ -437,15 +442,16 @@ static gboolean
panel_window_motion_notify (GtkWidget *widget,
GdkEventMotion *event)
{
- PanelWindow *window = PANEL_WINDOW (widget);
- gint clamp_x, clamp_y;
- GdkScreen *screen;
- gint window_width, window_height;
- gint window_x, window_y;
- GdkRectangle area;
- gint snap_x, snap_y;
- guint snap_horizontal;
- guint snap_vertical;
+ PanelWindow *window = PANEL_WINDOW (widget);
+ gint clamp_x, clamp_y;
+ GdkScreen *screen;
+ gint window_width, window_height;
+ gint window_x, window_y;
+ GdkRectangle area;
+ gint snap_x, snap_y;
+ guint snap_horizontal;
+ guint snap_vertical;
+ PanelWindowSnapEdge snap_edge = PANEL_SNAP_EGDE_NONE;
if (window->drag_motion)
{
@@ -480,22 +486,20 @@ panel_window_motion_notify (GtkWidget *widget,
/* detect the snap mode */
if (snap_horizontal == SNAP_START)
- window->snap_edge = PANEL_SNAP_EGDE_W + snap_vertical;
+ snap_edge = PANEL_SNAP_EGDE_W + snap_vertical;
else if (snap_horizontal == SNAP_END)
- window->snap_edge = PANEL_SNAP_EGDE_E + snap_vertical;
+ snap_edge = PANEL_SNAP_EGDE_E + snap_vertical;
else if (snap_horizontal == SNAP_CENTER && snap_vertical == SNAP_START)
- window->snap_edge = PANEL_SNAP_EGDE_NC;
+ snap_edge = PANEL_SNAP_EGDE_NC;
else if (snap_horizontal == SNAP_CENTER && snap_vertical == SNAP_END)
- window->snap_edge = PANEL_SNAP_EGDE_SC;
+ snap_edge = PANEL_SNAP_EGDE_SC;
else if (snap_horizontal == SNAP_NONE && snap_vertical == SNAP_START)
- window->snap_edge = PANEL_SNAP_EGDE_N;
+ snap_edge = PANEL_SNAP_EGDE_N;
else if (snap_horizontal == SNAP_NONE && snap_vertical == SNAP_END)
- window->snap_edge = PANEL_SNAP_EGDE_S;
- else
- window->snap_edge = PANEL_SNAP_EGDE_NONE;
+ snap_edge = PANEL_SNAP_EGDE_S;
/* when snapping succeeded, set the snap coordinates for visual feedback */
- if (window->snap_edge != PANEL_SNAP_EGDE_NONE)
+ if (snap_edge != PANEL_SNAP_EGDE_NONE)
{
clamp_x = snap_x;
clamp_y = snap_y;
@@ -504,6 +508,16 @@ panel_window_motion_notify (GtkWidget *widget,
/* move and resize the window */
gdk_window_move_resize (widget->window, clamp_x, clamp_y, window_width, window_height);
+ /* if the snap edge changed, update the border */
+ if (window->snap_edge != snap_edge)
+ {
+ /* set the new value */
+ window->snap_edge = snap_edge;
+
+ /* update the borders */
+ panel_window_set_borders (window);
+ }
+
return TRUE;
}
@@ -572,6 +586,9 @@ panel_window_button_release_event (GtkWidget *widget,
/* release the pointer */
gdk_pointer_ungrab (event->time);
+ /* update the borders */
+ panel_window_set_borders (window);
+
/* update working area, struts and reallocate */
panel_window_screen_changed (widget, gtk_window_get_screen (GTK_WINDOW (widget)));
@@ -789,6 +806,7 @@ panel_window_size_request (GtkWidget *widget,
{
PanelWindow *window = PANEL_WINDOW (widget);
GtkRequisition child_requisition;
+ gint extra_width = 0, extra_height = 0;
if (GTK_WIDGET_REALIZED (widget))
{
@@ -802,31 +820,47 @@ panel_window_size_request (GtkWidget *widget,
if (window->locked == FALSE)
{
if (window->horizontal)
- child_requisition.width += HANDLE_SIZE_TOTAL;
+ extra_width += HANDLE_SIZE_TOTAL;
else
- child_requisition.height += HANDLE_SIZE_TOTAL;
+ extra_height += HANDLE_SIZE_TOTAL;
}
+ /* handle the borders */
+ if (PANEL_HAS_FLAG (window->borders, PANEL_BORDER_LEFT))
+ extra_width++;
+
+ /* handle the borders */
+ if (PANEL_HAS_FLAG (window->borders, PANEL_BORDER_RIGHT))
+ extra_width++;
+
+ /* handle the borders */
+ if (PANEL_HAS_FLAG (window->borders, PANEL_BORDER_TOP))
+ extra_height++;
+
+ /* handle the borders */
+ if (PANEL_HAS_FLAG (window->borders, PANEL_BORDER_BOTTOM))
+ extra_height++;
+
/* get the real allocated size */
if (window->horizontal)
{
/* calculate the panel width (fits content, fits on the screen, and extands to user size) */
- requisition->width = CLAMP (child_requisition.width,
+ requisition->width = CLAMP (child_requisition.width + extra_width,
window->working_area.width * window->length,
window->working_area.width);
/* set height based on user setting */
- requisition->height = window->size;
+ requisition->height = window->size + extra_height;
}
else
{
/* calculate the panel width (fits content, fits on the screen, and extands to user size) */
- requisition->height = CLAMP (child_requisition.height,
+ requisition->height = CLAMP (child_requisition.height + extra_height,
window->working_area.height * window->length,
window->working_area.height);
/* set width based on user setting */
- requisition->width = window->size;
+ requisition->width = window->size + extra_width;
}
}
}
@@ -931,7 +965,26 @@ panel_window_size_allocate (GtkWidget *widget,
/* set the child allocation */
child_allocation = *allocation;
- /* change to allocation to keep the handles free */
+ /* extract the border sizes from the allocation */
+ if (PANEL_HAS_FLAG (window->borders, PANEL_BORDER_LEFT))
+ {
+ child_allocation.x++;
+ child_allocation.width--;
+ }
+
+ if (PANEL_HAS_FLAG (window->borders, PANEL_BORDER_TOP))
+ {
+ child_allocation.y++;
+ child_allocation.height--;
+ }
+
+ if (PANEL_HAS_FLAG (window->borders, PANEL_BORDER_RIGHT))
+ child_allocation.width--;
+
+ if (PANEL_HAS_FLAG (window->borders, PANEL_BORDER_BOTTOM))
+ child_allocation.height--;
+
+ /* keep free space for the handles if needed */
if (window->locked == FALSE)
{
if (window->horizontal)
@@ -1073,49 +1126,69 @@ panel_window_paint_handle (PanelWindow *window,
static void
-panel_window_paint_border (PanelWindow *window,
- GtkStateType state,
- cairo_t *cr)
+panel_window_paint_borders (PanelWindow *window,
+ GtkStateType state,
+ cairo_t *cr)
{
GtkWidget *widget = GTK_WIDGET (window);
GtkAllocation *alloc = &(widget->allocation);
GdkColor *color;
gdouble alpha = window->is_composited ? window->background_alpha : 1.00;
- /* 1px line */
- cairo_set_line_width (cr, 2.0);
+ /* 1px line (1.5 results in a sharp 1px line) */
+ cairo_set_line_width (cr, 1.5);
- /* dark color */
- color = &(widget->style->dark[state]);
- xfce_panel_cairo_set_source_rgba (cr, color, alpha);
+ /* possibly save some time */
+ if (PANEL_HAS_FLAG (window->borders, (PANEL_BORDER_BOTTOM | PANEL_BORDER_RIGHT)))
+ {
+ /* dark color */
+ color = &(widget->style->dark[state]);
+ xfce_panel_cairo_set_source_rgba (cr, color, alpha);
- /* set start position to bottom left */
- cairo_move_to (cr, alloc->x, alloc->y + alloc->height);
+ /* move the cursor the the bottom left */
+ cairo_move_to (cr, alloc->x, alloc->y + alloc->height);
- /* bottom line */
- cairo_rel_line_to (cr, alloc->width, 0);
+ /* bottom line */
+ if (PANEL_HAS_FLAG (window->borders, PANEL_BORDER_BOTTOM))
+ cairo_rel_line_to (cr, alloc->width, 0);
+ else
+ cairo_rel_move_to (cr, alloc->width, 0);
- /* right line */
- cairo_rel_line_to (cr, 0, -alloc->height);
+ /* right line */
+ if (PANEL_HAS_FLAG (window->borders, PANEL_BORDER_RIGHT))
+ cairo_rel_line_to (cr, 0, -alloc->height);
+ else
+ cairo_rel_move_to (cr, 0, -alloc->height);
- /* stroke this part */
- cairo_stroke (cr);
+ /* stroke this part */
+ cairo_stroke (cr);
+ }
- /* light color */
- color = &(widget->style->light[state]);
- xfce_panel_cairo_set_source_rgba (cr, color, alpha);
+ /* possibly save some time */
+ if (PANEL_HAS_FLAG (window->borders, (PANEL_BORDER_TOP | PANEL_BORDER_LEFT)))
+ {
+ /* light color */
+ color = &(widget->style->light[state]);
+ xfce_panel_cairo_set_source_rgba (cr, color, alpha);
- /* set start position to bottom left */
- cairo_move_to (cr, alloc->x, alloc->y + alloc->height);
+ /* move the cursor the the bottom left */
+ cairo_move_to (cr, alloc->x, alloc->y + alloc->height);
- /* left line */
- cairo_rel_line_to (cr, 0, -alloc->height);
+ /* left line */
+ if (PANEL_HAS_FLAG (window->borders, PANEL_BORDER_LEFT))
+ cairo_rel_line_to (cr, 0, -alloc->height);
+ else
+ cairo_rel_move_to (cr, 0, -alloc->height);
- /* top line */
- cairo_rel_line_to (cr, alloc->width, 0);
+ /* top line */
+ if (PANEL_HAS_FLAG (window->borders, PANEL_BORDER_TOP))
+ cairo_rel_line_to (cr, alloc->width, 0);
+ else
+ cairo_rel_move_to (cr, alloc->width, 0);
- /* stroke the lines */
- cairo_stroke (cr);
+ /* stroke the lines */
+ cairo_stroke (cr);
+ }
}
@@ -1529,6 +1602,8 @@ panel_window_get_position (PanelWindow *window,
gint *root_x,
gint *root_y)
{
+ panel_return_if_fail (PANEL_IS_WINDOW (window));
+
/* get the window position of the visible window */
if (G_UNLIKELY (window->autohide_window
&& (window->autohide_status == HIDDEN || window->autohide_status == POPUP_QUEUED)))
@@ -1539,6 +1614,71 @@ panel_window_get_position (PanelWindow *window,
+static void
+panel_window_set_borders (PanelWindow *window)
+{
+ PanelWindowBorders borders = 0;
+
+ panel_return_if_fail (PANEL_IS_WINDOW (window));
+
+ if (window->horizontal)
+ {
+ /* only attempt to show the side borders if we're not filling the area */
+ if (window->length < 1.00)
+ {
+ /* show the left border if we don't snap to the left */
+ if (snap_edge_is_left (window->snap_edge) == FALSE)
+ PANEL_SET_FLAG (borders, PANEL_BORDER_LEFT);
+
+ /* show the right border if we don't snap to the right */
+ if (snap_edge_is_right (window->snap_edge) == FALSE)
+ PANEL_SET_FLAG (borders, PANEL_BORDER_RIGHT);
+ }
+
+ /* show the top border if not snapped to the top */
+ if (snap_edge_is_top (window->snap_edge) == FALSE)
+ PANEL_SET_FLAG (borders, PANEL_BORDER_TOP);
+
+ /* show the bottom border if not snapped to the bottom */
+ if (snap_edge_is_bottom (window->snap_edge) == FALSE)
+ PANEL_SET_FLAG (borders, PANEL_BORDER_BOTTOM);
+ }
+ else
+ {
+ /* only attempt to show the top borders if we're not filling the area */
+ if (window->length < 1.00)
+ {
+ /* show the top border if we don't snap to the top */
+ if (snap_edge_is_top (window->snap_edge) == FALSE)
+ PANEL_SET_FLAG (borders, PANEL_BORDER_TOP);
+
+ /* show the bottom border if we don't snap to the bottom */
+ if (snap_edge_is_bottom (window->snap_edge) == FALSE)
+ PANEL_SET_FLAG (borders, PANEL_BORDER_BOTTOM);
+ }
+
+ /* show the left border if not snapped to the left */
+ if (snap_edge_is_left (window->snap_edge) == FALSE)
+ PANEL_SET_FLAG (borders, PANEL_BORDER_LEFT);
+
+ /* show the right border if not snapped to the right */
+ if (snap_edge_is_right (window->snap_edge) == FALSE)
+ PANEL_SET_FLAG (borders, PANEL_BORDER_RIGHT);
+ }
+
+ /* set the new value and queue a resize if needed */
+ if (window->borders != borders)
+ {
+ /* set the new value */
+ window->borders = borders;
+
+ /* queue a resize */
+ gtk_widget_queue_resize (GTK_WIDGET (window));
+ }
+}
+
+
+
GtkWidget *
panel_window_new (void)
{
@@ -1617,6 +1757,9 @@ panel_window_set_snap_edge (PanelWindow *window,
/* set snap edge value */
window->snap_edge = snap_edge;
+ /* update the window borders */
+ panel_window_set_borders (window);
+
/* queue a resize */
gtk_widget_queue_resize (GTK_WIDGET (window));
}
@@ -1742,6 +1885,9 @@ panel_window_set_length (PanelWindow *window,
/* set new length */
window->length = length;
+ /* update the panel borders */
+ panel_window_set_borders (window);
+
/* resize */
gtk_widget_queue_resize (GTK_WIDGET (window));
}
diff --git a/panel/panel-window.h b/panel/panel-window.h
index 3698650..6e7b62e 100644
--- a/panel/panel-window.h
+++ b/panel/panel-window.h
@@ -26,6 +26,7 @@ G_BEGIN_DECLS
typedef struct _PanelWindowClass PanelWindowClass;
typedef struct _PanelWindow PanelWindow;
typedef enum _PanelWindowSnapEdge PanelWindowSnapEdge;
+typedef enum _PanelWindowBorders PanelWindowBorders;
#define PANEL_TYPE_WINDOW (panel_window_get_type ())
#define PANEL_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PANEL_TYPE_WINDOW, PanelWindow))
@@ -41,6 +42,7 @@ typedef enum _PanelWindowSnapEdge PanelWindowSnapEdge;
#define snap_edge_is_left(snap_edge) (snap_edge >= PANEL_SNAP_EGDE_W && snap_edge <= PANEL_SNAP_EGDE_SW)
#define snap_edge_is_right(snap_edge) (snap_edge >= PANEL_SNAP_EGDE_E && snap_edge <= PANEL_SNAP_EGDE_SE)
+#define PANEL_BORDER_ALL (PANEL_BORDER_LEFT | PANEL_BORDER_RIGHT | PANEL_BORDER_TOP | PANEL_BORDER_BOTTOM)
enum _PanelWindowSnapEdge
@@ -67,6 +69,13 @@ enum _PanelWindowSnapEdge
PANEL_SNAP_EGDE_S, /* 12 bottom */
};
+enum _PanelWindowBorders
+{
+ PANEL_BORDER_LEFT = 1 << 0,
+ PANEL_BORDER_RIGHT = 1 << 1,
+ PANEL_BORDER_TOP = 1 << 2,
+ PANEL_BORDER_BOTTOM = 1 << 3,
+};
GType panel_window_get_type (void) G_GNUC_CONST;
More information about the Xfce4-commits
mailing list