Could This Patch Be Adapted For ROX?
Mark Williams <[email protected]>
| Newsgroups | gmane.comp.desktop.rox.user |
|---|---|
| Message-ID | <[email protected]> |
It's to make the panel in the xfce desktop transparent without making any panel launchers or widgets transparent too. ------------------------------------------------------------------------------ Come build with us! The BlackBerry(R) Developer Conference in SF, CA is the only developer event you need to attend this year. Jumpstart your developing skills, take BlackBerry mobile applications to market and stay ahead of the curve. Join us from November 9 - 12, 2009. Register now! http://p.sf.net/sfu/devconference _______________________________________________ rox-users mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/rox-users
panel-cairo-20070125.patch
(text/x-diff, 18 KB)
Index: libxfce4panel/xfce-panel-external-item.c
===================================================================
--- libxfce4panel/xfce-panel-external-item.c (revision 24752)
+++ libxfce4panel/xfce-panel-external-item.c (working copy)
@@ -133,6 +133,12 @@
iface->configure = xfce_external_panel_item_configure;
}
+static gboolean
+xfce_external_panel_item_expose(GtkWidget *widget, GdkEventExpose *event)
+{
+ return GTK_WIDGET_CLASS(xfce_external_panel_item_parent_class)->expose_event(widget, event);
+}
+
static void
xfce_external_panel_item_class_init (XfceExternalPanelItemClass * klass)
{
@@ -146,6 +152,8 @@
object_class->finalize = xfce_external_panel_item_finalize;
+ widget_class->expose_event = xfce_external_panel_item_expose;
+
widget_class->button_press_event =
xfce_external_panel_item_button_press_event;
}
@@ -166,6 +174,8 @@
priv->to_be_removed = FALSE;
priv->restart = FALSE;
priv->file = NULL;
+
+ gtk_widget_set_app_paintable(GTK_WIDGET(item), TRUE);
}
/* GObject */
Index: libxfce4panel/xfce-panel-external-plugin.c
===================================================================
--- libxfce4panel/xfce-panel-external-plugin.c (revision 24752)
+++ libxfce4panel/xfce-panel-external-plugin.c (working copy)
@@ -36,6 +36,8 @@
#include "xfce-panel-external-plugin.h"
#include "xfce-panel-plugin-messages.h"
+#define ALPHA 0.2
+
#define XFCE_EXTERNAL_PANEL_PLUGIN_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE ((o), XFCE_TYPE_EXTERNAL_PANEL_PLUGIN, \
XfceExternalPanelPluginPrivate))
@@ -174,18 +176,52 @@
iface->set_panel_hidden = xfce_external_panel_plugin_set_panel_hidden;
}
+static gboolean
+xfce_external_panel_plugin_expose(GtkWidget *widget, GdkEventExpose *event)
+{
+ cairo_t *cr;
+ GtkStyle *style;
+ double r,g,b;
+
+ cr = gdk_cairo_create (widget->window);
+
+ cairo_rectangle (cr, event->area.x,
+ event->area.y,
+ event->area.width,
+ event->area.height);
+ cairo_clip (cr);
+
+ cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
+
+ /* fully transparent */
+ style = gtk_widget_get_style (widget);
+ r = (double) style->bg[widget->state].red / (double) 65535;
+ g = (double) style->bg[widget->state].green / (double) 65535;
+ b = (double) style->bg[widget->state].blue / (double) 65535;
+ cairo_set_source_rgba (cr, r, g, b, ALPHA);
+ cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
+ cairo_paint (cr);
+
+ cairo_destroy (cr);
+
+ return GTK_WIDGET_CLASS(xfce_external_panel_plugin_parent_class)->expose_event(widget, event);
+}
+
static void
xfce_external_panel_plugin_class_init (XfceExternalPanelPluginClass * klass)
{
GObjectClass *object_class;
+ GtkWidgetClass *widget_class;
g_type_class_add_private (klass, sizeof (XfceExternalPanelPluginPrivate));
object_class = (GObjectClass *) klass;
+ widget_class = (GtkWidgetClass *) klass;
object_class->finalize = xfce_external_panel_plugin_finalize;
object_class->get_property = xfce_external_panel_plugin_get_property;
object_class->set_property = xfce_external_panel_plugin_set_property;
+ widget_class->expose_event = xfce_external_panel_plugin_expose;
/* properties */
@@ -219,6 +255,27 @@
priv->construct = NULL;
priv->socket_id = 0;
priv->expand = FALSE;
+
+ {
+ GtkWidget *widget;
+ GdkScreen *screen;
+ GdkColormap *colormap;
+
+ widget = GTK_WIDGET (plugin);
+
+ gtk_widget_set_app_paintable(widget, TRUE);
+
+ screen = gtk_widget_get_screen (widget);
+ colormap = gdk_screen_get_rgba_colormap (screen);
+
+ if (!colormap)
+ {
+ colormap = gdk_screen_get_rgb_colormap (screen);
+ g_debug (" No Alpha support \n");
+ }
+
+ gtk_widget_set_colormap (widget, colormap);
+ }
}
/* GObject */
Index: libxfce4panel/xfce-panel-window.c
===================================================================
--- libxfce4panel/xfce-panel-window.c (revision 24752)
+++ libxfce4panel/xfce-panel-window.c (working copy)
@@ -36,9 +36,10 @@
(G_TYPE_INSTANCE_GET_PRIVATE ((o), XFCE_TYPE_PANEL_WINDOW, \
XfcePanelWindowPrivate))
-#define DEFAULT_ORIENTATION GTK_ORIENTATION_HORIZONTAL
-#define DEFAULT_HANDLE_STYLE XFCE_HANDLE_STYLE_BOTH
-#define HANDLE_WIDTH 8
+#define DEFAULT_ORIENTATION GTK_ORIENTATION_HORIZONTAL
+#define DEFAULT_HANDLE_STYLE XFCE_HANDLE_STYLE_BOTH
+#define HANDLE_WIDTH 8
+#define ALPHA 0.2
enum
{
@@ -353,6 +354,26 @@
priv->right_border = TRUE;
priv->movable = TRUE;
+ {
+ GtkWidget *widget;
+ GdkScreen *screen;
+ GdkColormap *colormap;
+
+ widget = GTK_WIDGET (panel_window);
+
+ gtk_widget_set_app_paintable(widget, TRUE);
+
+ screen = gtk_widget_get_screen (widget);
+ colormap = gdk_screen_get_rgba_colormap (screen);
+
+ if (!colormap)
+ {
+ colormap = gdk_screen_get_rgb_colormap (screen);
+ g_debug (" No Alpha support \n");
+ }
+
+ gtk_widget_set_colormap (widget, colormap);
+ }
gtk_widget_set_events (GTK_WIDGET (panel_window),
gtk_widget_get_events (GTK_WIDGET (panel_window))
| GDK_BUTTON_MOTION_MASK
@@ -462,20 +483,31 @@
/* drawing, size and style */
static void
-_panel_window_paint_border (XfcePanelWindow * panel)
+_panel_window_paint_border (XfcePanelWindow * panel, cairo_t *cr)
{
- XfcePanelWindowPrivate *priv = XFCE_PANEL_WINDOW_GET_PRIVATE (panel);
- GdkWindow *window = GTK_WIDGET (panel)->window;
- GtkAllocation *a = &(GTK_WIDGET (panel)->allocation);
- GtkStyle *style = GTK_WIDGET (panel)->style;
- GtkStateType state_type = GTK_WIDGET_STATE (GTK_WIDGET (panel));
- int top, bottom, left, right;
+ XfcePanelWindowPrivate *priv = XFCE_PANEL_WINDOW_GET_PRIVATE (panel);
+// GdkWindow *window = GTK_WIDGET (panel)->window;
+ GtkAllocation *a = &(GTK_WIDGET (panel)->allocation);
+ GtkStyle *style = GTK_WIDGET (panel)->style;
+// GtkStateType state_type = GTK_WIDGET_STATE (GTK_WIDGET (panel));
+ int top, bottom, left, right;
+ double r, g, b;
+ GtkWidget *widget = GTK_WIDGET (panel);
- top = priv->top_border ? style->ythickness : 0;
- bottom = priv->bottom_border ? style->ythickness : 0;
- left = priv->left_border ? style->xthickness : 0;
- right = priv->right_border ? style->xthickness : 0;
-
+ top = priv->top_border ? 1 /*style->ythickness*/ : 0;
+ bottom = priv->bottom_border ? 1 /*style->ythickness*/ : 0;
+ left = priv->left_border ? 1 /*style->xthickness*/ : 0;
+ right = priv->right_border ? 1 /*style->xthickness*/ : 0;
+
+ cairo_set_line_width (cr, /* top > 1 ? 2.0 :*/ 1.0);
+ cairo_rectangle (cr, a->x, a->y, a->width, a->height);
+
+ r = (double) style->dark[widget->state].red / (double) 65535;
+ g = (double) style->dark[widget->state].green / (double) 65535;
+ b = (double) style->dark[widget->state].blue / (double) 65535;
+ cairo_set_source_rgba (cr, r, g, b, ALPHA);
+ cairo_stroke (cr);
+#if 0
/* Code based on gtk-xfce-engine-2 */
/* Attempt to explain the code below with some ASCII 'art'
@@ -615,17 +647,40 @@
x1, y1, x1, y2);
}
}
+#endif
}
static gint
xfce_panel_window_expose (GtkWidget * widget, GdkEventExpose * event)
{
- XfcePanelWindow *panel_window = XFCE_PANEL_WINDOW (widget);
+ cairo_t *cr;
+ GtkStyle *style;
+ double r,g,b;
+ XfcePanelWindow *panel_window = XFCE_PANEL_WINDOW (widget);
XfcePanelWindowPrivate *priv =
XFCE_PANEL_WINDOW_GET_PRIVATE (panel_window);
if (GTK_WIDGET_DRAWABLE (widget))
{
+ cr = gdk_cairo_create (widget->window);
+
+ cairo_rectangle (cr, event->area.x,
+ event->area.y,
+ event->area.width,
+ event->area.height);
+ cairo_clip (cr);
+
+ cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
+
+ /* fully transparent */
+ style = gtk_widget_get_style (widget);
+ r = (double) style->bg[widget->state].red / (double) 65535;
+ g = (double) style->bg[widget->state].green / (double) 65535;
+ b = (double) style->bg[widget->state].blue / (double) 65535;
+ cairo_set_source_rgba (cr, r, g, b, ALPHA);
+ cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
+ cairo_paint (cr);
+
if (GTK_BIN (widget)->child)
{
gtk_container_propagate_expose (GTK_CONTAINER (widget),
@@ -648,7 +703,9 @@
break;
}
- _panel_window_paint_border (panel_window);
+ _panel_window_paint_border (panel_window, cr);
+
+ cairo_destroy (cr);
}
return FALSE;
@@ -671,21 +728,21 @@
}
if (priv->top_border)
- requisition->height += widget->style->ythickness;
+ requisition->height += 1; //widget->style->ythickness;
if (priv->bottom_border)
- requisition->height += widget->style->ythickness;
+ requisition->height += 1; //widget->style->ythickness;
if (priv->left_border)
- requisition->width += widget->style->xthickness;
+ requisition->width += 1; //widget->style->xthickness;
if (priv->right_border)
- requisition->width += widget->style->xthickness;
+ requisition->width += 1; //widget->style->xthickness;
if (GTK_ORIENTATION_HORIZONTAL == priv->orientation)
{
- thick = 2 * widget->style->xthickness;
+ thick = 2; // * widget->style->xthickness;
}
else
{
- thick = 2 * widget->style->ythickness;
+ thick = 2; // * widget->style->ythickness;
}
switch (priv->handle_style)
@@ -749,9 +806,9 @@
int start_handle_size, end_handle_size, thick;
if (GTK_ORIENTATION_HORIZONTAL == priv->orientation)
- thick = 2 * widget->style->xthickness;
+ thick = 2; // * widget->style->xthickness;
else
- thick = 2 * widget->style->ythickness;
+ thick = 2; // * widget->style->ythickness;
start_handle_size = end_handle_size = 0;
@@ -774,21 +831,21 @@
if (priv->top_border)
{
- childalloc.y += widget->style->ythickness;
- childalloc.height -= widget->style->ythickness;
+ childalloc.y += 1; //widget->style->ythickness;
+ childalloc.height -= 1; //widget->style->ythickness;
}
if (priv->bottom_border)
- childalloc.height -= widget->style->ythickness;
+ childalloc.height -= 1; //widget->style->ythickness;
if (priv->left_border)
{
- childalloc.x += widget->style->xthickness;
- childalloc.width -= widget->style->xthickness;
+ childalloc.x += 1; //widget->style->xthickness;
+ childalloc.width -= 1; //widget->style->xthickness;
}
if (priv->right_border)
- childalloc.width -= widget->style->xthickness;
+ childalloc.width -= 1; //widget->style->xthickness;
if (priv->orientation == GTK_ORIENTATION_HORIZONTAL)
{
@@ -922,8 +979,8 @@
int x, y, w, h, xthick, ythick;
gboolean horizontal = priv->orientation == GTK_ORIENTATION_HORIZONTAL;
- xthick = widget->style->xthickness;
- ythick = widget->style->ythickness;
+ xthick = 1; //widget->style->xthickness;
+ ythick = 1; //widget->style->ythickness;
if (horizontal)
{
Index: libxfce4panel/xfce-panel-internal-plugin.c
===================================================================
--- libxfce4panel/xfce-panel-internal-plugin.c (revision 24752)
+++ libxfce4panel/xfce-panel-internal-plugin.c (working copy)
@@ -33,6 +33,8 @@
#include "xfce-panel-plugin-iface-private.h"
#include "xfce-panel-plugin-iface.h"
+#define ALPHA 0.2
+
#define XFCE_INTERNAL_PANEL_PLUGIN_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE ((o), XFCE_TYPE_INTERNAL_PANEL_PLUGIN, \
XfceInternalPanelPluginPrivate))
@@ -200,10 +202,39 @@
iface->focus_panel = xfce_internal_panel_plugin_focus_panel;
}
+static gboolean
+xfce_internal_panel_plugin_expose(GtkWidget *widget, GdkEventExpose *event)
+{
+ cairo_t *cr;
+ GtkStyle *style;
+ double r,g,b;
+
+ cr = gdk_cairo_create (widget->window);
+
+ cairo_rectangle (cr, event->area.x,
+ event->area.y,
+ event->area.width,
+ event->area.height);
+ cairo_clip (cr);
+
+ style = gtk_widget_get_style (widget);
+ r = (double) style->bg[widget->state].red / (double) 65535;
+ g = (double) style->bg[widget->state].green / (double) 65535;
+ b = (double) style->bg[widget->state].blue / (double) 65535;
+ cairo_set_source_rgba (cr, r, g, b, ALPHA);
+ cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
+ cairo_paint (cr);
+
+ cairo_destroy (cr);
+
+ return GTK_WIDGET_CLASS(xfce_internal_panel_plugin_parent_class)->expose_event(widget, event);
+}
+
static void
xfce_internal_panel_plugin_class_init (XfceInternalPanelPluginClass * klass)
{
GObjectClass *object_class;
+ GtkWidgetClass *widget_class;
g_type_class_add_private (klass, sizeof (XfceInternalPanelPluginPrivate));
@@ -213,6 +244,10 @@
object_class->get_property = xfce_internal_panel_plugin_get_property;
object_class->set_property = xfce_internal_panel_plugin_set_property;
+ widget_class = (GtkWidgetClass *) klass;
+
+ widget_class->expose_event = xfce_internal_panel_plugin_expose;
+
/* properties */
g_object_class_override_property (object_class, PROP_NAME, "name");
@@ -243,6 +278,8 @@
priv->size = 0;
priv->screen_position = XFCE_SCREEN_POSITION_NONE;
priv->expand = FALSE;
+
+ gtk_widget_set_app_paintable(GTK_WIDGET(plugin), TRUE);
}
/* GObject */
Index: plugins/separator/separator.c
===================================================================
--- plugins/separator/separator.c (revision 24752)
+++ plugins/separator/separator.c (working copy)
@@ -31,8 +31,9 @@
#include <libxfce4panel/xfce-panel-plugin.h>
#define SEPARATOR_WIDTH 10
-#define SEP_START 0.15
-#define SEP_END 0.85
+#define SEP_START 0.0
+#define SEP_END 1.0
+#define ALPHA 0.2
static void separator_properties_dialog (XfcePanelPlugin *plugin);
@@ -56,32 +57,65 @@
if (GTK_WIDGET_DRAWABLE (widget))
{
GtkAllocation *allocation = &(widget->allocation);
- int start, end, position;
+ int start, end, position;
+ cairo_t *cr;
+ GtkStyle *style;
+ double r,g,b;
+ style = gtk_widget_get_style (widget);
+ cr = gdk_cairo_create (widget->window);
+ cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
+
+ cairo_rectangle (cr, event->area.x,
+ event->area.y,
+ event->area.width,
+ event->area.height);
+ cairo_clip (cr);
+
+ r = (double) style->bg[widget->state].red / (double) 65535;
+ g = (double) style->bg[widget->state].green / (double) 65535;
+ b = (double) style->bg[widget->state].blue / (double) 65535;
+ cairo_set_source_rgba (cr, r, g, b, ALPHA);
+ cairo_paint (cr);
+
+ r = (double) style->dark[widget->state].red / (double) 65535;
+ g = (double) style->dark[widget->state].green / (double) 65535;
+ b = (double) style->dark[widget->state].blue / (double) 65535;
+ cairo_set_source_rgba (cr, r, g, b, 1.0 - ((1.0 - ALPHA) / 3));
+
if (xfce_panel_plugin_get_orientation (plugin) ==
GTK_ORIENTATION_HORIZONTAL)
{
start = allocation->y + SEP_START * allocation->height;
end = allocation->y + SEP_END * allocation->height;
position = allocation->x + allocation->width / 2;
-
- gtk_paint_vline (widget->style, widget->window,
+
+ cairo_move_to (cr, position, start);
+ cairo_line_to (cr, position, end);
+
+/* gtk_paint_vline (widget->style, widget->window,
GTK_STATE_NORMAL,
&(event->area), widget, "separator",
start, end, position);
- }
+*/ }
else
{
start = allocation->x + SEP_START * allocation->width;
end = allocation->x + SEP_END * allocation->width;
position = allocation->y + allocation->height / 2;
- gtk_paint_hline (widget->style, widget->window,
+ cairo_move_to (cr, start, position);
+ cairo_line_to (cr, end, position);
+
+/* gtk_paint_hline (widget->style, widget->window,
GTK_STATE_NORMAL,
&(event->area), widget, "separator",
start, end, position);
- }
+*/ }
+ cairo_stroke (cr);
+ cairo_destroy (cr);
+
return TRUE;
}
@@ -91,12 +125,28 @@
static void
separator_add_widget (XfcePanelPlugin *plugin)
{
- GtkWidget *widget;
+ GtkWidget *widget;
+ GdkScreen *screen;
+ GdkColormap *colormap;
widget = gtk_drawing_area_new ();
+
+ gtk_widget_set_app_paintable(widget, TRUE);
+
+ screen = gtk_widget_get_screen (widget);
+ colormap = gdk_screen_get_rgba_colormap (screen);
+
+ if (!colormap)
+ {
+ colormap = gdk_screen_get_rgb_colormap (screen);
+ g_debug (" No Alpha support \n");
+ }
+
+ gtk_widget_set_colormap (widget, colormap);
+
gtk_widget_show (widget);
gtk_container_add (GTK_CONTAINER (plugin), widget);
-
+
g_signal_connect (widget, "expose-event",
G_CALLBACK (separator_expose), plugin);
}