gtk_text_tag_copy(GtkTextTag *tag)
{
GtkTextTag *copy;
+ char *tag_name;
+ GParamSpec **properties;
+ unsigned nprops, count;
g_return_val_if_fail(tag != NULL, NULL);
- copy = gtk_text_tag_new(tag->name);
- gtk_text_attributes_copy_values(tag->values, copy->values);
-
- #define _COPY_FLAG(flag) copy->flag = tag->flag
- _COPY_FLAG (bg_color_set);
- _COPY_FLAG (bg_color_set);
- _COPY_FLAG (bg_stipple_set);
- _COPY_FLAG (fg_color_set);
- _COPY_FLAG (fg_stipple_set);
- _COPY_FLAG (justification_set);
- _COPY_FLAG (left_margin_set);
- _COPY_FLAG (indent_set);
- _COPY_FLAG (rise_set);
- _COPY_FLAG (strikethrough_set);
- _COPY_FLAG (right_margin_set);
- _COPY_FLAG (pixels_above_lines_set);
- _COPY_FLAG (pixels_below_lines_set);
- _COPY_FLAG (pixels_inside_wrap_set);
- _COPY_FLAG (tabs_set);
- _COPY_FLAG (underline_set);
- _COPY_FLAG (wrap_mode_set);
- _COPY_FLAG (bg_full_height_set);
- _COPY_FLAG (invisible_set);
- _COPY_FLAG (editable_set);
- _COPY_FLAG (language_set);
- _COPY_FLAG (scale_set);
- #undef _COPY_FLAG
+ g_object_get(tag, "name", &tag_name, NULL);
+ copy = gtk_text_tag_new(tag_name);
+ g_free(tag_name);
+
+ /* Copy all the original tag's properties to the new tag */
+ properties = g_object_class_list_properties( G_OBJECT_GET_CLASS(tag), &nprops );
+ for(count = 0; count < nprops; count++) {
+
+ /* Only copy properties that are readable, writable, not construct-only,
+ and not deprecated */
+ GParamFlags flags = properties[count]->flags;
+ if(flags & G_PARAM_CONSTRUCT_ONLY
+ || flags & G_PARAM_DEPRECATED
+ || !(flags & G_PARAM_READABLE)
+ || !(flags & G_PARAM_WRITABLE))
+ continue;
+
+ const char *prop_name = g_param_spec_get_name(properties[count]);
+ GValue prop_value = G_VALUE_INIT;
+
+ g_value_init( &prop_value, G_PARAM_SPEC_VALUE_TYPE(properties[count]) );
+ g_object_get_property( G_OBJECT(tag), prop_name, &prop_value );
+ /* Don't copy the PangoTabArray if it is NULL, that prints a warning */
+ if(strcmp(prop_name, "tabs") == 0 && g_value_get_boxed(&prop_value) == NULL) {
+ g_value_unset(&prop_value);
+ continue;
+ }
+ g_object_set_property( G_OBJECT(copy), prop_name, &prop_value );
+ g_value_unset(&prop_value);
+ }
+ g_free(properties);
/* Copy the data that was added manually */
gpointer reverse_color = g_object_get_data( G_OBJECT(tag), "reverse-color" );
case wintype_Graphics:
{
+ GtkAllocation allocation;
+
/* Wait for the window's size to be updated */
g_mutex_lock(glk_data->arrange_lock);
if(glk_data->needs_rearrange)
g_cond_wait(glk_data->rearranged, glk_data->arrange_lock);
g_mutex_unlock(glk_data->arrange_lock);
- glk_window_erase_rect(win, 0, 0, win->widget->allocation.width, win->widget->allocation.height);
+ gdk_threads_enter();
+ gtk_widget_get_allocation(win->widget, &allocation);
+ gdk_threads_leave();
+
+ glk_window_erase_rect(win, 0, 0, allocation.width, allocation.height);
}
break;
{
VALID_WINDOW(win, return);
+ GtkAllocation allocation;
ChimaraGlkPrivate *glk_data = g_private_get(glk_data_key);
switch(win->type)
g_mutex_unlock(glk_data->arrange_lock);
gdk_threads_enter();
+ gtk_widget_get_allocation(win->widget, &allocation);
/* Cache the width and height */
- win->width = (glui32)(win->widget->allocation.width / win->unit_width);
- win->height = (glui32)(win->widget->allocation.height / win->unit_height);
+ win->width = (glui32)(allocation.width / win->unit_width);
+ win->height = (glui32)(allocation.height / win->unit_height);
gdk_threads_leave();
if(widthptr != NULL)
g_mutex_unlock(glk_data->arrange_lock);
gdk_threads_enter();
+ gtk_widget_get_allocation(win->widget, &allocation);
if(widthptr != NULL)
- *widthptr = (glui32)(win->widget->allocation.width / win->unit_width);
+ *widthptr = (glui32)(allocation.width / win->unit_width);
if(heightptr != NULL)
- *heightptr = (glui32)(win->widget->allocation.height / win->unit_height);
+ *heightptr = (glui32)(allocation.height / win->unit_height);
gdk_threads_leave();
break;
g_mutex_unlock(glk_data->arrange_lock);
gdk_threads_enter();
+ gtk_widget_get_allocation(win->widget, &allocation);
if(widthptr != NULL)
- *widthptr = (glui32)(win->widget->allocation.width);
+ *widthptr = (glui32)(allocation.width);
if(heightptr != NULL)
- *heightptr = (glui32)(win->widget->allocation.height);
+ *heightptr = (glui32)(allocation.height);
gdk_threads_leave();
break;