~didrocks/notify-osd/bootstrap

« back to all changes in this revision

Viewing changes to src/bubble.c

  • Committer: Mirco Müller
  • Date: 2011-07-08 08:34:52 UTC
  • Revision ID: mirco.mueller@ubuntu.com-20110708083452-63omzhch22lgpjqs
multiple fixes for compiler-warnings/errors, more porting work

Show diffs side-by-side

added added

removed removed

Lines of Context:
1576
1576
 
1577
1577
static
1578
1578
void
1579
 
screen_changed_handler (GtkWidget* window,
1580
 
                        GdkScreen* old_screen,
1581
 
                        gpointer   data)
 
1579
screen_changed_handler (GtkWindow* window,
 
1580
                                                GdkScreen* old_screen,
 
1581
                                                gpointer   data)
1582
1582
{
1583
 
        GdkScreen*   screen   = gtk_widget_get_screen (window);
1584
 
        GdkColormap* colormap = gdk_screen_get_rgba_colormap (screen);
1585
 
 
1586
 
        if (!colormap)
1587
 
                colormap = gdk_screen_get_rgb_colormap (screen);
1588
 
 
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);
 
1585
 
 
1586
        if (!visual)
 
1587
                visual = gdk_screen_get_system_visual (screen);
 
1588
 
 
1589
        gtk_widget_set_visual (GTK_WIDGET (window), visual);
1590
1590
}
1591
1591
 
1592
1592
static
1593
1593
void
1594
1594
update_input_shape (GtkWidget* window)
1595
1595
{
1596
 
        GdkRegion*   region = NULL;
 
1596
        cairo_region_t* region = NULL;
1597
1597
 
1598
1598
        // sanity check
1599
1599
        if (!window)
1600
1600
                return;
1601
1601
 
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);
1606
1606
}
1607
1607
 
1608
1608
static void
1609
1609
update_shape (Bubble* self)
1610
1610
{
1611
 
        GdkBitmap*     mask = NULL;
1612
 
        cairo_t*       cr   = NULL;
1613
1611
        gint           width;
1614
1612
        gint           height;
1615
 
        Defaults*      d;
1616
1613
        BubblePrivate* priv;
1617
1614
 
1618
1615
        // sanity test
1619
1616
        if (!self || !IS_BUBBLE (self))
1620
1617
                return;
1621
1618
 
1622
 
        d = self->defaults;
1623
1619
        priv = GET_PRIVATE (self);
1624
1620
 
1625
1621
        // do we actually need a shape-mask at all?
1626
1622
        if (priv->composited)
1627
1623
        {
1628
 
                gtk_widget_shape_combine_mask (priv->widget, NULL, 0, 0);
 
1624
                gtk_widget_input_shape_combine_region (priv->widget, NULL);
1629
1625
                return;
1630
1626
        }
1631
1627
 
1632
1628
        // we're not-composited, so deal with mouse-over differently
1633
1629
        if (bubble_is_mouse_over (self))
1634
1630
        {
1635
 
                GdkRegion* region = NULL;
 
1631
                cairo_region_t* region = NULL;
1636
1632
 
1637
 
                region = gdk_region_new ();
 
1633
                region = cairo_region_create ();
1638
1634
                gdk_window_shape_combine_region (gtk_widget_get_window (priv->widget),
1639
1635
                                                 region,
1640
1636
                                                 0,
1641
1637
                                                 0);
1642
 
                gdk_region_destroy (region);
 
1638
                cairo_region_destroy (region);
1643
1639
        }
1644
1640
        else
1645
1641
        {
1646
1642
                gtk_widget_get_size_request (priv->widget, &width, &height);
1647
 
                mask = (GdkBitmap*) gdk_pixmap_new (NULL, width, height, 1);
1648
 
                if (mask)
 
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;
 
1647
 
 
1648
                region = cairo_region_create_rectangles (rects, 3);
 
1649
                if (cairo_region_status (region) == CAIRO_STATUS_SUCCESS)
1649
1650
                {
1650
 
                        // create context from mask/pixmap
1651
 
                        cr = gdk_cairo_create (mask);
1652
 
                        if (cairo_status (cr) == CAIRO_STATUS_SUCCESS)
1653
 
                        {
1654
 
                                // clear mask/context
1655
 
                                cairo_scale (cr, 1.0f, 1.0f);
1656
 
                                cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
1657
 
                                cairo_paint (cr);
1658
 
 
1659
 
                                width  -= 2 * EM2PIXELS (defaults_get_bubble_shadow_size (d), d);
1660
 
                                height -= 2 * EM2PIXELS (defaults_get_bubble_shadow_size (d), d);
1661
 
 
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,
1666
 
                                         1.0f,
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),
1670
 
                                         width,
1671
 
                                         height);
1672
 
                                cairo_fill (cr);
1673
 
                                cairo_destroy (cr);
1674
 
 
1675
 
                                // remove any current shape-mask
1676
 
                                gtk_widget_shape_combine_mask (priv->widget,
1677
 
                                                               NULL,
1678
 
                                                               0,
1679
 
                                                               0);
1680
 
 
1681
 
                                // set new shape-mask
1682
 
                                gtk_widget_shape_combine_mask (priv->widget,
1683
 
                                                               mask,
1684
 
                                                               0,
1685
 
                                                               0);
1686
 
                        }
1687
 
                        g_object_unref ((gpointer) mask);
 
1651
                        gtk_widget_shape_combine_region (priv->widget, NULL);
 
1652
                        gtk_widget_shape_combine_region (priv->widget, region);
1688
1653
                }
1689
1654
        }
1690
1655
}
2180
2145
Bubble*
2181
2146
bubble_new (Defaults* defaults)
2182
2147
{
2183
 
        Bubble*        this   = NULL;
2184
 
        GtkWidget*     window = NULL;
 
2148
        Bubble*        this        = NULL;
 
2149
        GtkWidget*     window      = NULL;
2185
2150
        BubblePrivate* priv;
 
2151
        GdkRGBA        transparent = {0.0, 0.0, 0.0, 0.0};
2186
2152
 
2187
2153
        this = g_object_new (BUBBLE_TYPE, NULL);
2188
2154
        if (!this)
2222
2188
        gtk_window_move (GTK_WINDOW (window), 0, 0);
2223
2189
 
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),
 
2194
                                                                        &transparent);
2228
2195
 
2229
2196
        // hook up window-event handlers to window
2230
2197
        g_signal_connect (G_OBJECT (window),