updated gtklayout code. Added lots of assertions to the widget code

This commit is contained in:
pavlov%pavlov.net 1998-11-25 02:34:40 +00:00
parent bb2cb9fabd
commit c73b9d994a
7 changed files with 195 additions and 65 deletions

View File

@ -2,9 +2,6 @@
*
* This file may be distributed under either the terms of the
* Netscape Public License, or the GNU Library General Public License
*
* Note: No GTK+ or Mozilla code should be added to this file.
* The coding style should be that of the the GTK core.
*/
#include "gtklayout.h"
@ -33,6 +30,9 @@ static void gtk_layout_forall (GtkContainer *container,
gboolean include_internals,
GtkCallback callback,
gpointer callback_data);
static void gtk_layout_set_adjustments (GtkLayout *layout,
GtkAdjustment *hadj,
GtkAdjustment *vadj);
static void gtk_layout_realize_child (GtkLayout *layout,
GtkLayoutChild *child);
@ -73,8 +73,7 @@ gtk_layout_new (GtkAdjustment *hadjustment,
layout = gtk_type_new (gtk_layout_get_type());
gtk_layout_set_hadjustment (layout, hadjustment);
gtk_layout_set_vadjustment (layout, vadjustment);
gtk_layout_set_adjustments (layout, hadjustment, vadjustment);
return GTK_WIDGET (layout);
}
@ -96,6 +95,65 @@ gtk_layout_get_vadjustment (GtkLayout *layout)
return layout->vadjustment;
}
static void
gtk_layout_set_adjustments (GtkLayout *layout,
GtkAdjustment *hadj,
GtkAdjustment *vadj)
{
gboolean need_adjust = FALSE;
g_return_if_fail (layout != NULL);
g_return_if_fail (GTK_IS_LAYOUT (layout));
if (hadj)
g_return_if_fail (GTK_IS_ADJUSTMENT (hadj));
else
hadj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0));
if (vadj)
g_return_if_fail (GTK_IS_ADJUSTMENT (vadj));
else
vadj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0));
if (layout->hadjustment && (layout->hadjustment != hadj))
{
gtk_signal_disconnect_by_data (GTK_OBJECT (layout->hadjustment), layout);
gtk_object_unref (GTK_OBJECT (layout->hadjustment));
}
if (layout->vadjustment && (layout->vadjustment != vadj))
{
gtk_signal_disconnect_by_data (GTK_OBJECT (layout->vadjustment), layout);
gtk_object_unref (GTK_OBJECT (layout->vadjustment));
}
if (layout->hadjustment != hadj)
{
layout->hadjustment = hadj;
gtk_object_ref (GTK_OBJECT (layout->hadjustment));
gtk_object_sink (GTK_OBJECT (layout->hadjustment));
gtk_signal_connect (GTK_OBJECT (layout->hadjustment), "value_changed",
(GtkSignalFunc) gtk_layout_adjustment_changed,
layout);
need_adjust = TRUE;
}
if (layout->vadjustment != vadj)
{
layout->vadjustment = vadj;
gtk_object_ref (GTK_OBJECT (layout->vadjustment));
gtk_object_sink (GTK_OBJECT (layout->vadjustment));
gtk_signal_connect (GTK_OBJECT (layout->vadjustment), "value_changed",
(GtkSignalFunc) gtk_layout_adjustment_changed,
layout);
need_adjust = TRUE;
}
if (need_adjust)
gtk_layout_adjustment_changed (NULL, layout);
}
void
gtk_layout_set_hadjustment (GtkLayout *layout,
GtkAdjustment *adjustment)
@ -103,19 +161,7 @@ gtk_layout_set_hadjustment (GtkLayout *layout,
g_return_if_fail (layout != NULL);
g_return_if_fail (GTK_IS_LAYOUT (layout));
if (layout->hadjustment)
gtk_object_unref (GTK_OBJECT (layout->hadjustment));
if (!adjustment)
adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0, 10.0, 0.0, 0.0));
else
gtk_object_ref (GTK_OBJECT (adjustment));
gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
GTK_SIGNAL_FUNC (gtk_layout_adjustment_changed),
layout);
layout->hadjustment = adjustment;
gtk_layout_set_adjustments (layout, adjustment, layout->vadjustment);
}
@ -126,19 +172,7 @@ gtk_layout_set_vadjustment (GtkLayout *layout,
g_return_if_fail (layout != NULL);
g_return_if_fail (GTK_IS_LAYOUT (layout));
if (layout->vadjustment)
gtk_object_unref (GTK_OBJECT (layout->hadjustment));
if (!adjustment)
adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0, 10.0, 0.0, 0.0));
else
gtk_object_ref (GTK_OBJECT (adjustment));
gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
GTK_SIGNAL_FUNC (gtk_layout_adjustment_changed),
layout);
layout->vadjustment = adjustment;
gtk_layout_set_adjustments (layout, layout->hadjustment, adjustment);
}
@ -161,6 +195,7 @@ gtk_layout_put (GtkLayout *layout,
child->y = y;
child->widget->requisition.width = 0;
child->widget->requisition.height = 0;
child->mapped = FALSE;
layout->children = g_list_append (layout->children, child);
@ -291,10 +326,20 @@ gtk_layout_class_init (GtkLayoutClass *class)
widget_class->draw = gtk_layout_draw;
widget_class->expose_event = gtk_layout_expose;
widget_class->scroll_adjustments_signal =
gtk_signal_new ("scroll_adjustments",
GTK_RUN_LAST,
object_class->type,
GTK_SIGNAL_OFFSET (GtkLayoutClass, scroll_adjustments),
gtk_marshal_NONE__POINTER_POINTER,
GTK_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT);
gravity_works = gtk_layout_gravity_works ();
container_class->remove = gtk_layout_remove;
container_class->forall = gtk_layout_forall;
class->scroll_adjustments = gtk_layout_set_adjustments;
}
static void
@ -400,12 +445,14 @@ gtk_layout_map (GtkWidget *widget)
{
GtkLayoutChild *child = tmp_list->data;
if (GTK_WIDGET_VISIBLE (child->widget) &&
!GTK_WIDGET_MAPPED (child->widget))
gtk_widget_map (child->widget);
if (child->window)
gdk_window_show (child->window);
if (child->mapped && GTK_WIDGET_VISIBLE (child->widget))
{
if (!GTK_WIDGET_MAPPED (child->widget))
gtk_widget_map (child->widget);
if (child->window)
gdk_window_show (child->window);
}
tmp_list = tmp_list->next;
}
@ -680,12 +727,21 @@ gtk_layout_position_child (GtkLayout *layout,
if ((x >= G_MINSHORT) && (x <= G_MAXSHORT) &&
(y >= G_MINSHORT) && (y <= G_MAXSHORT))
{
if (GTK_WIDGET_VISIBLE (child->widget) &&
GTK_WIDGET_MAPPED (layout) &&
!GTK_WIDGET_MAPPED (child->widget))
if (!child->mapped)
{
gtk_widget_map (child->widget);
force_allocate = TRUE;
child->mapped = TRUE;
if (GTK_WIDGET_MAPPED (layout) &&
GTK_WIDGET_VISIBLE (child->widget))
{
if (child->window)
gdk_window_show (child->window);
if (!GTK_WIDGET_MAPPED (child->widget))
gtk_widget_map (child->widget);
child->mapped = TRUE;
force_allocate = TRUE;
}
}
if (force_allocate)
@ -719,10 +775,14 @@ gtk_layout_position_child (GtkLayout *layout,
}
else
{
if (child->window)
gdk_window_hide (child->window);
else if (GTK_WIDGET_MAPPED (child->widget))
gtk_widget_unmap (child->widget);
if (child->mapped)
{
child->mapped = FALSE;
if (child->window)
gdk_window_hide (child->window);
else if (GTK_WIDGET_MAPPED (child->widget))
gtk_widget_unmap (child->widget);
}
}
}
@ -833,10 +893,11 @@ gtk_layout_adjustment_changed (GtkAdjustment *adjustment,
if (layout->frozen)
return;
gtk_layout_position_children (layout);
if (!GTK_WIDGET_MAPPED (layout))
return;
{
gtk_layout_position_children (layout);
return;
}
if (dx > 0)
{
@ -935,6 +996,8 @@ gtk_layout_adjustment_changed (GtkAdjustment *adjustment,
-dy);
}
gtk_layout_position_children (layout);
/* We have to make sure that all exposes from this scroll get
* processed before we scroll again, or the expose events will
* have invalid coordinates.
@ -1137,3 +1200,4 @@ gtk_layout_gravity_works (void)
return (y == -20);
}

View File

@ -1,10 +1,7 @@
/* Copyright Owen Taylor, 1998
*
*
* This file may be distributed under either the terms of the
* Netscape Public License, or the GNU Library General Public License
*
* Note: No GTK+ or Mozilla code should be added to this file.
* The coding style should be that of the the GTK core.
*/
#ifndef __GTK_LAYOUT_H
@ -14,6 +11,10 @@
#include <gtk/gtkcontainer.h>
#include <gtk/gtkadjustment.h>
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/*
* We don't want to require gnome-libs, in which GtkLayout now lives, but
@ -46,10 +47,9 @@
#define gtk_layout_set_hadjustment moz_gtk_layout_set_hadjustment
#define gtk_layout_set_vadjustment moz_gtk_layout_set_vadjustment
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#define GtkLayout MozGtkLayout
#define GtkLayoutClass MozGtkLayoutClass
#define GtkLayoutChild MozGtkLayoutChild
#define GTK_LAYOUT(obj) GTK_CHECK_CAST (obj, gtk_layout_get_type (), GtkLayout)
#define GTK_LAYOUT_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, gtk_layout_get_type (), GtkLayoutClass)
@ -64,6 +64,7 @@ struct _GtkLayoutChild {
GdkWindow *window; /* For NO_WINDOW widgets */
gint x;
gint y;
gboolean mapped : 1;
};
struct _GtkLayout {
@ -92,6 +93,10 @@ struct _GtkLayout {
struct _GtkLayoutClass {
GtkContainerClass parent_class;
void (*scroll_adjustments) (GtkLayout *text,
GtkAdjustment *hadjustment,
GtkAdjustment *vadjustment);
};
GtkWidget* gtk_layout_new (GtkAdjustment *hadjustment,

View File

@ -92,6 +92,8 @@ nsresult nsButton::QueryInterface(const nsIID& aIID, void** aInstancePtr)
//-------------------------------------------------------------------------
NS_METHOD nsButton::SetLabel(const nsString& aText)
{
g_return_val_if_fail(GTK_IS_BUTTON(mWidget), NS_ERROR_FAILURE);
NS_ALLOC_STR_BUF(label, aText, 256);
gtk_label_set(GTK_LABEL(GTK_BIN (mWidget)->child), label);
@ -107,6 +109,9 @@ NS_METHOD nsButton::SetLabel(const nsString& aText)
//-------------------------------------------------------------------------
NS_METHOD nsButton::GetLabel(nsString& aBuffer)
{
g_return_val_if_fail(GTK_IS_BUTTON(mWidget), NS_ERROR_FAILURE);
g_return_val_if_fail(GTK_IS_LABEL(GTK_BIN (mWidget)->child), NS_ERROR_FAILURE);
char * text;
gtk_label_get(GTK_LABEL(GTK_BIN (mWidget)->child), &text);

View File

@ -83,6 +83,8 @@ NS_METHOD nsComboBox::SetMultipleSelection(PRBool aMultipleSelections)
NS_METHOD nsComboBox::AddItemAt(nsString &aItem, PRInt32 aPosition)
{
g_return_val_if_fail(GTK_IS_COMBO(mWidget), NS_ERROR_FAILURE);
NS_ALLOC_STR_BUF(val, aItem, 256);
mItems = g_list_insert( mItems, g_strdup(val), aPosition );
gtk_combo_set_popdown_strings( GTK_COMBO( mWidget ), mItems );
@ -98,6 +100,8 @@ NS_METHOD nsComboBox::AddItemAt(nsString &aItem, PRInt32 aPosition)
//-------------------------------------------------------------------------
PRInt32 nsComboBox::FindItem(nsString &aItem, PRInt32 aStartPos)
{
g_return_val_if_fail(GTK_IS_COMBO(mWidget), NS_ERROR_FAILURE);
NS_ALLOC_STR_BUF(val, aItem, 256);
int i;
PRInt32 index = -1;
@ -131,6 +135,8 @@ PRInt32 nsComboBox::GetItemCount()
//-------------------------------------------------------------------------
PRBool nsComboBox::RemoveItemAt(PRInt32 aPosition)
{
g_return_val_if_fail(GTK_IS_COMBO(mWidget), NS_ERROR_FAILURE);
if (aPosition >= 0 && aPosition < mNumItems) {
g_free(g_list_nth(mItems, aPosition)->data);
@ -150,6 +156,8 @@ PRBool nsComboBox::RemoveItemAt(PRInt32 aPosition)
//-------------------------------------------------------------------------
PRBool nsComboBox::GetItemAt(nsString& anItem, PRInt32 aPosition)
{
g_return_val_if_fail(GTK_IS_COMBO(mWidget), NS_ERROR_FAILURE);
PRBool result = PR_FALSE;
if (aPosition >= 0 && aPosition < mNumItems) {
anItem = (gchar *) g_list_nth(mItems, aPosition)->data;
@ -166,6 +174,8 @@ PRBool nsComboBox::GetItemAt(nsString& anItem, PRInt32 aPosition)
//-------------------------------------------------------------------------
NS_METHOD nsComboBox::GetSelectedItem(nsString& aItem)
{
g_return_val_if_fail(GTK_IS_COMBO(mWidget), NS_ERROR_FAILURE);
aItem = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(mWidget)->entry));
return NS_OK;
}
@ -189,6 +199,8 @@ PRInt32 nsComboBox::GetSelectedIndex()
//-------------------------------------------------------------------------
NS_METHOD nsComboBox::SelectItem(PRInt32 aPosition)
{
g_return_val_if_fail(GTK_IS_COMBO(mWidget), NS_ERROR_FAILURE);
GList *pos;
if (!mItems)
return NS_ERROR_FAILURE;

View File

@ -85,6 +85,8 @@ nsresult nsListBox::QueryInterface(const nsIID& aIID, void** aInstancePtr)
NS_METHOD nsListBox::SetMultipleSelection(PRBool aMultipleSelections)
{
g_return_val_if_fail(GTK_IS_CLIST(mCList), NS_ERROR_FAILURE);
mMultiSelect = aMultipleSelections;
if (mMultiSelect)
@ -123,6 +125,8 @@ NS_METHOD nsListBox::AddItemAt(nsString &aItem, PRInt32 aPosition)
//-------------------------------------------------------------------------
PRInt32 nsListBox::FindItem(nsString &aItem, PRInt32 aStartPos)
{
g_return_val_if_fail(GTK_IS_CLIST(mCList), NS_ERROR_FAILURE);
int index = gtk_clist_find_row_from_data(GTK_CLIST(mCList), aItem);
if (index < aStartPos) {
@ -139,6 +143,8 @@ PRInt32 nsListBox::FindItem(nsString &aItem, PRInt32 aStartPos)
//-------------------------------------------------------------------------
PRInt32 nsListBox::GetItemCount()
{
g_return_val_if_fail(GTK_IS_CLIST(mCList), NS_ERROR_FAILURE);
return GTK_CLIST(mCList)->rows;
}
@ -149,6 +155,8 @@ PRInt32 nsListBox::GetItemCount()
//-------------------------------------------------------------------------
PRBool nsListBox::RemoveItemAt(PRInt32 aPosition)
{
g_return_val_if_fail(GTK_IS_CLIST(mCList), NS_ERROR_FAILURE);
gtk_clist_remove(GTK_CLIST(mCList), aPosition);
/*
int count = 0;
@ -169,6 +177,8 @@ PRBool nsListBox::RemoveItemAt(PRInt32 aPosition)
//-------------------------------------------------------------------------
PRBool nsListBox::GetItemAt(nsString& anItem, PRInt32 aPosition)
{
g_return_val_if_fail(GTK_IS_CLIST(mCList), NS_ERROR_FAILURE);
PRBool result = PR_FALSE;
char *text = NULL;
@ -251,6 +261,8 @@ PRInt32 nsListBox::GetSelectedIndex()
//-------------------------------------------------------------------------
NS_METHOD nsListBox::SelectItem(PRInt32 aPosition)
{
g_return_val_if_fail(GTK_IS_CLIST(mCList), NS_ERROR_FAILURE);
gtk_clist_select_row(GTK_CLIST(mCList), aPosition, 0);
/*
int count = 0;
@ -269,6 +281,8 @@ NS_METHOD nsListBox::SelectItem(PRInt32 aPosition)
//-------------------------------------------------------------------------
PRInt32 nsListBox::GetSelectedCount()
{
g_return_val_if_fail(GTK_IS_CLIST(mCList), NS_ERROR_FAILURE);
return (PRInt32)g_list_length(GTK_CLIST(mCList)->selection);
}

View File

@ -140,6 +140,10 @@ NS_METHOD nsWidget::Move(PRUint32 aX, PRUint32 aY)
#endif
mBounds.x = aX;
mBounds.y = aY;
g_return_val_if_fail(GTK_IS_WIDGET(mWidget), NS_ERROR_FAILURE);
g_return_val_if_fail(GTK_IS_LAYOUT(mWidget->parent), NS_ERROR_FAILURE);
gtk_layout_move(GTK_LAYOUT(mWidget->parent), mWidget, aX, aY);
//XtVaSetValues(mWidget, XmNx, aX, XmNy, GetYCoord(aY), nsnull);
return NS_OK;
@ -152,6 +156,9 @@ NS_METHOD nsWidget::Resize(PRUint32 aWidth, PRUint32 aHeight, PRBool aRepaint)
#endif
mBounds.width = aWidth;
mBounds.height = aHeight;
g_return_val_if_fail(GTK_IS_WIDGET(mWidget), NS_ERROR_FAILURE);
gtk_widget_set_usize(mWidget, aWidth, aHeight);
return NS_OK;
}
@ -171,6 +178,8 @@ NS_METHOD nsWidget::Resize(PRUint32 aX, PRUint32 aY, PRUint32 aWidth,
//-------------------------------------------------------------------------
NS_METHOD nsWidget::Enable(PRBool bState)
{
g_return_val_if_fail(GTK_IS_WIDGET(mWidget), NS_ERROR_FAILURE);
gtk_widget_set_sensitive(mWidget, bState);
return NS_OK;
}
@ -182,6 +191,8 @@ NS_METHOD nsWidget::Enable(PRBool bState)
//-------------------------------------------------------------------------
NS_METHOD nsWidget::SetFocus(void)
{
g_return_val_if_fail(GTK_IS_WIDGET(mWidget), NS_ERROR_FAILURE);
gtk_widget_grab_focus(mWidget);
return NS_OK;
}
@ -210,6 +221,8 @@ nscolor nsWidget::GetForegroundColor(void)
//-------------------------------------------------------------------------
NS_METHOD nsWidget::SetForegroundColor(const nscolor &aColor)
{
g_return_val_if_fail(GTK_IS_WIDGET(mWidget), NS_ERROR_FAILURE);
GtkStyle *style;
GdkColor color;
mForeground = aColor;
@ -240,6 +253,8 @@ nscolor nsWidget::GetBackgroundColor(void)
//-------------------------------------------------------------------------
NS_METHOD nsWidget::SetBackgroundColor(const nscolor &aColor)
{
g_return_val_if_fail(GTK_IS_WIDGET(mWidget), NS_ERROR_FAILURE);
GtkStyle *style;
GdkColor color;
mBackground = aColor;
@ -297,7 +312,12 @@ NS_METHOD nsWidget::SetCursor(nsCursor aCursor)
{
if (!mWidget || !mWidget->window)
return NS_ERROR_FAILURE;
/*
g_return_val_if_fail(mWidget != NULL, NS_ERROR_FAILURE);
g_return_val_if_fail(GTK_IS_WIDGET(mWidget), NS_ERROR_FAILURE);
g_return_val_if_fail(mWidget->window != NULL, NS_ERROR_FAILURE);
*/
// Only change cursor if it's changing
if (aCursor != mCursor) {
GdkCursor *newCursor = 0;
@ -442,16 +462,20 @@ NS_METHOD nsWidget::EndResizingChildren(void)
NS_METHOD nsWidget::GetPreferredSize(PRInt32& aWidth, PRInt32& aHeight)
{
g_return_val_if_fail(aWidth != 0 && aHeight != 0, NS_ERROR_FAILURE);
aWidth = mPreferredWidth;
aHeight = mPreferredHeight;
return (mPreferredWidth != 0 && mPreferredHeight != 0)?NS_OK:NS_ERROR_FAILURE;
return NS_OK;
}
NS_METHOD nsWidget::SetPreferredSize(PRInt32 aWidth, PRInt32 aHeight)
{
mPreferredWidth = aWidth;
mPreferredHeight = aHeight;
return NS_OK;
g_return_val_if_fail(aWidth != 0 && aHeight != 0, NS_ERROR_FAILURE);
mPreferredWidth = aWidth;
mPreferredHeight = aHeight;
return NS_OK;
}
NS_METHOD nsWidget::SetMenuBar(nsIMenuBar * aMenuBar)
@ -500,10 +524,13 @@ nsresult nsWidget::StandardWindowCreate(nsIWidget *aParent,
if (parentWidget)
{
gtk_layout_put(GTK_LAYOUT(parentWidget), mWidget, mBounds.x, mBounds.y);
if (GTK_IS_LAYOUT(parentWidget))
{
gtk_layout_put(GTK_LAYOUT(parentWidget), mWidget, mBounds.x, mBounds.y);
#ifdef DBG
g_print("nsWidget::SWC(%3d,%3d) - %s %p\n", mBounds.x, mBounds.y, mWidget->name, this);
g_print("nsWidget::SWC(%3d,%3d) - %s %p\n", mBounds.x, mBounds.y, mWidget->name, this);
#endif
}
}
InitCallbacks();

View File

@ -501,7 +501,10 @@ void *nsWindow::GetNativeData(PRUint32 aDataType)
{
switch(aDataType) {
case NS_NATIVE_WINDOW:
return (void *)GTK_LAYOUT(mWidget)->bin_window;
if (GTK_IS_LAYOUT(mWidget))
return (void *)GTK_LAYOUT(mWidget)->bin_window;
else
return (void *)mWidget->window;
case NS_NATIVE_DISPLAY:
return (void *)GDK_DISPLAY();
case NS_NATIVE_WIDGET: