1579
screen_changed_handler (GtkWidget* window,
1580
GdkScreen* old_screen,
1579
screen_changed_handler (GtkWindow* window,
1580
GdkScreen* old_screen,
1583
GdkScreen* screen = gtk_widget_get_screen (window);
1584
GdkColormap* colormap = gdk_screen_get_rgba_colormap (screen);
1587
colormap = gdk_screen_get_rgb_colormap (screen);
1589
gtk_widget_set_colormap (window, colormap);
1583
GdkScreen* screen = gtk_widget_get_screen (GTK_WIDGET (window));
1584
GdkVisual* visual = gdk_screen_get_rgba_visual (screen);
1587
visual = gdk_screen_get_system_visual (screen);
1589
gtk_widget_set_visual (GTK_WIDGET (window), visual);
1594
1594
update_input_shape (GtkWidget* window)
1596
GdkRegion* region = NULL;
1596
cairo_region_t* region = NULL;
1598
1598
// sanity check
1602
1602
// set an empty input-mask to allow click-through
1603
region = gdk_region_new ();
1603
region = cairo_region_create ();
1604
1604
gdk_window_input_shape_combine_region (gtk_widget_get_window (window), region, 0, 0);
1605
gdk_region_destroy (region);
1605
cairo_region_destroy (region);
1609
1609
update_shape (Bubble* self)
1611
GdkBitmap* mask = NULL;
1616
1613
BubblePrivate* priv;
1619
1616
if (!self || !IS_BUBBLE (self))
1623
1619
priv = GET_PRIVATE (self);
1625
1621
// do we actually need a shape-mask at all?
1626
1622
if (priv->composited)
1628
gtk_widget_shape_combine_mask (priv->widget, NULL, 0, 0);
1624
gtk_widget_input_shape_combine_region (priv->widget, NULL);
1632
1628
// we're not-composited, so deal with mouse-over differently
1633
1629
if (bubble_is_mouse_over (self))
1635
GdkRegion* region = NULL;
1631
cairo_region_t* region = NULL;
1637
region = gdk_region_new ();
1633
region = cairo_region_create ();
1638
1634
gdk_window_shape_combine_region (gtk_widget_get_window (priv->widget),
1642
gdk_region_destroy (region);
1638
cairo_region_destroy (region);
1646
1642
gtk_widget_get_size_request (priv->widget, &width, &height);
1647
mask = (GdkBitmap*) gdk_pixmap_new (NULL, width, height, 1);
1643
const cairo_rectangle_int_t rects[] = {{2, 0, width - 4, height},
1644
{1, 1, width - 2, height - 2},
1645
{0, 2, width, height - 4}};
1646
cairo_region_t* region = NULL;
1648
region = cairo_region_create_rectangles (rects, 3);
1649
if (cairo_region_status (region) == CAIRO_STATUS_SUCCESS)
1650
// create context from mask/pixmap
1651
cr = gdk_cairo_create (mask);
1652
if (cairo_status (cr) == CAIRO_STATUS_SUCCESS)
1654
// clear mask/context
1655
cairo_scale (cr, 1.0f, 1.0f);
1656
cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
1659
width -= 2 * EM2PIXELS (defaults_get_bubble_shadow_size (d), d);
1660
height -= 2 * EM2PIXELS (defaults_get_bubble_shadow_size (d), d);
1662
// draw rounded rectangle shape/mask
1663
cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
1664
cairo_set_source_rgb (cr, 1.0f, 1.0f, 1.0f);
1665
draw_round_rect (cr,
1667
EM2PIXELS (defaults_get_bubble_shadow_size (d), d),
1668
EM2PIXELS (defaults_get_bubble_shadow_size (d), d),
1669
EM2PIXELS (defaults_get_bubble_corner_radius (d), d),
1675
// remove any current shape-mask
1676
gtk_widget_shape_combine_mask (priv->widget,
1681
// set new shape-mask
1682
gtk_widget_shape_combine_mask (priv->widget,
1687
g_object_unref ((gpointer) mask);
1651
gtk_widget_shape_combine_region (priv->widget, NULL);
1652
gtk_widget_shape_combine_region (priv->widget, region);
2222
2188
gtk_window_move (GTK_WINDOW (window), 0, 0);
2224
2190
// make sure the window opens with a RGBA-visual
2225
screen_changed_handler (window, NULL, NULL);
2191
screen_changed_handler (GTK_WINDOW (window), NULL, NULL);
2226
2192
gtk_widget_realize (window);
2227
gdk_window_set_back_pixmap (gtk_widget_get_window (window), NULL, FALSE);
2193
gdk_window_set_background_rgba (gtk_widget_get_window (window),
2229
2196
// hook up window-event handlers to window
2230
2197
g_signal_connect (G_OBJECT (window),