コード例 #1
0
ファイル: GtkMenuBar.c プロジェクト: cyberpython/java-gnome
JNIEXPORT jint JNICALL
Java_org_gnome_gtk_GtkMenuBar_gtk_1menu_1bar_1get_1pack_1direction
(
	JNIEnv* env,
	jclass cls,
	jlong _self
)
{
	GtkPackDirection result;
	jint _result;
	GtkMenuBar* self;

	// convert parameter self
	self = (GtkMenuBar*) _self;

	// call function
	result = gtk_menu_bar_get_pack_direction(self);

	// cleanup parameter self

	// translate return value to JNI type
	_result = (jint) result;

	// and finally
	return _result;
}
コード例 #2
0
gboolean matenu_menu_bar_get_overflown (MatenuMenuBar* self) {
	gboolean result;
	g_return_val_if_fail (self != NULL, FALSE);
	switch (gtk_menu_bar_get_pack_direction ((GtkMenuBar*) self)) {
		case GTK_PACK_DIRECTION_TTB:
		case GTK_PACK_DIRECTION_BTT:
		{
			result = ((GtkWidget*) self)->allocation.height < ((GtkWidget*) self)->requisition.height;
			return result;
		}
		default:
		{
			result = ((GtkWidget*) self)->allocation.width < ((GtkWidget*) self)->requisition.width;
			return result;
		}
	}
}
コード例 #3
0
static gboolean matenu_menu_bar_child_need_overflown_arrow (MatenuMenuBar* self, GtkWidget* child) {
	gboolean result = FALSE;
	gint lhs;
	gint rhs;
	GtkAllocation a;
	GtkAllocation oa;
	g_return_val_if_fail (self != NULL, FALSE);
	g_return_val_if_fail (child != NULL, FALSE);
	lhs = 0;
	rhs = 0;
	a = child->allocation;
	oa = ((GtkWidget*) self->priv->_overflown_arrow)->allocation;
	switch (gtk_menu_bar_get_pack_direction ((GtkMenuBar*) self)) {
		case GTK_PACK_DIRECTION_LTR:
		{
			lhs = a.x + a.width;
			rhs = ((GtkWidget*) self)->allocation.width - oa.width;
			break;
		}
		case GTK_PACK_DIRECTION_RTL:
		{
			lhs = 0 + oa.width;
			rhs = a.x;
			break;
		}
		case GTK_PACK_DIRECTION_BTT:
		{
			lhs = 0 + oa.height;
			rhs = a.y;
			break;
		}
		case GTK_PACK_DIRECTION_TTB:
		{
			lhs = a.y + a.height;
			rhs = ((GtkWidget*) self)->allocation.height - oa.height;
			break;
		}
	}
	result = lhs > rhs;
	return result;
}
コード例 #4
0
static void matenu_menu_bar_real_size_allocate (GtkWidget* base, GdkRectangle* a) {
	MatenuMenuBar * self;
	gboolean need_reset_bg_pixmap;
	gint delta_x;
	gint delta_y;
	gboolean _tmp0_ = FALSE;
	gboolean _tmp1_ = FALSE;
	gboolean _tmp2_ = FALSE;
	GdkRectangle _tmp3_ = {0};
	GdkRectangle oa;
	GtkRequisition or = {0};
	self = (MatenuMenuBar*) base;
	need_reset_bg_pixmap = FALSE;
	delta_x = (*a).x - ((GtkWidget*) self)->allocation.x;
	delta_y = (*a).y - ((GtkWidget*) self)->allocation.y;
	if (delta_x != 0) {
		_tmp2_ = TRUE;
	} else {
		_tmp2_ = delta_y != 0;
	}
	if (_tmp2_) {
		_tmp1_ = TRUE;
	} else {
		_tmp1_ = (*a).width != ((GtkWidget*) self)->allocation.width;
	}
	if (_tmp1_) {
		_tmp0_ = TRUE;
	} else {
		_tmp0_ = (*a).height != ((GtkWidget*) self)->allocation.height;
	}
	if (_tmp0_) {
		need_reset_bg_pixmap = TRUE;
	}
	matenu_menu_bar_get_background (self)->offset_x = matenu_menu_bar_get_background (self)->offset_x + delta_x;
	matenu_menu_bar_get_background (self)->offset_y = matenu_menu_bar_get_background (self)->offset_y + delta_y;
	GTK_WIDGET_CLASS (matenu_menu_bar_parent_class)->size_allocate ((GtkWidget*) GTK_MENU_BAR (self), a);
	oa = (_tmp3_.x = 0, _tmp3_.y = 0, _tmp3_.width = 0, _tmp3_.height = 0, _tmp3_);
	gtk_widget_get_child_requisition ((GtkWidget*) self->priv->_overflown_arrow, &or);
	switch (gtk_menu_bar_get_pack_direction ((GtkMenuBar*) self)) {
		case GTK_PACK_DIRECTION_TTB:
		{
			oa.height = or.height;
			oa.width = (*a).width;
			oa.x = 0;
			oa.y = (*a).height - oa.height;
			break;
		}
		case GTK_PACK_DIRECTION_BTT:
		{
			oa.height = or.height;
			oa.width = (*a).width;
			oa.x = 0;
			oa.y = 0;
			break;
		}
		case GTK_PACK_DIRECTION_RTL:
		{
			oa.height = (*a).height;
			oa.width = or.width;
			oa.x = 0;
			oa.y = 0;
			break;
		}
		default:
		{
			oa.width = or.width;
			oa.height = (*a).height;
			oa.x = (*a).width - oa.width;
			oa.y = 0;
			break;
		}
	}
	gtk_widget_size_allocate ((GtkWidget*) self->priv->_overflown_arrow, &oa);
	if (matenu_menu_bar_get_overflown (self)) {
		gtk_widget_set_child_visible ((GtkWidget*) self->priv->_overflown_arrow, TRUE);
		{
			gint i;
			i = 0;
			{
				gboolean _tmp4_;
				_tmp4_ = TRUE;
				while (TRUE) {
					MatenuItem* item;
					MatenuItem* _tmp5_;
					GtkWidget* child;
					if (!_tmp4_) {
						i++;
					}
					_tmp4_ = FALSE;
					if (!(i < matenu_shell_get_length ((MatenuShell*) self))) {
						break;
					}
					item = matenu_shell_get_item ((MatenuShell*) self, i);
					child = _g_object_ref0 ((_tmp5_ = item, GTK_IS_WIDGET (_tmp5_) ? ((GtkWidget*) _tmp5_) : NULL));
					gtk_widget_set_child_visible (child, !matenu_menu_bar_child_need_overflown_arrow (self, child));
					_g_object_unref0 (child);
					_g_object_unref0 (item);
				}
			}
		}
	} else {
		gtk_widget_set_child_visible ((GtkWidget*) self->priv->_overflown_arrow, FALSE);
		{
			gint i;
			i = 0;
			{
				gboolean _tmp6_;
				_tmp6_ = TRUE;
				while (TRUE) {
					MatenuItem* item;
					MatenuItem* _tmp7_;
					GtkWidget* child;
					if (!_tmp6_) {
						i++;
					}
					_tmp6_ = FALSE;
					if (!(i < matenu_shell_get_length ((MatenuShell*) self))) {
						break;
					}
					item = matenu_shell_get_item ((MatenuShell*) self, i);
					child = _g_object_ref0 ((_tmp7_ = item, GTK_IS_WIDGET (_tmp7_) ? ((GtkWidget*) _tmp7_) : NULL));
					gtk_widget_set_child_visible (child, TRUE);
					_g_object_unref0 (child);
					_g_object_unref0 (item);
				}
			}
		}
	}
	if (need_reset_bg_pixmap) {
		matenu_menu_bar_reset_bg_pixmap (self);
	}
}
コード例 #5
0
static void
greeter_menu_bar_size_allocate(GtkWidget* widget, GtkAllocation* allocation)
{
    GList* item;
    GList* shell_children;
    GList* expand_nums = NULL;
    guint visible_count = 0, expand_count = 0;

	g_return_if_fail(allocation != NULL);
	g_return_if_fail(GREETER_IS_MENU_BAR(widget));

    gtk_widget_set_allocation(widget, allocation);

    GtkPackDirection pack_direction = gtk_menu_bar_get_pack_direction(GTK_MENU_BAR(widget));
    g_return_if_fail(pack_direction == GTK_PACK_DIRECTION_LTR || pack_direction == GTK_PACK_DIRECTION_RTL);

    shell_children = gtk_container_get_children(GTK_CONTAINER(widget));

    for(item = shell_children; item; item = g_list_next(item))
        if(gtk_widget_get_visible(item->data))
        {
            if(gtk_widget_compute_expand(item->data, GTK_ORIENTATION_HORIZONTAL))
            {
                expand_nums = g_list_prepend(expand_nums, GINT_TO_POINTER(visible_count));
                expand_count++;
            }
            visible_count++;
        }

    if(gtk_widget_get_realized(widget))
        gdk_window_move_resize(gtk_widget_get_window(widget),
                               allocation->x, allocation->y,
                               allocation->width, allocation->height);

    if(visible_count > 0)
    {
        GtkAllocation remaining_space;
        GtkStyleContext* context = gtk_widget_get_style_context(widget);
        GtkStateFlags flags = gtk_widget_get_state_flags(widget);
        GtkRequestedSize* requested_sizes = g_newa(GtkRequestedSize, visible_count);
        guint border_width = gtk_container_get_border_width(GTK_CONTAINER(widget));
        GtkShadowType shadow_type = GTK_SHADOW_OUT;
        GtkBorder border;
        gint toggle_size;

        gtk_style_context_get_padding(context, flags, &border);
        gtk_widget_style_get(widget, "shadow-type", &shadow_type, NULL);

        remaining_space.x = (border_width + border.left);
        remaining_space.y = (border_width + border.top);
        remaining_space.width = allocation->width -
                                2 * border_width - border.left - border.right;
        remaining_space.height = allocation->height -
                                 2 * border_width - border.top - border.bottom;

        if (shadow_type != GTK_SHADOW_NONE)
        {
            gtk_style_context_get_border(context, flags, &border);

            remaining_space.x += border.left;
            remaining_space.y += border.top;
            remaining_space.width -= border.left + border.right;
            remaining_space.height -= border.top + border.bottom;
        }

        GtkRequestedSize* request = requested_sizes;
        int size = remaining_space.width;
        gboolean ltr = (gtk_widget_get_direction(widget) == GTK_TEXT_DIR_LTR) == (pack_direction == GTK_PACK_DIRECTION_LTR);

        for(item = shell_children; item; item = g_list_next(item))
        {
            if (!gtk_widget_get_visible(item->data))
                continue;

            request->data = item->data;
            gtk_widget_get_preferred_width_for_height(item->data, remaining_space.height,
                    &request->minimum_size,
                    &request->natural_size);
            gtk_menu_item_toggle_size_request(GTK_MENU_ITEM(item->data),
                                              &toggle_size);
            request->minimum_size += toggle_size;
            request->natural_size += toggle_size;

            gtk_menu_item_toggle_size_allocate(GTK_MENU_ITEM(item->data), toggle_size);

            size -= request->minimum_size;
            request++;
        }

        size = gtk_distribute_natural_allocation(size, visible_count, requested_sizes);

        /* Distribution extra space for widgets with expand=True */
        if(size > 0 && expand_nums)
        {
            expand_nums = g_list_sort_with_data(expand_nums, (GCompareDataFunc)sort_minimal_size,
                                                requested_sizes);
            GList* first_item = expand_nums;
            gint needed_size = -1;
            gint max_size = requested_sizes[GPOINTER_TO_INT(first_item->data)].natural_size;
            gint total_needed_size = 0;


            /* Free space that all widgets need to have the same (max_size) width
             * [___max_width___][widget         ][widget____     ]
             * total_needed_size := [] + [         ] + [     ]
             * total_needed_size = [              ]
             */
            for(item = g_list_next(expand_nums); item; item = g_list_next(item))
                total_needed_size += max_size - requested_sizes[GPOINTER_TO_INT(item->data)].natural_size;

            while(first_item)
            {
                if(size >= total_needed_size)
                {
                    /* total_needed_size is enough for all remaining widgets */
                    needed_size = max_size + (size - total_needed_size)/expand_count;
                    break;
                }
                /* Removing current maximal widget from list */
                total_needed_size -= max_size - requested_sizes[GPOINTER_TO_INT(item->data)].natural_size;
                first_item = g_list_next(first_item);
                if(first_item)
                    max_size = requested_sizes[GPOINTER_TO_INT(first_item->data)].natural_size;
            }

            for(item = first_item; item; item = g_list_next(item))
            {
                request = &requested_sizes[GPOINTER_TO_INT(item->data)];
                gint dsize = needed_size - request->natural_size;
                if(size < dsize)
                    dsize = size;
                size -= dsize;
                request->natural_size += dsize;
            }
        }
        
        gint i;
        for(i = 0; i < visible_count; i++)
        {
            GtkAllocation child_allocation = remaining_space;
            request = &requested_sizes[i];

            child_allocation.width = request->natural_size;
            remaining_space.width -= request->natural_size;
            if (ltr)
                remaining_space.x += request->natural_size;
            else
                child_allocation.x += remaining_space.width;
            gtk_widget_size_allocate(request->data, &child_allocation);
        }
        g_list_free(expand_nums);
    }
    g_list_free(shell_children);
}