示例#1
0
static void
hippo_canvas_widget_set_property(GObject         *object,
                                 guint            prop_id,
                                 const GValue    *value,
                                 GParamSpec      *pspec)
{
    HippoCanvasWidget *widget;

    widget = HIPPO_CANVAS_WIDGET(object);

    switch (prop_id) {
    case PROP_WIDGET:
        {
            GtkWidget *w = (GtkWidget*) g_value_get_object(value);
            if (widget->widget != w) {
                if (w) {
                    gtk_object_ref(GTK_OBJECT(w));
                    gtk_object_sink(GTK_OBJECT(w));
                }
                if (widget->widget)
                    g_object_unref(widget->widget);
                widget->widget = w;

                update_widget_visibility(widget);

                hippo_canvas_item_emit_request_changed(HIPPO_CANVAS_ITEM(widget));
            }
        }
        break;
    default:
        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
        break;
    }
}
示例#2
0
static void
hippo_canvas_control_set_property(GObject         *object,
                                 guint            prop_id,
                                 const GValue    *value,
                                 GParamSpec      *pspec)
{
    HippoCanvasControl *control;

    control = HIPPO_CANVAS_CONTROL(object);

    switch (prop_id) {
    case PROP_CONTROL:
        {
            HippoAbstractControl *w = (HippoAbstractControl*) g_value_get_pointer(value);
            if (control->control != w) {
                if (w) {
                    w->AddRef();
                }
                if (control->control) {
                    control->control->Release();
                }
                control->control = w;

                hippo_canvas_item_emit_request_changed(HIPPO_CANVAS_ITEM(control));
            }
        }
        break;
    default:
        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
        break;
    }
}
示例#3
0
static void
hippo_canvas_grip_set_property(GObject         *object,
                               guint            prop_id,
                               const GValue    *value,
                               GParamSpec      *pspec)
{
    HippoCanvasGrip *grip;

    grip = HIPPO_CANVAS_GRIP(object);

    switch (prop_id) {
    case PROP_SIDE:
    {
        HippoSide side = g_value_get_int(value);
        if (side != grip->side) {
            grip->side = side;

            g_object_set(G_OBJECT(grip),
                         "border-left", side == HIPPO_SIDE_LEFT ? 1 : 0,
                         "border-right", side == HIPPO_SIDE_RIGHT ? 1 : 0,
                         "border-top", side == HIPPO_SIDE_TOP ? 1 : 0,
                         "border-bottom", side == HIPPO_SIDE_BOTTOM ? 1 : 0,
                         NULL);

            hippo_canvas_item_emit_request_changed(HIPPO_CANVAS_ITEM(grip));
        }
    }
    break;
    default:
        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
        break;
    }
}
示例#4
0
static void
set_surface(HippoCanvasImage *image,
            cairo_surface_t  *surface)
{
    if (surface != image->surface) {
        int old_width, old_height;
        gboolean request_changed = FALSE;
        
#if 0
        /* The FC5 version of Cairo doesn't have this API */
        if (cairo_surface_get_type(surface) != CAIRO_SURFACE_TYPE_IMAGE) {
            g_warning("Image canvas item only supports image surfaces");
            return;
        }
#endif
        old_width = image->surface ? cairo_image_surface_get_width(image->surface) : 0;
        old_height = image->surface ? cairo_image_surface_get_height(image->surface) : 0;
        
        if (surface)
            cairo_surface_reference(surface);
        if (image->surface)
            cairo_surface_destroy(image->surface);
        image->surface = surface;

        if (image->scale_width < 0) {
            int width = image->surface ? cairo_image_surface_get_width(image->surface) : 0;
            if (width != old_width)
                request_changed = TRUE;
        }
        if (image->scale_height < 0) {
            int height = image->surface ? cairo_image_surface_get_height(image->surface) : 0;
            if (height != old_height)
                request_changed = TRUE;
        }

        if (request_changed)
            hippo_canvas_item_emit_request_changed(HIPPO_CANVAS_ITEM(image));
        hippo_canvas_item_emit_paint_needed(HIPPO_CANVAS_ITEM(image), 0, 0, -1, -1);

        g_object_notify(G_OBJECT(image), "image");
    }
}
示例#5
0
static void
hippo_canvas_text_set_context(HippoCanvasItem    *item,
                              HippoCanvasContext *context)
{
    HippoCanvasBox *box = HIPPO_CANVAS_BOX(item);
    gboolean changed;
    
    changed = context != box->context;
    
    item_parent_class->set_context(item, context);

    /* we can't create a layout until we have a context,
     * so we have to queue a size change when the context
     * is set.
     */
    if (changed) {
        hippo_canvas_item_emit_request_changed(HIPPO_CANVAS_ITEM(item));
        hippo_canvas_item_emit_paint_needed(HIPPO_CANVAS_ITEM(item), 0, 0, -1, -1);
    }
}
示例#6
0
static void
hippo_canvas_text_set_property(GObject         *object,
                               guint            prop_id,
                               const GValue    *value,
                               GParamSpec      *pspec)
{
    HippoCanvasText *text;

    text = HIPPO_CANVAS_TEXT(object);

    switch (prop_id) {
    case PROP_TEXT:
        {
            const char *new_text;
            new_text = g_value_get_string(value);
            if (!(new_text == text->text ||
                  (new_text && text->text && strcmp(new_text, text->text) == 0))) {
                g_free(text->text);
                text->text = g_strdup(new_text);
                hippo_canvas_item_emit_request_changed(HIPPO_CANVAS_ITEM(text));
                hippo_canvas_item_emit_paint_needed(HIPPO_CANVAS_ITEM(text), 0, 0, -1, -1);
            }
        }
        break;
    case PROP_ATTRIBUTES:
        {
            PangoAttrList *attrs = g_value_get_boxed(value);
            if (attrs)
                pango_attr_list_ref(attrs);
            if (text->attributes)
                pango_attr_list_unref(text->attributes);            
            text->attributes = attrs;
            hippo_canvas_item_emit_request_changed(HIPPO_CANVAS_ITEM(text));
            hippo_canvas_item_emit_paint_needed(HIPPO_CANVAS_ITEM(text), 0, 0, -1, -1);
        }
        break;
    case PROP_MARKUP:
        {
            char *text;
            PangoAttrList *attrs;
            GError *error = NULL;

            if (!pango_parse_markup(g_value_get_string(value),
                                    -1,
                                    0,
                                    &attrs,
                                    &text,
                                    NULL,
                                    &error)) {
                g_error("Failed to set markup: %s", error->message);
                return;
            }
            g_object_set(object, "text", text, "attributes", attrs, NULL);
            pango_attr_list_unref(attrs);
            g_free(text);
        }
        break;
    case PROP_FONT_SCALE:
        text->font_scale = g_value_get_double(value);
        hippo_canvas_item_emit_request_changed(HIPPO_CANVAS_ITEM(text));
        hippo_canvas_item_emit_paint_needed(HIPPO_CANVAS_ITEM(text), 0, 0, -1, -1);
        break;
    case PROP_SIZE_MODE:
        text->size_mode = g_value_get_enum(value);
        hippo_canvas_item_emit_request_changed(HIPPO_CANVAS_ITEM(text));
        hippo_canvas_item_emit_paint_needed(HIPPO_CANVAS_ITEM(text), 0, 0, -1, -1);
        break;
    default:
        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
        break;
    }
}
示例#7
0
static void
hippo_canvas_block_set_block_impl(HippoCanvasBlock *canvas_block,
                                  HippoBlock       *new_block)
{
#if 0
    g_debug("setting block on canvas block to %s",
            new_block ? hippo_block_get_guid(new_block) : "null");
#endif
    
    if (new_block != canvas_block->block) {
        if (new_block) {
            if (canvas_block->required_type != HIPPO_BLOCK_TYPE_UNKNOWN &&
                hippo_block_get_block_type(new_block) != canvas_block->required_type) {
                g_warning("Trying to set block type %d on canvas block type %s",
                          hippo_block_get_block_type(new_block),
                          g_type_name_from_instance((GTypeInstance*)canvas_block));
                return;
            }
            
            g_object_ref(new_block);
            g_signal_connect(G_OBJECT(new_block), "notify::timestamp",
                             G_CALLBACK(on_block_timestamp_changed),
                             canvas_block);
            g_signal_connect(G_OBJECT(new_block), "notify::significant-clicked-count",
                             G_CALLBACK(on_block_significant_clicked_count_changed),
                             canvas_block);
            g_signal_connect(G_OBJECT(new_block), "notify::ignored",
                             G_CALLBACK(on_block_ignored_changed),
                             canvas_block);
            g_signal_connect(G_OBJECT(new_block), "notify::stack-reason",
                             G_CALLBACK(on_block_stack_reason_changed),
                             canvas_block);
            g_signal_connect(G_OBJECT(new_block), "notify::icon-url",
                             G_CALLBACK(on_block_icon_url_changed),
                             canvas_block);
        }
        if (canvas_block->block) {
            g_signal_handlers_disconnect_by_func(G_OBJECT(canvas_block->block),
                                                 G_CALLBACK(on_block_timestamp_changed),
                                                 canvas_block);
            g_signal_handlers_disconnect_by_func(G_OBJECT(canvas_block->block),
                                                 G_CALLBACK(on_block_significant_clicked_count_changed),
                                                 canvas_block);
            g_signal_handlers_disconnect_by_func(G_OBJECT(canvas_block->block),
                                                 G_CALLBACK(on_block_ignored_changed),
                                                 canvas_block);
            g_signal_handlers_disconnect_by_func(G_OBJECT(canvas_block->block),
                                                 G_CALLBACK(on_block_stack_reason_changed),
                                                 canvas_block);
            g_signal_handlers_disconnect_by_func(G_OBJECT(canvas_block->block),
                                                 G_CALLBACK(on_block_icon_url_changed),
                                                 canvas_block);
            g_object_unref(canvas_block->block);
        }
        canvas_block->block = new_block;

        if (new_block) {
            on_block_timestamp_changed(new_block, NULL, canvas_block);
            on_block_significant_clicked_count_changed(new_block, NULL, canvas_block);
            on_block_ignored_changed(new_block, NULL, canvas_block);
            on_block_stack_reason_changed(new_block, NULL, canvas_block);
            on_block_icon_url_changed(new_block, NULL, canvas_block);

            if (canvas_block->heading_lock_item)
                hippo_canvas_item_set_visible(canvas_block->heading_lock_item,
                                              !hippo_block_is_public(canvas_block->block));
        }
        
        g_object_notify(G_OBJECT(canvas_block), "block");
        hippo_canvas_item_emit_request_changed(HIPPO_CANVAS_ITEM(canvas_block));
    }
}
示例#8
0
static void
hippo_canvas_image_set_property(GObject         *object,
                                guint            prop_id,
                                const GValue    *value,
                                GParamSpec      *pspec)
{
    HippoCanvasImage *image;

    image = HIPPO_CANVAS_IMAGE(object);

    switch (prop_id) {
    case PROP_IMAGE:
        {
            cairo_surface_t *surface = g_value_get_boxed(value);

            if (image->image_name) {
                g_free(image->image_name);
                image->image_name = NULL;
                g_object_notify(G_OBJECT(image), "image-name");
            }
            
            set_surface(image, surface);
        }
        break;
    case PROP_IMAGE_NAME:
        {
            const char *name = g_value_get_string(value);

            if (!(image->image_name == name ||
                  (image->image_name && name && strcmp(image->image_name,
                                                       name) == 0))) {
                g_free(image->image_name);
                image->image_name = g_strdup(name);
                set_surface_from_name(image);

                /* will recursively call set_property("image") which
                 * will result in a request_changed if required
                 */
            }
        }
        break;
    case PROP_SCALE_WIDTH:
        {
            int w = g_value_get_int(value);
            if (w != image->scale_width) {
                image->scale_width = w;
                hippo_canvas_item_emit_request_changed(HIPPO_CANVAS_ITEM(image));
            } 
        }
        break;
    case PROP_SCALE_HEIGHT:
        {
            int h = g_value_get_int(value);
            if (h != image->scale_height) {
                image->scale_height = h;
                hippo_canvas_item_emit_request_changed(HIPPO_CANVAS_ITEM(image));
            }
        }
        break;
    default:
        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
        break;
    }
}