<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/">
  <channel rdf:about="http://blog.gmane.org/gmane.comp.lib.agar.scm">
    <title>gmane.comp.lib.agar.scm</title>
    <link>http://blog.gmane.org/gmane.comp.lib.agar.scm</link>
    <description/>
    <syn:updatePeriod>hourly</syn:updatePeriod>
    <syn:updateFrequency>1</syn:updateFrequency>
    <syn:updateBase>1901-01-01T00:00+00:00</syn:updateBase>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.lib.agar.scm/395"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.lib.agar.scm/394"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.lib.agar.scm/393"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.lib.agar.scm/392"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.lib.agar.scm/391"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.lib.agar.scm/390"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.lib.agar.scm/389"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.lib.agar.scm/388"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.lib.agar.scm/387"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.lib.agar.scm/386"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.lib.agar.scm/385"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.lib.agar.scm/384"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.lib.agar.scm/383"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.lib.agar.scm/382"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.lib.agar.scm/381"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.lib.agar.scm/380"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.lib.agar.scm/379"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.lib.agar.scm/378"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.lib.agar.scm/377"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.lib.agar.scm/376"/>
      </rdf:Seq>
    </items>
    <image rdf:resource="http://gmane.org/img/gmane-25t.png"/>
    <textinput rdf:resource=""/>
  </channel>
  <image rdf:about="http://gmane.org/img/gmane-25t.png">
    <title>Gmane</title>
    <url>http://gmane.org/img/gmane-25t.png</url>
    <link>http://gmane.org</link>
  </image>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.lib.agar.scm/395">
    <title>Agar: r7796 - trunk/gui</title>
    <link>http://permalink.gmane.org/gmane.comp.lib.agar.scm/395</link>
    <description>Author: vedge
Date: 2008-10-07 06:57:01 -0300 (Tue, 07 Oct 2008)
New Revision: 7796

Modified:
   trunk/gui/AG_Checkbox.3
   trunk/gui/checkbox.c
   trunk/gui/checkbox.h
Log:
pack a Label widget instead of using the Text API.


Modified: trunk/gui/AG_Checkbox.3
===================================================================
--- trunk/gui/AG_Checkbox.32008-10-07 05:16:06 UTC (rev 7795)
+++ trunk/gui/AG_Checkbox.32008-10-07 09:57:01 UTC (rev 7796)
&lt; at &gt;&lt; at &gt; -48,7 +48,7 &lt; at &gt;&lt; at &gt;
 .Sh INITIALIZATION
 .nr nS 1
 .Ft "AG_Checkbox *"
-.Fn AG_CheckboxNew "AG_Widget *parent" "Uint flags" "const char *label"
+.Fn AG_CheckboxNew "AG_Widget *parent" "Uint flags" "const char *label" "..."
 .Pp
 .Ft "AG_Checkbox *"
 .Fn AG_CheckboxNewFn "AG_Widget *parent" "Uint flags" "const char *label" "AG_EventFn fn" "const char *fmt" "..."
&lt; at &gt;&lt; at &gt; -79,10 +79,13 &lt; at &gt;&lt; at &gt;
 .Fn AG_CheckboxNew
 function allocates, initializes, and attaches a
 .Nm
-widget displaying the given text label.
+widget.
+If the
+.Fa label
+argument is given, it sets a default text label.
 The
 .Fn AG_CheckboxNewFn
-constructor also assigns the specified callback function to the
+variant also assigns the specified callback function to the
 .Sq checkbox-changed
 event.
 .Pp

Modified: trunk/gui/checkbox.c
===================================================================
--- trunk/gui/checkbox.c2008-10-07 05:16:06 UTC (rev 7795)
+++ trunk/gui/checkbox.c2008-10-07 09:57:01 UTC (rev 7796)
&lt; at &gt;&lt; at &gt; -34,20 +34,25 &lt; at &gt;&lt; at &gt;
 #include &lt;stdarg.h&gt;
 #include &lt;string.h&gt;
 
-static void mousebuttondown(AG_Event *);
-static void keydown(AG_Event *);
-
 AG_Checkbox *
-AG_CheckboxNew(void *parent, Uint flags, const char *label)
+AG_CheckboxNew(void *parent, Uint flags, const char *fmt, ...)
 {
 AG_Checkbox *cb;
+va_list args;
 
 cb = Malloc(sizeof(AG_Checkbox));
 AG_ObjectInit(cb, &amp;agCheckboxClass);
 cb-&gt;flags |= flags;
-if (label != NULL) {
-cb-&gt;labelTxt = Strdup(label);
+
+if (fmt != NULL) {
+char text[AG_LABEL_MAX];
+
+va_start(args, fmt);
+Vsnprintf(text, sizeof(text), fmt, args);
+va_end(args);
+cb-&gt;lbl = AG_LabelNewString(cb, 0, text);
 }
+
 if (flags &amp; AG_CHECKBOX_SET) {
 cb-&gt;state = 1;
 }
&lt; at &gt;&lt; at &gt; -144,33 +149,58 &lt; at &gt;&lt; at &gt;
 }
 
 static void
+MouseButtonDown(AG_Event *event)
+{
+AG_Checkbox *cb = AG_SELF();
+int button = AG_INT(1);
+
+if (!AG_WidgetEnabled(cb))
+return;
+
+if (button == SDL_BUTTON(1)) {
+AG_CheckboxToggle(cb);
+}
+AG_WidgetFocus(cb);
+}
+
+static void
+KeyDown(AG_Event *event)
+{
+AG_Checkbox *cb = AG_SELF();
+
+if (!AG_WidgetEnabled(cb))
+return;
+
+switch (AG_SDLKEY(1)) {
+case SDLK_RETURN:
+case SDLK_SPACE:
+AG_CheckboxToggle(cb);
+break;
+default:
+break;
+}
+}
+
+static void
 Init(void *obj)
 {
 AG_Checkbox *cb = obj;
 
 WIDGET(cb)-&gt;flags |= AG_WIDGET_FOCUSABLE;
 
-AG_WidgetBind(cb, "state", AG_WIDGET_BOOL, &amp;cb-&gt;state);
+AG_WidgetBindBool(cb, "state", &amp;cb-&gt;state);
 
 cb-&gt;flags = 0;
 cb-&gt;state = 0;
-cb-&gt;labelTxt = NULL;
-cb-&gt;label = -1;
+cb-&gt;lbl = NULL;
 cb-&gt;spacing = 6;
+cb-&gt;btnSize = agTextFontHeight;
 
-AG_SetEvent(cb, "window-mousebuttondown", mousebuttondown, NULL);
-AG_SetEvent(cb, "window-keydown", keydown, NULL);
+AG_SetEvent(cb, "window-mousebuttondown", MouseButtonDown, NULL);
+AG_SetEvent(cb, "window-keydown", KeyDown, NULL);
 }
 
 static void
-Destroy(void *p)
-{
-AG_Checkbox *cb = p;
-
-Free(cb-&gt;labelTxt);
-}
-
-static void
 Draw(void *obj)
 {
 AG_Checkbox *cb = obj;
&lt; at &gt;&lt; at &gt; -213,64 +243,27 &lt; at &gt;&lt; at &gt;
 state = 0;
 break;
 }
-STYLE(cb)-&gt;CheckboxButton(cb, state);
-AG_WidgetUnlockBinding(stateb);
 
-if (cb-&gt;labelTxt == NULL || cb-&gt;labelTxt[0] == '\0') {
-return;
+STYLE(cb)-&gt;CheckboxButton(cb, state);
+if (cb-&gt;lbl != NULL) {
+AG_WidgetDraw(cb-&gt;lbl);
 }
-if (cb-&gt;label == -1) {
-AG_TextColor(CHECKBOX_TXT_COLOR);
-cb-&gt;label = AG_WidgetMapSurface(cb,
-    AG_TextRender(cb-&gt;labelTxt));
-}
-AG_WidgetBlitSurface(cb, cb-&gt;label, HEIGHT(cb)+cb-&gt;spacing, 0);
+AG_WidgetUnlockBinding(stateb);
 }
 
 static void
-mousebuttondown(AG_Event *event)
-{
-AG_Checkbox *cb = AG_SELF();
-int button = AG_INT(1);
-
-if (!AG_WidgetEnabled(cb))
-return;
-
-if (button == SDL_BUTTON(1)) {
-AG_CheckboxToggle(cb);
-}
-AG_WidgetFocus(cb);
-}
-
-static void
-keydown(AG_Event *event)
-{
-AG_Checkbox *cb = AG_SELF();
-
-if (!AG_WidgetEnabled(cb))
-return;
-
-switch (AG_SDLKEY(1)) {
-case SDLK_RETURN:
-case SDLK_SPACE:
-AG_CheckboxToggle(cb);
-break;
-default:
-break;
-}
-}
-
-static void
 SizeRequest(void *obj, AG_SizeReq *r)
 {
 AG_Checkbox *cb = obj;
+AG_SizeReq rLbl;
 
-r-&gt;h = agTextFontHeight;
-r-&gt;w = agTextFontHeight;
+r-&gt;h = cb-&gt;btnSize;
+r-&gt;w = cb-&gt;btnSize;
 
-if (cb-&gt;labelTxt != NULL) {
-AG_TextSize(cb-&gt;labelTxt, &amp;r-&gt;w, NULL);
-r-&gt;w += agTextFontHeight + cb-&gt;spacing;
+if (cb-&gt;lbl != NULL) {
+AG_WidgetSizeReq(cb-&gt;lbl, &amp;rLbl);
+r-&gt;w += cb-&gt;spacing + rLbl.w;
+r-&gt;h = MAX(r-&gt;h, rLbl.h);
 }
 }
 
&lt; at &gt;&lt; at &gt; -278,21 +271,17 &lt; at &gt;&lt; at &gt;
 SizeAllocate(void *obj, const AG_SizeAlloc *a)
 {
 AG_Checkbox *cb = obj;
+AG_SizeAlloc aLbl;
 
-if (a-&gt;w &lt; agTextFontHeight || a-&gt;h &lt; agTextFontHeight) {
+if (a-&gt;w &lt; cb-&gt;btnSize || a-&gt;h &lt; cb-&gt;btnSize) {
 return (-1);
 }
-if (cb-&gt;labelTxt != NULL) {
-int wLbl, hLbl;
-
-AG_TextSize(cb-&gt;labelTxt, &amp;wLbl, &amp;hLbl);
-
-if (a-&gt;w &lt; agTextFontHeight+cb-&gt;spacing+wLbl ||
-    a-&gt;h &lt; agTextFontHeight) {
-AG_WidgetEnableClipping(cb, AG_RECT(0,0,a-&gt;w,a-&gt;h));
-} else {
-AG_WidgetDisableClipping(cb);
-}
+if (cb-&gt;lbl != NULL) {
+aLbl.x = cb-&gt;btnSize + cb-&gt;spacing;
+aLbl.y = HEIGHT(cb)/2 - HEIGHT(cb-&gt;lbl)/2;
+aLbl.w = a-&gt;w - aLbl.x;
+aLbl.h = a-&gt;h;
+AG_WidgetSizeAlloc(cb-&gt;lbl, &amp;aLbl);
 }
 return (0);
 }
&lt; at &gt;&lt; at &gt; -389,7 +378,7 &lt; at &gt;&lt; at &gt;
 { 0,0 },
 Init,
 NULL,/* free */
-Destroy,
+NULL,/* destroy */
 NULL,/* load */
 NULL,/* save */
 NULL/* edit */

Modified: trunk/gui/checkbox.h
===================================================================
--- trunk/gui/checkbox.h2008-10-07 05:16:06 UTC (rev 7795)
+++ trunk/gui/checkbox.h2008-10-07 09:57:01 UTC (rev 7796)
&lt; at &gt;&lt; at &gt; -4,6 +4,7 &lt; at &gt;&lt; at &gt;
 #define _AGAR_WIDGET_CHECKBOX_H_
 
 #include &lt;agar/gui/widget.h&gt;
+#include &lt;agar/gui/label.h&gt;
 
 #include "begin_code.h"
 
&lt; at &gt;&lt; at &gt; -14,16 +15,16 &lt; at &gt;&lt; at &gt;
 #define AG_CHECKBOX_VFILL0x02
 #define AG_CHECKBOX_EXPAND(AG_CHECKBOX_HFILL|AG_CHECKBOX_VFILL)
 #define AG_CHECKBOX_SET0x04
-int state;
-char *labelTxt;
-int label;
-int spacing;
+int state;/* Default "state" binding */
+int spacing;/* Spacing in pixels */
+AG_Label *lbl;/* Text label */
+int btnSize;/* Button size in pixels */
 } AG_Checkbox;
 
 __BEGIN_DECLS
 extern AG_WidgetClass agCheckboxClass;
 
-AG_Checkbox *AG_CheckboxNew(void *, Uint, const char *);
+AG_Checkbox *AG_CheckboxNew(void *, Uint, const char *, ...);
 AG_Checkbox *AG_CheckboxNewFn(void *, Uint, const char *, AG_EventFn,
                               const char *, ...);
 AG_Checkbox *AG_CheckboxNewInt(void *, Uint, const char *, int *);
</description>
    <dc:creator>Agar-SVN</dc:creator>
    <dc:date>2008-10-07T09:57:32</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.lib.agar.scm/394">
    <title>Agar: r7795 - trunk/math</title>
    <link>http://permalink.gmane.org/gmane.comp.lib.agar.scm/394</link>
    <description>Author: vedge
Date: 2008-10-07 02:16:06 -0300 (Tue, 07 Oct 2008)
New Revision: 7795

Modified:
   trunk/math/m_vector_fpu.h
Log:
typo __inline -&gt; __inline__


Modified: trunk/math/m_vector_fpu.h
===================================================================
--- trunk/math/m_vector_fpu.h2008-10-07 04:57:25 UTC (rev 7794)
+++ trunk/math/m_vector_fpu.h2008-10-07 05:16:06 UTC (rev 7795)
&lt; at &gt;&lt; at &gt; -60,7 +60,7 &lt; at &gt;&lt; at &gt;
 v-&gt;v[i] = 0.0;
 }
 
-static __inline void
+static __inline__ void
 M_VectorFree_FPU(void *pv)
 {
 M_VectorFPU *v=pv;
</description>
    <dc:creator>Agar-SVN</dc:creator>
    <dc:date>2008-10-07T05:16:35</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.lib.agar.scm/393">
    <title>Agar: r7794 - trunk/gui</title>
    <link>http://permalink.gmane.org/gmane.comp.lib.agar.scm/393</link>
    <description>Author: vedge
Date: 2008-10-07 01:57:25 -0300 (Tue, 07 Oct 2008)
New Revision: 7794

Modified:
   trunk/gui/style_default.c
Log:
fix cosmetic off-by-one in WindowBackground()


Modified: trunk/gui/style_default.c
===================================================================
--- trunk/gui/style_default.c2008-10-07 04:44:57 UTC (rev 7793)
+++ trunk/gui/style_default.c2008-10-07 04:57:25 UTC (rev 7794)
&lt; at &gt;&lt; at &gt; -62,7 +62,7 &lt; at &gt;&lt; at &gt;
 
 if (!(win-&gt;flags &amp; AG_WINDOW_NOBACKGROUND)) {
 AG_DrawRectFilled(win,
-    AG_RECT(0, hBar, WIDTH(win), HEIGHT(win)-hBar),
+    AG_RECT(0, hBar-1, WIDTH(win), HEIGHT(win)-hBar),
     AG_COLOR(WINDOW_BG_COLOR));
 }
 if (win-&gt;wBorderBot &gt; 0) {
</description>
    <dc:creator>Agar-SVN</dc:creator>
    <dc:date>2008-10-07T04:57:54</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.lib.agar.scm/392">
    <title>Agar: r7793 - in trunk: core gui math</title>
    <link>http://permalink.gmane.org/gmane.comp.lib.agar.scm/392</link>
    <description>Author: vedge
Date: 2008-10-07 01:44:57 -0300 (Tue, 07 Oct 2008)
New Revision: 7793

Modified:
   trunk/core/error.h
   trunk/core/event.h
   trunk/core/prop.h
   trunk/gui/gui_math.h
   trunk/math/m_line.h
Log:
use consistent "static __inline__" form to give gen-declspecs.pl a chance..


Modified: trunk/core/error.h
===================================================================
--- trunk/core/error.h2008-10-07 04:43:32 UTC (rev 7792)
+++ trunk/core/error.h2008-10-07 04:44:57 UTC (rev 7793)
&lt; at &gt;&lt; at &gt; -103,7 +103,11 &lt; at &gt;&lt; at &gt;
 # define AG_Free(p) free(p)
 # undef FREE_NULL_IS_A_NOOP
 #else
-static __inline__ void AG_Free(void *p) { if (p != NULL) free(p); }
+static __inline__ void
+AG_Free(void *p) {
+if (p != NULL)
+free(p);
+}
 #endif
 __END_DECLS
 

Modified: trunk/core/event.h
===================================================================
--- trunk/core/event.h2008-10-07 04:43:32 UTC (rev 7792)
+++ trunk/core/event.h2008-10-07 04:44:57 UTC (rev 7793)
&lt; at &gt;&lt; at &gt; -105,35 +105,6 &lt; at &gt;&lt; at &gt;
 
 typedef void (*AG_EventFn)(AG_Event *);
 
-__BEGIN_DECLS
-extern const char *agEvArgTypeNames[];
-
-void      AG_EventInit(AG_Event *);
-void      AG_EventArgs(AG_Event *, const char *, ...);
-AG_Event *AG_SetEvent(void *, const char *, AG_EventFn, const char *, ....);
-AG_Event *AG_AddEvent(void *, const char *, AG_EventFn, const char *, ....);
-void      AG_UnsetEvent(void *, const char *);
-void      AG_PostEvent(void *, void *, const char *, const char *, ...);
-int       AG_ProcessEvent(SDL_Event *);
-AG_Event *AG_FindEventHandler(void *, const char *);
-
-int       AG_SchedEvent(void *, void *, Uint32, const char *,
-                        const char *, ...);
-int       AG_ReschedEvent(void *, const char *, Uint32);
-int       AG_CancelEvent(void *, const char *);
-void      AG_ForwardEvent(void *, void *, AG_Event *);
-void      AG_BindGlobalKey(SDLKey, SDLMod, void (*)(void));
-void      AG_BindGlobalKeyEv(SDLKey, SDLMod, void (*)(AG_Event *));
-
-/* Execute an event handler routine without processing any arguments. */
-static __inline__ void
-AG_ExecEventFn(void *obj, AG_Event *ev)
-{
-if (ev-&gt;handler != NULL)
-AG_PostEvent(NULL, obj, ev-&gt;name, NULL);
-}
-__END_DECLS
-
 #ifdef DEBUG
 #define AG_EVENT_DEFAULT_CASE() default: AG_FatalError("Bad event arg spec");
 #define AG_EVENT_BOUNDARY_CHECK(ev) \
&lt; at &gt;&lt; at &gt; -210,10 +181,35 &lt; at &gt;&lt; at &gt;
 }
 
 __BEGIN_DECLS
-/*
- * Push arguments onto an Event structure.
- */
+extern const char *agEvArgTypeNames[];
+
+void      AG_EventInit(AG_Event *);
+void      AG_EventArgs(AG_Event *, const char *, ...);
+AG_Event *AG_SetEvent(void *, const char *, AG_EventFn, const char *, ....);
+AG_Event *AG_AddEvent(void *, const char *, AG_EventFn, const char *, ....);
+void      AG_UnsetEvent(void *, const char *);
+void      AG_PostEvent(void *, void *, const char *, const char *, ...);
+int       AG_ProcessEvent(SDL_Event *);
+AG_Event *AG_FindEventHandler(void *, const char *);
+
+int       AG_SchedEvent(void *, void *, Uint32, const char *,
+                        const char *, ...);
+int       AG_ReschedEvent(void *, const char *, Uint32);
+int       AG_CancelEvent(void *, const char *);
+void      AG_ForwardEvent(void *, void *, AG_Event *);
+void      AG_BindGlobalKey(SDLKey, SDLMod, void (*)(void));
+void      AG_BindGlobalKeyEv(SDLKey, SDLMod, void (*)(AG_Event *));
+
+/* Execute an event handler routine without processing any arguments. */
 static __inline__ void
+AG_ExecEventFn(void *obj, AG_Event *ev)
+{
+if (ev-&gt;handler != NULL)
+AG_PostEvent(NULL, obj, ev-&gt;name, NULL);
+}
+
+/* Push arguments onto an Event structure. */
+static __inline__ void
 AG_EventPushPointer(AG_Event *ev, const char *key, void *val)
 {
 AG_EVENT_INS_VAL(ev, AG_EVARG_POINTER, key, p, val);

Modified: trunk/core/prop.h
===================================================================
--- trunk/core/prop.h2008-10-07 04:43:32 UTC (rev 7792)
+++ trunk/core/prop.h2008-10-07 04:44:57 UTC (rev 7793)
&lt; at &gt;&lt; at &gt; -215,44 +215,67 &lt; at &gt;&lt; at &gt;
  ********************/
 
 static __inline__ AG_Prop *
-AG_SetUint(void *ob, const char *key, Uint i) {
+AG_SetUint(void *ob, const char *key, Uint i)
+{
 return (AG_SetProp(ob, key, AG_PROP_UINT, i));
 }
-static __inline__ AG_Prop *AG_SetInt(void *ob, const char *key, int i) {
+static __inline__ AG_Prop *
+AG_SetInt(void *ob, const char *key, int i)
+{
 return (AG_SetProp(ob, key, AG_PROP_INT, i));
 }
-static __inline__ AG_Prop *AG_SetUint8(void *ob, const char *key, Uint8 i) {
+static __inline__ AG_Prop *
+AG_SetUint8(void *ob, const char *key, Uint8 i)
+{
 return (AG_SetProp(ob, key, AG_PROP_UINT8, i));
 }
-static __inline__ AG_Prop *AG_SetSint8(void *ob, const char *key, Sint8 i) {
+static __inline__ AG_Prop *
+AG_SetSint8(void *ob, const char *key, Sint8 i)
+{
 return (AG_SetProp(ob, key, AG_PROP_SINT8, i));
 }
-static __inline__ AG_Prop *AG_SetUint16(void *ob, const char *key, Uint16 i) {
+static __inline__ AG_Prop *
+AG_SetUint16(void *ob, const char *key, Uint16 i)
+{
 return (AG_SetProp(ob, key, AG_PROP_UINT16, i));
 }
-static __inline__ AG_Prop *AG_SetSint16(void *ob, const char *key, Sint16 i) {
+static __inline__ AG_Prop *
+AG_SetSint16(void *ob, const char *key, Sint16 i)
+{
 return (AG_SetProp(ob, key, AG_PROP_SINT16, i));
 }
-static __inline__ AG_Prop *AG_SetUint32(void *ob, const char *key, Uint32 i) {
+static __inline__ AG_Prop *
+AG_SetUint32(void *ob, const char *key, Uint32 i)
+{
 return (AG_SetProp(ob, key, AG_PROP_UINT32, i));
 }
-static __inline__ AG_Prop *AG_SetSint32(void *ob, const char *key, Sint32 i) {
+static __inline__ AG_Prop *
+AG_SetSint32(void *ob, const char *key, Sint32 i)
+{
 return (AG_SetProp(ob, key, AG_PROP_SINT32, i));
 }
 
 #ifdef HAVE_64BIT
-static __inline__ AG_Prop *AG_SetUint64(void *ob, const char *key, Uint64 i) {
+static __inline__ AG_Prop *
+AG_SetUint64(void *ob, const char *key, Uint64 i)
+{
 return (AG_SetProp(ob, key, AG_PROP_UINT64, i));
 }
-static __inline__ AG_Prop *AG_SetSint64(void *ob, const char *key, Sint64 i) {
+static __inline__ AG_Prop *
+AG_SetSint64(void *ob, const char *key, Sint64 i)
+{
 return (AG_SetProp(ob, key, AG_PROP_SINT64, i));
 }
 #endif /* HAVE_64BIT */
 
-static __inline__ AG_Prop *AG_SetFloat(void *ob, const char *key, float f) {
+static __inline__ AG_Prop *
+AG_SetFloat(void *ob, const char *key, float f)
+{
 return (AG_SetProp(ob, key, AG_PROP_FLOAT, f));
 }
-static __inline__ AG_Prop *AG_SetDouble(void *ob, const char *key, double d) {
+static __inline__ AG_Prop *
+AG_SetDouble(void *ob, const char *key, double d)
+{
 return (AG_SetProp(ob, key, AG_PROP_DOUBLE, d));
 }
 
&lt; at &gt;&lt; at &gt; -264,69 +287,91 &lt; at &gt;&lt; at &gt;
 }
 #endif /* HAVE_LONG_DOUBLE */
 
-static __inline__ AG_Prop *AG_SetPointer(void *ob, const char *key, void *p) {
+static __inline__ AG_Prop *
+AG_SetPointer(void *ob, const char *key, void *p)
+{
 return (AG_SetProp(ob, key, AG_PROP_POINTER, p));
 }
-static __inline__ AG_Prop *AG_SetBool(void *ob, const char *key, int i) {
+static __inline__ AG_Prop *
+AG_SetBool(void *ob, const char *key, int i)
+{
 return (AG_SetProp(ob, key, AG_PROP_BOOL, i));
 }
-static __inline__ Uint AG_GetUint(void *p, const char *key) {
+static __inline__ Uint
+AG_GetUint(void *p, const char *key)
+{
 Uint i;
 if (AG_GetProp(p, key, AG_PROP_UINT, (Uint *)&amp;i) == NULL) {
 AG_FatalError("%s", AG_GetError());
 }
 return (i);
 }
-static __inline__ int AG_GetInt(void *p, const char *key) {
+static __inline__ int
+AG_GetInt(void *p, const char *key)
+{
 int i;
 if (AG_GetProp(p, key, AG_PROP_INT, (int *)&amp;i) == NULL) {
 AG_FatalError("%s", AG_GetError());
 }
 return (i);
 }
-static __inline__ int AG_GetBool(void *p, const char *key) {
+static __inline__ int
+AG_GetBool(void *p, const char *key)
+{
 int i;
 if (AG_GetProp(p, key, AG_PROP_BOOL, (int *)&amp;i) == NULL) {
 AG_FatalError("%s", AG_GetError());
 }
 return (i);
 }
-static __inline__ Uint8 AG_GetUint8(void *p, const char *key) {
+static __inline__ Uint8
+AG_GetUint8(void *p, const char *key)
+{
 Uint8 i;
 if (AG_GetProp(p, key, AG_PROP_UINT8, (Uint8 *)&amp;i) == NULL) {
 AG_FatalError("%s", AG_GetError());
 }
 return (i);
 }
-static __inline__ Sint8 AG_GetSint8(void *p, const char *key) {
+static __inline__ Sint8
+AG_GetSint8(void *p, const char *key)
+{
 Sint8 i;
 if (AG_GetProp(p, key, AG_PROP_SINT8, (Sint8 *)&amp;i) == NULL) {
 AG_FatalError("%s", AG_GetError());
 }
 return (i);
 }
-static __inline__ Uint16 AG_GetUint16(void *p, const char *key) {
+static __inline__ Uint16
+AG_GetUint16(void *p, const char *key)
+{
 Uint16 i;
 if (AG_GetProp(p, key, AG_PROP_UINT16, (Uint16 *)&amp;i) == NULL) {
 AG_FatalError("%s", AG_GetError());
 }
 return (i);
 }
-static __inline__ Sint16 AG_GetSint16(void *p, const char *key) {
+static __inline__ Sint16
+AG_GetSint16(void *p, const char *key)
+{
 Sint16 i;
 if (AG_GetProp(p, key, AG_PROP_SINT16, (Sint16 *)&amp;i) == NULL) {
 AG_FatalError("%s", AG_GetError());
 }
 return (i);
 }
-static __inline__ Uint32 AG_GetUint32(void *p, const char *key) {
+static __inline__ Uint32
+AG_GetUint32(void *p, const char *key)
+{
 Uint32 i;
 if (AG_GetProp(p, key, AG_PROP_UINT32, (Uint32 *)&amp;i) == NULL) {
 AG_FatalError("%s", AG_GetError());
 }
 return (i);
 }
-static __inline__ Sint32 AG_GetSint32(void *p, const char *key) {
+static __inline__ Sint32
+AG_GetSint32(void *p, const char *key)
+{
 Sint32 i;
 if (AG_GetProp(p, key, AG_PROP_SINT32, (Sint32 *)&amp;i) == NULL) {
 AG_FatalError("%s", AG_GetError());
&lt; at &gt;&lt; at &gt; -335,14 +380,18 &lt; at &gt;&lt; at &gt;
 }
 
 #ifdef HAVE_64BIT
-static __inline__ Uint64 AG_GetUint64(void *p, const char *key) {
+static __inline__ Uint64
+AG_GetUint64(void *p, const char *key)
+{
 Uint64 i;
 if (AG_GetProp(p, key, AG_PROP_UINT64, (Uint64 *)&amp;i) == NULL) {
 AG_FatalError("%s", AG_GetError());
 }
 return (i);
 }
-static __inline__ Sint64 AG_GetSint64(void *p, const char *key) {
+static __inline__ Sint64
+AG_GetSint64(void *p, const char *key)
+{
 Sint64 i;
 if (AG_GetProp(p, key, AG_PROP_SINT64, (Sint64 *)&amp;i) == NULL) {
 AG_FatalError("%s", AG_GetError());
&lt; at &gt;&lt; at &gt; -351,14 +400,18 &lt; at &gt;&lt; at &gt;
 }
 #endif /* HAVE_64BIT */
 
-static __inline__ float AG_GetFloat(void *p, const char *key) {
+static __inline__ float
+AG_GetFloat(void *p, const char *key)
+{
 float f;
 if (AG_GetProp(p, key, AG_PROP_FLOAT, (float *)&amp;f) == NULL) {
 AG_FatalError("%s", AG_GetError());
 }
 return (f);
 }
-static __inline__ double AG_GetDouble(void *p, const char *key) {
+static __inline__ double
+AG_GetDouble(void *p, const char *key)
+{
 double d;
 if (AG_GetProp(p, key, AG_PROP_DOUBLE, (double *)&amp;d) == NULL) {
 AG_FatalError("%s", AG_GetError());
&lt; at &gt;&lt; at &gt; -367,7 +420,9 &lt; at &gt;&lt; at &gt;
 }
 
 #ifdef HAVE_LONG_DOUBLE
-static __inline__ long double AG_GetLongDouble(void *p, const char *key) {
+static __inline__ long double
+AG_GetLongDouble(void *p, const char *key)
+{
 long double d;
 if (AG_GetProp(p, key, AG_PROP_LONG_DOUBLE, (long double *)&amp;d)
     == NULL) {
&lt; at &gt;&lt; at &gt; -377,14 +432,18 &lt; at &gt;&lt; at &gt;
 }
 #endif /* HAVE_LONG_DOUBLE */
 
-static __inline__ char *AG_GetString(void *p, const char *key) {
+static __inline__ char *
+AG_GetString(void *p, const char *key)
+{
 char *s;
 if (AG_GetProp(p, key, AG_PROP_STRING, (char *)&amp;s) == NULL) {
 AG_FatalError("%s", AG_GetError());
 }
 return (s);
 }
-static __inline__ void *AG_GetPointer(void *p, const char *key) {
+static __inline__ void *
+AG_GetPointer(void *p, const char *key)
+{
 void *np;
 if (AG_GetProp(p, key, AG_PROP_POINTER, (void *)&amp;np) == NULL) {
 AG_FatalError("%s", AG_GetError());

Modified: trunk/gui/gui_math.h
===================================================================
--- trunk/gui/gui_math.h2008-10-07 04:43:32 UTC (rev 7792)
+++ trunk/gui/gui_math.h2008-10-07 04:44:57 UTC (rev 7793)
&lt; at &gt;&lt; at &gt; -77,10 +77,26 &lt; at &gt;&lt; at &gt;
 while (val &lt; i) { val &lt;&lt;= 1; }
 return (val);
 }
-static __inline__ float AG_Hypot(float x, float y) { return AG_Sqrt(x*x+y*y); }
-static __inline__ int AG_Truncf(double d) { return ((int)floor(d)); }
-static __inline__ double AG_Fracf(double d) { return (d - floor(d)); }
-static __inline__ double AG_FracInvf(double d) { return (1 - (d - floor(d))); }
+static __inline__ float
+AG_Hypot(float x, float y)
+{
+return AG_Sqrt(x*x+y*y);
+}
+static __inline__ int
+AG_Truncf(double d)
+{
+return ((int)floor(d));
+}
+static __inline__ double
+AG_Fracf(double d)
+{
+return (d - floor(d));
+}
+static __inline__ double
+AG_FracInvf(double d)
+{
+return (1 - (d - floor(d)));
+}
 __END_DECLS
 
 #include "close_code.h"

Modified: trunk/math/m_line.h
===================================================================
--- trunk/math/m_line.h2008-10-07 04:43:32 UTC (rev 7792)
+++ trunk/math/m_line.h2008-10-07 04:44:57 UTC (rev 7793)
&lt; at &gt;&lt; at &gt; -38,8 +38,16 &lt; at &gt;&lt; at &gt;
 }
 
 /* Test whether the given Line is actually a ray. */
-static __inline__ int M_LineIsRay2(M_Line2 L) { return (L.t == M_INFINITY); }
-static __inline__ int M_LineIsRay3(M_Line3 L) { return (L.t == M_INFINITY); }
+static __inline__ int
+M_LineIsRay2(M_Line2 L)
+{
+return (L.t == M_INFINITY);
+}
+static __inline__ int
+M_LineIsRay3(M_Line3 L)
+{
+return (L.t == M_INFINITY);
+}
 
 /* Return the first and second Points of the given Line. */
 static __inline__ M_Vector2
</description>
    <dc:creator>Agar-SVN</dc:creator>
    <dc:date>2008-10-07T04:45:26</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.lib.agar.scm/391">
    <title>Agar: r7792 - trunk/demos</title>
    <link>http://permalink.gmane.org/gmane.comp.lib.agar.scm/391</link>
    <description>Author: vedge
Date: 2008-10-07 01:43:32 -0300 (Tue, 07 Oct 2008)
New Revision: 7792

Modified:
   trunk/demos/Makefile
Log:
"make proj" requires Makefile.config


Modified: trunk/demos/Makefile
===================================================================
--- trunk/demos/Makefile2008-10-07 04:41:02 UTC (rev 7791)
+++ trunk/demos/Makefile2008-10-07 04:43:32 UTC (rev 7792)
&lt; at &gt;&lt; at &gt; -63,7 +63,7 &lt; at &gt;&lt; at &gt;
 proj:
 for D in ${SUBDIR}; do \
 echo "==&gt; $$D"; \
-(cd $$D &amp;&amp; ${MAKE} proj); \
+(cd $$D &amp;&amp; touch Makefile.config &amp;&amp; ${MAKE} proj); \
 done
 
 proj-vs2005:
</description>
    <dc:creator>Agar-SVN</dc:creator>
    <dc:date>2008-10-07T04:44:00</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.lib.agar.scm/390">
    <title>Agar: r7791 - trunk/gui</title>
    <link>http://permalink.gmane.org/gmane.comp.lib.agar.scm/390</link>
    <description>Author: vedge
Date: 2008-10-07 01:41:02 -0300 (Tue, 07 Oct 2008)
New Revision: 7791

Modified:
   trunk/gui/label.c
   trunk/gui/label.h
Log:
use PushClipRect() exclusively


Modified: trunk/gui/label.c
===================================================================
--- trunk/gui/label.c2008-10-07 04:40:12 UTC (rev 7790)
+++ trunk/gui/label.c2008-10-07 04:41:02 UTC (rev 7791)
&lt; at &gt;&lt; at &gt; -209,20 +209,15 &lt; at &gt;&lt; at &gt;
 {
 AG_Label *lbl = obj;
 int wLbl, hLbl;
-AG_Rect rView;
 
 if (a-&gt;w &lt; 1 || a-&gt;h &lt; 1) {
 return (-1);
 }
-rView.x = lbl-&gt;lPad;
-rView.y = lbl-&gt;tPad;
-rView.w = a-&gt;w - lbl-&gt;rPad;
-rView.h = a-&gt;h - lbl-&gt;bPad;
+lbl-&gt;rClip.x = lbl-&gt;lPad;
+lbl-&gt;rClip.y = lbl-&gt;tPad;
+lbl-&gt;rClip.w = a-&gt;w - lbl-&gt;rPad;
+lbl-&gt;rClip.h = a-&gt;h - lbl-&gt;bPad;
 
-if (lbl-&gt;type == AG_LABEL_POLLED) {
-AG_WidgetEnableClipping(lbl, rView);
-return (0);
-}
 if (lbl-&gt;text == NULL)
 return (0);
 
&lt; at &gt;&lt; at &gt; -232,14 +227,8 &lt; at &gt;&lt; at &gt;
  */
 AG_TextSize(lbl-&gt;text, &amp;wLbl, &amp;hLbl);
 
-if (hLbl+lbl-&gt;tPad+lbl-&gt;bPad &gt; a-&gt;h) {
-AG_WidgetEnableClipping(lbl, rView);
-} else {
-AG_WidgetDisableClipping(lbl);
-}
 if ((wLbl + lbl-&gt;lPad + lbl-&gt;rPad) &gt; a-&gt;w) {
 lbl-&gt;flags |= AG_LABEL_PARTIAL;
-AG_WidgetDisableClipping(lbl);
 if (lbl-&gt;surfaceCont == -1) {
 /* TODO share this between all widgets */
 AG_PushTextState();
&lt; at &gt;&lt; at &gt; -651,12 +640,12 &lt; at &gt;&lt; at &gt;
 {
 AG_Label *lbl = obj;
 int x, y, cw = 0;/* make compiler happy */
-
+
 if (lbl-&gt;flags &amp; AG_LABEL_FRAME)
 AG_DrawFrame(lbl,
     AG_RECT(0, 0, WIDTH(lbl), HEIGHT(lbl)), -1,
     AG_COLOR(FRAME_COLOR));
-
+
 if (lbl-&gt;flags &amp; AG_LABEL_PARTIAL) {
 cw = WSURFACE(lbl,lbl-&gt;surfaceCont)-&gt;w;
 if (WIDTH(lbl) &lt;= cw) {
&lt; at &gt;&lt; at &gt; -669,6 +658,8 &lt; at &gt;&lt; at &gt;
 }
 AG_PushClipRect(lbl,
     AG_RECT(0, 0, WIDTH(lbl)-cw, HEIGHT(lbl)));
+} else {
+AG_PushClipRect(lbl, lbl-&gt;rClip);
 }
 
 AG_PushTextState();
&lt; at &gt;&lt; at &gt; -705,8 +696,9 &lt; at &gt;&lt; at &gt;
 break;
 }
 
+AG_PopClipRect();
+
 if (lbl-&gt;flags &amp; AG_LABEL_PARTIAL) {
-AG_PopClipRect();
 GetPosition(lbl, WSURFACE(lbl,lbl-&gt;surfaceCont), &amp;x, &amp;y);
 AG_WidgetBlitSurface(lbl, lbl-&gt;surfaceCont,
     WIDTH(lbl) - cw,

Modified: trunk/gui/label.h
===================================================================
--- trunk/gui/label.h2008-10-07 04:40:12 UTC (rev 7790)
+++ trunk/gui/label.h2008-10-07 04:41:02 UTC (rev 7791)
&lt; at &gt;&lt; at &gt; -64,6 +64,7 &lt; at &gt;&lt; at &gt;
 } poll;
 AG_SLIST_HEAD(,ag_label_flag) lflags;/* Label flag descriptions */
 struct ag_text_cache *tCache;/* Cache for polled labels */
+AG_Rect rClip;/* Clipping rectangle */
 } AG_Label;
 
 __BEGIN_DECLS
</description>
    <dc:creator>Agar-SVN</dc:creator>
    <dc:date>2008-10-07T04:41:31</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.lib.agar.scm/389">
    <title>Agar: r7790 - trunk/gui</title>
    <link>http://permalink.gmane.org/gmane.comp.lib.agar.scm/389</link>
    <description>Author: vedge
Date: 2008-10-07 01:40:12 -0300 (Tue, 07 Oct 2008)
New Revision: 7790

Modified:
   trunk/gui/table.c
Log:
use standard WidgetSizeAlloc() and WidgetDraw() API for drawing cell widgets


Modified: trunk/gui/table.c
===================================================================
--- trunk/gui/table.c2008-10-06 15:00:52 UTC (rev 7789)
+++ trunk/gui/table.c2008-10-07 04:40:12 UTC (rev 7790)
&lt; at &gt;&lt; at &gt; -196,8 +196,6 &lt; at &gt;&lt; at &gt;
 #endif
 SizeFillCols(t);
 AG_TableUpdateScrollbars(t);
-
-AG_WidgetEnableClipping(t, AG_RECT(0,0,a-&gt;w,a-&gt;h));
 return (0);
 }
 
&lt; at &gt;&lt; at &gt; -324,17 +322,18 &lt; at &gt;&lt; at &gt;
 goto blit;
 case AG_CELL_WIDGET:
 if (WIDGET_OPS(c-&gt;data.p)-&gt;draw != NULL) {
+AG_SizeAlloc wa;
 AG_Widget *W = c-&gt;data.p;
 
-W-&gt;x = rd-&gt;x;
-W-&gt;y = rd-&gt;y;
-W-&gt;w = rd-&gt;w;
-W-&gt;h = rd-&gt;h;
-W-&gt;cx = WIDGET(t)-&gt;cx + rd-&gt;x;
-W-&gt;cy = WIDGET(t)-&gt;cy + rd-&gt;y;
-W-&gt;cx2 = W-&gt;cx + W-&gt;w;
-W-&gt;cy2 = W-&gt;cy + W-&gt;h;
-AGWIDGET_OPS(W)-&gt;draw(W);
+wa.x = rd-&gt;x;
+wa.y = rd-&gt;y;
+wa.w = rd-&gt;w;
+wa.h = rd-&gt;h;
+AG_WidgetSizeAlloc(W, &amp;wa);
+AG_WidgetUpdateCoords(W,
+    WIDGET(t)-&gt;cx + rd-&gt;x,
+    WIDGET(t)-&gt;cy + rd-&gt;y);
+AG_WidgetDraw(W);
 }
 c-&gt;surface = -1;
 return;
</description>
    <dc:creator>Agar-SVN</dc:creator>
    <dc:date>2008-10-07T04:40:42</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.lib.agar.scm/388">
    <title>Agar: r7789 - trunk/gui</title>
    <link>http://permalink.gmane.org/gmane.comp.lib.agar.scm/388</link>
    <description>Author: vedge
Date: 2008-10-06 12:00:52 -0300 (Mon, 06 Oct 2008)
New Revision: 7789

Modified:
   trunk/gui/AG_Scrollview.3
   trunk/gui/scrollview.c
   trunk/gui/scrollview.h
Log:
- use the computed view coordinates in ClipWidgets().
- implement SetIncrement(), SCROLLVIEW_FRAME.


Modified: trunk/gui/AG_Scrollview.3
===================================================================
--- trunk/gui/AG_Scrollview.32008-10-06 14:50:25 UTC (rev 7788)
+++ trunk/gui/AG_Scrollview.32008-10-06 15:00:52 UTC (rev 7789)
&lt; at &gt;&lt; at &gt; -55,6 +55,9 &lt; at &gt;&lt; at &gt;
 .Ft "void"
 .Fn AG_ScrollviewSizeHint "AG_Scrollview *sv" "Uint width" "Uint height"
 .Pp
+.Ft "void"
+.Fn AG_ScrollviewSetIncrement "AG_Scrollview *sv" "int increment"
+.Pp
 .nr nS 0
 The
 .Fn AG_ScrollviewNew
&lt; at &gt;&lt; at &gt; -81,6 +84,8 &lt; at &gt;&lt; at &gt;
 .It Dv AG_SCROLLVIEW_BY_KBD
 Panning with keyboard is permitted (may interfere with the operation
 of child widgets).
+.It Dv AG_SCROLLVIEW_FRAME
+Draw background and frame.
 .El
 .Pp
 The
&lt; at &gt;&lt; at &gt; -89,6 +94,9 &lt; at &gt;&lt; at &gt;
 .Nm
 in pixels.
 .Pp
+.Fn AG_ScrollviewSetIncrement
+sets the increment for scrolling the view, in pixels.
+.Pp
 .Sh EVENTS
 The
 .Nm

Modified: trunk/gui/scrollview.c
===================================================================
--- trunk/gui/scrollview.c2008-10-06 14:50:25 UTC (rev 7788)
+++ trunk/gui/scrollview.c2008-10-06 15:00:52 UTC (rev 7789)
&lt; at &gt;&lt; at &gt; -33,20 +33,20 &lt; at &gt;&lt; at &gt;
 #include &lt;stdarg.h&gt;
 #include &lt;string.h&gt;
 
-/* Disable drawing of widgets completely outside of the view. */
+/* Clip widgets completely outside of the view in a more efficient way. */
 static void
-ClipWidgets(AG_Scrollview *sv, AG_Widget *wid, int xRel, int yRel)
+ClipWidgets(AG_Scrollview *sv, AG_Widget *wid)
 {
 AG_Widget *chld;
 
-if (wid-&gt;x+wid-&gt;w &lt; 0 ||
-    wid-&gt;y+wid-&gt;h &lt; 0) {
+if (wid-&gt;cx + wid-&gt;w &lt; WIDGET(sv)-&gt;cx ||
+    wid-&gt;cy + wid-&gt;h &lt; WIDGET(sv)-&gt;cy) {
 wid-&gt;flags |= AG_WIDGET_HIDE;
 } else {
 wid-&gt;flags &amp;= ~(AG_WIDGET_HIDE);
 }
 OBJECT_FOREACH_CHILD(chld, wid, ag_widget)
-ClipWidgets(sv, chld, wid-&gt;x, wid-&gt;y);
+ClipWidgets(sv, chld);
 }
 
 /* Place child widgets at the current offset in the Scrollview. */
&lt; at &gt;&lt; at &gt; -76,7 +76,7 &lt; at &gt;&lt; at &gt;
 aChld.y += aChld.h;
 break;
 }
-ClipWidgets(sv, chld, 0,0);
+ClipWidgets(sv, chld);
 }
 switch (sv-&gt;pack) {
 case AG_PACK_HORIZ:
&lt; at &gt;&lt; at &gt; -168,6 +168,9 &lt; at &gt;&lt; at &gt;
 AG_Scrollview *sv = AG_PTR(1);
 AG_Window *pWin = AG_ParentWindow(sv);
 
+if (pWin != NULL)
+AG_WindowUpdate(pWin);
+
 PlaceWidgets(sv, NULL, NULL);
 
 if (pWin != NULL)
&lt; at &gt;&lt; at &gt; -212,11 +215,21 &lt; at &gt;&lt; at &gt;
 if (flags &amp; AG_SCROLLVIEW_BY_KBD) {
 AG_SetEvent(sv, "window-keydown", KeyDown, NULL);
 }
-
+AG_ScrollviewSetIncrement(sv, 10);
 AG_ObjectAttach(parent, sv);
 return (sv);
 }
 
+void
+AG_ScrollviewSetIncrement(AG_Scrollview *sv, int incr)
+{
+AG_ObjectLock(sv);
+sv-&gt;incr = incr;
+if (sv-&gt;hbar != NULL) { AG_ScrollbarSetIntIncrement(sv-&gt;hbar, incr); }
+if (sv-&gt;vbar != NULL) { AG_ScrollbarSetIntIncrement(sv-&gt;vbar, incr); }
+AG_ObjectUnlock(sv);
+}
+
 static void
 Init(void *obj)
 {
&lt; at &gt;&lt; at &gt; -235,6 +248,7 &lt; at &gt;&lt; at &gt;
 sv-&gt;vbar = NULL;
 sv-&gt;pack = AG_PACK_VERT;
 sv-&gt;rView = AG_RECT(0,0,0,0);
+sv-&gt;incr = 10;
 }
 
 void
&lt; at &gt;&lt; at &gt; -349,13 +363,15 &lt; at &gt;&lt; at &gt;
 AG_Scrollview *sv = p;
 AG_Widget *chld;
 
-AG_DrawBox(sv,
-    AG_RECT(0, 0, WIDTH(sv), HEIGHT(sv)), -1,
-    AG_COLOR(FRAME_COLOR));
+if (sv-&gt;flags &amp; AG_SCROLLVIEW_FRAME) {
+AG_DrawBox(sv,
+    AG_RECT(0, 0, WIDTH(sv), HEIGHT(sv)), -1,
+    AG_COLOR(FRAME_COLOR));
+}
 
 if (sv-&gt;hbar != NULL) { AG_WidgetDraw(sv-&gt;hbar); }
 if (sv-&gt;vbar != NULL) { AG_WidgetDraw(sv-&gt;vbar); }
-
+
 AG_PushClipRect(sv, sv-&gt;rView);
 WIDGET_FOREACH_CHILD(chld, sv) {
 if (chld == WIDGET(sv-&gt;hbar) || chld == WIDGET(sv-&gt;vbar)) {

Modified: trunk/gui/scrollview.h
===================================================================
--- trunk/gui/scrollview.h2008-10-06 14:50:25 UTC (rev 7788)
+++ trunk/gui/scrollview.h2008-10-06 15:00:52 UTC (rev 7789)
&lt; at &gt;&lt; at &gt; -19,6 +19,7 &lt; at &gt;&lt; at &gt;
 #define AG_SCROLLVIEW_PANNING0x10 /* Panning in progress */
 #define AG_SCROLLVIEW_BY_CURSOR0x20 /* Panning with cursor allowed */
 #define AG_SCROLLVIEW_BY_KBD0x40 /* Panning with keyboard allowed */
+#define AG_SCROLLVIEW_FRAME0x80 /* Draw background and frame */
 #define AG_SCROLLVIEW_EXPAND(AG_SCROLLVIEW_HFILL|AG_SCROLLVIEW_VFILL)
 #define AG_SCROLLVIEW_NOPAN_XY(AG_SCROLLVIEW_NOPAN_X|AG_SCROLLVIEW_NOPAN_Y)
 
&lt; at &gt;&lt; at &gt; -28,13 +29,15 &lt; at &gt;&lt; at &gt;
 int xMin, xMax, yMin, yMax;/* Display boundaries */
 AG_Rect rView;/* Available space for widgets */
 AG_Scrollbar *hbar, *vbar;/* Scrollbars for panning */
+int incr;/* Scrolling increment */
 } AG_Scrollview;
 
 __BEGIN_DECLS
 extern AG_WidgetClass agScrollviewClass;
 
-AG_Scrollview*AG_ScrollviewNew(void *, Uint);
-void AG_ScrollviewSizeHint(AG_Scrollview *, Uint, Uint);
+AG_Scrollview *AG_ScrollviewNew(void *, Uint);
+void           AG_ScrollviewSizeHint(AG_Scrollview *, Uint, Uint);
+void           AG_ScrollviewSetIncrement(AG_Scrollview *, int);
 __END_DECLS
 
 #include "close_code.h"
</description>
    <dc:creator>Agar-SVN</dc:creator>
    <dc:date>2008-10-06T15:01:18</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.lib.agar.scm/387">
    <title>Agar: r7788 - trunk/gui</title>
    <link>http://permalink.gmane.org/gmane.comp.lib.agar.scm/387</link>
    <description>Author: vedge
Date: 2008-10-06 11:50:25 -0300 (Mon, 06 Oct 2008)
New Revision: 7788

Modified:
   trunk/gui/style.h
   trunk/gui/style_default.c
Log:
merge Scrollbar*() and Scrollbar*Buttons() operations; fix undersize case..


Modified: trunk/gui/style.h
===================================================================
--- trunk/gui/style.h2008-10-06 14:46:30 UTC (rev 7787)
+++ trunk/gui/style.h2008-10-06 14:50:25 UTC (rev 7788)
&lt; at &gt;&lt; at &gt; -40,9 +40,8 &lt; at &gt;&lt; at &gt;
 void (*RadioButton)(struct ag_radio *, int x, int y, int selected,
                     int over);
 void (*ProgressBarBackground)(void *);
-void (*ScrollbarBackground)(void *);
-void (*ScrollbarVertButtons)(struct ag_scrollbar *, int y, int h);
-void (*ScrollbarHorizButtons)(struct ag_scrollbar *, int x, int w);
+void (*ScrollbarVert)(struct ag_scrollbar *, int y, int h);
+void (*ScrollbarHoriz)(struct ag_scrollbar *, int x, int w);
 void (*SliderBackgroundHoriz)(void *);
 void (*SliderBackgroundVert)(void *);
 void (*SliderControlHoriz)(void *, int, int);

Modified: trunk/gui/style_default.c
===================================================================
--- trunk/gui/style_default.c2008-10-06 14:46:30 UTC (rev 7787)
+++ trunk/gui/style_default.c2008-10-06 14:50:25 UTC (rev 7788)
&lt; at &gt;&lt; at &gt; -353,16 +353,6 &lt; at &gt;&lt; at &gt;
     AG_COLOR(FRAME_COLOR));
 }
 
-
-/* Background for Scrollbar */
-static void
-ScrollbarBackground(void *sb)
-{
-AG_DrawBox(sb,
-    AG_RECT(0, 0, WIDTH(sb), HEIGHT(sb)), -1,
-    AG_COLOR(SCROLLBAR_COLOR));
-}
-
 /* Background for horizontal Slider */
 static void
 SliderBackgroundHoriz(void *sl)
&lt; at &gt;&lt; at &gt; -407,74 +397,170 &lt; at &gt;&lt; at &gt;
     AG_COLOR(SCROLLBAR_BTN_COLOR));
 }
 
+/* Vertical scrollbar (undersize case). */
+static void
+ScrollbarVertUndersize(AG_Scrollbar *sb)
+{
+int w = WIDTH(sb)/2;
+int size = MIN(HEIGHT(sb)/4, WIDTH(sb));
+
+AG_DrawBox(sb, AG_RECT(0,0,WIDTH(sb),HEIGHT(sb)), 1,
+    AG_COLOR(SCROLLBAR_BTN_COLOR));
+AG_DrawArrowUp(sb,
+    w,
+    size,
+    size,
+    AG_COLOR(SCROLLBAR_ARR1_COLOR),
+    AG_COLOR(SCROLLBAR_ARR2_COLOR));
+AG_DrawArrowDown(sb,
+    w,
+    HEIGHT(sb)/2 + size,
+    size,
+    AG_COLOR(SCROLLBAR_ARR1_COLOR),
+    AG_COLOR(SCROLLBAR_ARR2_COLOR));
+}
+
 /* Buttons of vertical Scrollbar */
 static void
-ScrollbarVertButtons(AG_Scrollbar *sb, int y, int h)
+ScrollbarVert(AG_Scrollbar *sb, int y, int h)
 {
+int mid = WIDTH(sb)/2;
+int b2 = sb-&gt;wButton*2;
+int hArrow = MIN(WIDTH(sb), sb-&gt;hArrow);
 int y2;
 
+if (HEIGHT(sb) &lt; b2) {
+ScrollbarVertUndersize(sb);
+return;
+}
+
+/* Background */
 AG_DrawBox(sb,
+    AG_RECT(0, 0, WIDTH(sb), HEIGHT(sb)), -1,
+    AG_COLOR(SCROLLBAR_COLOR));
+
+/* Upper button. */
+AG_DrawBox(sb,
     AG_RECT(0, 0, WIDTH(sb), sb-&gt;wButton),
     (sb-&gt;curBtn == AG_SCROLLBAR_BUTTON_DEC) ? -1 : 1,
     AG_COLOR(SCROLLBAR_BTN_COLOR));
-AG_DrawArrowUp(sb, WIDTH(sb)/2, sb-&gt;wButton/2, sb-&gt;hArrow,
+AG_DrawArrowUp(sb,
+    mid,
+    sb-&gt;wButton/2,
+    hArrow,
     AG_COLOR(SCROLLBAR_ARR1_COLOR),
     AG_COLOR(SCROLLBAR_ARR2_COLOR));
 
+/* Lower button. */
 y2 = HEIGHT(sb) - sb-&gt;wButton;
 AG_DrawBox(sb,
     AG_RECT(0, y2, WIDTH(sb), sb-&gt;wButton),
     (sb-&gt;curBtn == AG_SCROLLBAR_BUTTON_INC) ? -1 : 1,
     AG_COLOR(SCROLLBAR_BTN_COLOR));
-AG_DrawArrowDown(sb, WIDTH(sb)/2, (y2 + sb-&gt;wButton/2), sb-&gt;hArrow,
+AG_DrawArrowDown(sb,
+    mid,
+    y2 + sb-&gt;wButton/2,
+    hArrow,
     AG_COLOR(SCROLLBAR_ARR1_COLOR),
     AG_COLOR(SCROLLBAR_ARR2_COLOR));
 
+/* Scrollbar. */
 if (h &gt; 0) {
 AG_DrawBox(sb,
-    AG_RECT(0, sb-&gt;wButton+y, WIDTH(sb), h),
+    AG_RECT(0,
+            sb-&gt;wButton + y,
+    WIDTH(sb),
+    MIN(h, HEIGHT(sb)-b2)),
     (sb-&gt;curBtn == AG_SCROLLBAR_BUTTON_SCROLL) ? -1 : 1,
     AG_COLOR(SCROLLBAR_BTN_COLOR));
 } else {
 AG_DrawBox(sb,
-    AG_RECT(0, sb-&gt;wButton, WIDTH(sb),
-            HEIGHT(sb) - sb-&gt;wButton*2),
+    AG_RECT(0,
+            sb-&gt;wButton,
+    WIDTH(sb),
+            HEIGHT(sb)-b2),
     (sb-&gt;curBtn == AG_SCROLLBAR_BUTTON_SCROLL) ? -1 : 1,
     AG_COLOR(SCROLLBAR_BTN_COLOR));
 }
 }
 
+/* Horizontal scrollbar (undersize case). */
+static void
+ScrollbarHorizUndersize(AG_Scrollbar *sb)
+{
+int h = HEIGHT(sb)/2;
+int size = MIN(WIDTH(sb)/4, HEIGHT(sb));
+
+AG_DrawBox(sb, AG_RECT(0,0,WIDTH(sb),HEIGHT(sb)), 1,
+    AG_COLOR(SCROLLBAR_BTN_COLOR));
+AG_DrawArrowLeft(sb,
+    size,
+    h,
+    size,
+    AG_COLOR(SCROLLBAR_ARR1_COLOR),
+    AG_COLOR(SCROLLBAR_ARR2_COLOR));
+AG_DrawArrowRight(sb,
+    WIDTH(sb)/2 + size,
+    h,
+    size,
+    AG_COLOR(SCROLLBAR_ARR1_COLOR),
+    AG_COLOR(SCROLLBAR_ARR2_COLOR));
+}
+
 /* Buttons of horizontal Scrollbar */
 static void
-ScrollbarHorizButtons(AG_Scrollbar *sb, int x, int w)
+ScrollbarHoriz(AG_Scrollbar *sb, int x, int w)
 {
+int mid = HEIGHT(sb)/2;
+int b2 = sb-&gt;wButton*2;
+int hArrow = MIN(HEIGHT(sb), sb-&gt;hArrow);
 int x2;
 
+if (WIDTH(sb) &lt; b2) {
+ScrollbarHorizUndersize(sb);
+return;
+}
+
+/* Background */
 AG_DrawBox(sb,
+    AG_RECT(0, 0, WIDTH(sb), HEIGHT(sb)), -1,
+    AG_COLOR(SCROLLBAR_COLOR));
+
+/* Left button */
+AG_DrawBox(sb,
     AG_RECT(0, 0, sb-&gt;wButton, HEIGHT(sb)),
     (sb-&gt;curBtn == AG_SCROLLBAR_BUTTON_DEC) ? -1 : 1,
     AG_COLOR(SCROLLBAR_BTN_COLOR));
-AG_DrawArrowLeft(sb, sb-&gt;wButton/2, HEIGHT(sb)/2, sb-&gt;hArrow,
+AG_DrawArrowLeft(sb,
+    sb-&gt;wButton/2, mid,
+    hArrow,
     AG_COLOR(SCROLLBAR_ARR1_COLOR),
     AG_COLOR(SCROLLBAR_ARR2_COLOR));
 
+/* Right button */
 x2 = WIDTH(sb)-sb-&gt;wButton;
 AG_DrawBox(sb,
     AG_RECT(x2, 0, sb-&gt;wButton, HEIGHT(sb)),
     (sb-&gt;curBtn == AG_SCROLLBAR_BUTTON_INC) ? -1 : 1,
     AG_COLOR(SCROLLBAR_BTN_COLOR));
-AG_DrawArrowRight(sb, (x2 + sb-&gt;wButton/2), HEIGHT(sb)/2, sb-&gt;hArrow,
+AG_DrawArrowRight(sb, (x2 + sb-&gt;wButton/2), mid, hArrow,
     AG_COLOR(SCROLLBAR_ARR1_COLOR),
     AG_COLOR(SCROLLBAR_ARR2_COLOR));
 
+/* Scrollbar */
 if (w &gt; 0) {
 AG_DrawBox(sb,
-    AG_RECT(sb-&gt;wButton+x, 0, w, HEIGHT(sb)),
+    AG_RECT(sb-&gt;wButton + x,
+            0,
+    MIN(w, WIDTH(sb)-b2),
+    HEIGHT(sb)),
     (sb-&gt;curBtn == AG_SCROLLBAR_BUTTON_SCROLL) ? -1 : 1,
     AG_COLOR(SCROLLBAR_BTN_COLOR));
 } else {
 AG_DrawBox(sb,
-    AG_RECT(sb-&gt;wButton, 0, WIDTH(sb) - sb-&gt;wButton*2,
+    AG_RECT(sb-&gt;wButton,
+            0,
+    WIDTH(sb)-b2,
             HEIGHT(sb)),
     (sb-&gt;curBtn == AG_SCROLLBAR_BUTTON_SCROLL) ? -1 : 1,
     AG_COLOR(SCROLLBAR_BTN_COLOR));
&lt; at &gt;&lt; at &gt; -679,9 +765,8 &lt; at &gt;&lt; at &gt;
 RadioGroupBackground,
 RadioButton,
 ProgressBarBackground,
-ScrollbarBackground,
-ScrollbarVertButtons,
-ScrollbarHorizButtons,
+ScrollbarVert,
+ScrollbarHoriz,
 SliderBackgroundHoriz,
 SliderBackgroundVert,
 SliderControlHoriz,
</description>
    <dc:creator>Agar-SVN</dc:creator>
    <dc:date>2008-10-06T14:50:51</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.lib.agar.scm/386">
    <title>Agar: r7787 - trunk/gui</title>
    <link>http://permalink.gmane.org/gmane.comp.lib.agar.scm/386</link>
    <description>Author: vedge
Date: 2008-10-06 11:46:30 -0300 (Mon, 06 Oct 2008)
New Revision: 7787

Modified:
   trunk/gui/table.c
Log:
set our scrollbars non-focusable.


Modified: trunk/gui/table.c
===================================================================
--- trunk/gui/table.c2008-10-06 14:43:24 UTC (rev 7786)
+++ trunk/gui/table.c2008-10-06 14:46:30 UTC (rev 7787)
&lt; at &gt;&lt; at &gt; -1669,12 +1669,11 &lt; at &gt;&lt; at &gt;
 t-&gt;prew = -1;/* Use column size specs */
 t-&gt;preh = 64;
 t-&gt;wTbl = -1;
+
 t-&gt;vbar = AG_ScrollbarNew(t, AG_SCROLLBAR_VERT, 0);
-#if 0
-t-&gt;hbar = AG_ScrollbarNew(t, AG_SCROLLBAR_HORIZ, 0);
-#else
-t-&gt;hbar = NULL;
-#endif
+AG_WidgetSetFocusable(t-&gt;vbar, 0);
+/*t-&gt;hbar = AG_ScrollbarNew(t, AG_SCROLLBAR_HORIZ, 0); */
+
 t-&gt;poll_ev = NULL;
 t-&gt;nResizing = -1;
 t-&gt;cols = NULL;
</description>
    <dc:creator>Agar-SVN</dc:creator>
    <dc:date>2008-10-06T14:46:56</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.lib.agar.scm/385">
    <title>Agar: r7786 - in trunk: ada-gui gui</title>
    <link>http://permalink.gmane.org/gmane.comp.lib.agar.scm/385</link>
    <description>Author: vedge
Date: 2008-10-06 11:43:24 -0300 (Mon, 06 Oct 2008)
New Revision: 7786

Modified:
   trunk/ada-gui/agar-gui-widget-scrollbar.ads
   trunk/gui/AG_Scrollbar.3
   trunk/gui/scrollbar.c
   trunk/gui/scrollbar.h
Log:
- remove SCROLLBAR_FOCUSABLE flag, set focusable by default.
- merge ScrollbarBackground(), Scrollbar{Horiz,Vert}Buttons() into one style op.
- add boundary check to SeekToPosition() itself.
- wButtonDef is redundant.
- fix rendering in numerically undefined case.


Modified: trunk/ada-gui/agar-gui-widget-scrollbar.ads
===================================================================
--- trunk/ada-gui/agar-gui-widget-scrollbar.ads2008-10-06 14:16:41 UTC (rev 7785)
+++ trunk/ada-gui/agar-gui-widget-scrollbar.ads2008-10-06 14:43:24 UTC (rev 7786)
&lt; at &gt;&lt; at &gt; -28,7 +28,6 &lt; at &gt;&lt; at &gt;
   type flags_t is new c.unsigned;
   SCROLLBAR_HFILL     : constant flags_t := 16#01#;
   SCROLLBAR_VFILL     : constant flags_t := 16#02#;
-  SCROLLBAR_FOCUSABLE : constant flags_t := 16#04#;
   SCROLLBAR_EXPAND    : constant flags_t := SCROLLBAR_HFILL or SCROLLBAR_VFILL;
 
   type scrollbar_t is limited private;

Modified: trunk/gui/AG_Scrollbar.3
===================================================================
--- trunk/gui/AG_Scrollbar.32008-10-06 14:16:41 UTC (rev 7785)
+++ trunk/gui/AG_Scrollbar.32008-10-06 14:43:24 UTC (rev 7786)
&lt; at &gt;&lt; at &gt; -134,17 +134,10 &lt; at &gt;&lt; at &gt;
 };
 .Ed
 .Pp
-Acceptable values for the
+There are currently no
 .Fa flags
-argument include:
+specific to this widget.
 .Pp
-.Bl -tag -width "AG_SCROLLBAR_FOCUSABLE "
-.It AG_SCROLLBAR_FOCUSABLE
-Allow the scrollbar to gain focus (disabled by default).
-This is equivalent to calling
-.Xr AG_WidgetSetFocusable .
-.El
-.Pp
 The
 .Fn AG_ScrollbarNew*
 variants create a scrollbar and also bind

Modified: trunk/gui/scrollbar.c
===================================================================
--- trunk/gui/scrollbar.c2008-10-06 14:16:41 UTC (rev 7785)
+++ trunk/gui/scrollbar.c2008-10-06 14:43:24 UTC (rev 7786)
&lt; at &gt;&lt; at &gt; -46,7 +46,6 &lt; at &gt;&lt; at &gt;
 
 if (flags &amp; AG_SCROLLBAR_HFILL) { AG_ExpandHoriz(sb); }
 if (flags &amp; AG_SCROLLBAR_VFILL) { AG_ExpandVert(sb); }
-if (flags &amp; AG_SCROLLBAR_FOCUSABLE) { AG_WidgetSetFocusable(sb, 1); }
 
 AG_ObjectAttach(parent, sb);
 return (sb);
&lt; at &gt;&lt; at &gt; -317,6 +316,12 &lt; at &gt;&lt; at &gt;
     (*(type *)pMax - *(type *)pVis - *(type *)pMin) /\
     sb-&gt;extent;\
 *(type *)pVal += *(type *)pMin;\
+if (*(type *)pVal &lt; *(type *)pMin) {\
+*(type *)pVal = *(type *)pMin;\
+}\
+if (*(type *)pVal &gt; *(type *)pMax) {\
+*(type *)pVal = *(type *)pMax;\
+}\
 }
 
 static __inline__ void
&lt; at &gt;&lt; at &gt; -682,7 +687,8 &lt; at &gt;&lt; at &gt;
 AG_Scrollbar *sb = obj;
 
 WIDGET(sb)-&gt;flags |= AG_WIDGET_UNFOCUSED_BUTTONUP|
-                     AG_WIDGET_UNFOCUSED_MOTION;
+                     AG_WIDGET_UNFOCUSED_MOTION|
+     AG_WIDGET_FOCUSABLE;
 
 AG_WidgetBindInt(sb, "value", &amp;sb-&gt;value);
 AG_WidgetBindInt(sb, "min", &amp;sb-&gt;min);
&lt; at &gt;&lt; at &gt; -696,15 +702,16 &lt; at &gt;&lt; at &gt;
 sb-&gt;min = 0;
 sb-&gt;max = 0;
 sb-&gt;visible = 0;
-sb-&gt;wButtonDef = 16;/* XXX */
-sb-&gt;wButton = 16;
-sb-&gt;wBar = 8;
 sb-&gt;buttonIncFn = NULL;
 sb-&gt;buttonDecFn = NULL;
 sb-&gt;xOffs = 0;
 sb-&gt;rInc = 1.0;
 sb-&gt;iInc = 1;
 
+sb-&gt;wBar = 8;
+sb-&gt;wButton = 16;
+sb-&gt;hArrow = sb-&gt;wButton*5/9;
+
 AG_SetEvent(sb, "window-mousebuttondown", MouseButtonDown, NULL);
 AG_SetEvent(sb, "window-mousebuttonup", MouseButtonUp, NULL);
 AG_SetEvent(sb, "window-mousemotion", MouseMotion, NULL);
&lt; at &gt;&lt; at &gt; -726,12 +733,12 &lt; at &gt;&lt; at &gt;
 
 switch (sb-&gt;type) {
 case AG_SCROLLBAR_HORIZ:
-r-&gt;w = sb-&gt;wButtonDef*2;
-r-&gt;h = sb-&gt;wButtonDef;
+r-&gt;w = sb-&gt;wButton*2;
+r-&gt;h = sb-&gt;wButton;
 break;
 case AG_SCROLLBAR_VERT:
-r-&gt;w = sb-&gt;wButtonDef;
-r-&gt;h = sb-&gt;wButtonDef*2;
+r-&gt;w = sb-&gt;wButton;
+r-&gt;h = sb-&gt;wButton*2;
 break;
 }
 }
&lt; at &gt;&lt; at &gt; -744,27 +751,9 &lt; at &gt;&lt; at &gt;
 if (a-&gt;w &lt; 4 || a-&gt;h &lt; 4) {
 return (-1);
 }
-switch (sb-&gt;type) {
-case AG_SCROLLBAR_VERT:
-if (a-&gt;h &lt; sb-&gt;wButtonDef*2) {
-sb-&gt;wButton = a-&gt;h/2;
-} else {
-sb-&gt;wButton = sb-&gt;wButtonDef;
-}
-sb-&gt;extent = a-&gt;h;
-break;
-case AG_SCROLLBAR_HORIZ:
-if (a-&gt;w &lt; sb-&gt;wButtonDef*2) {
-sb-&gt;wButton = a-&gt;w/2;
-} else {
-sb-&gt;wButton = sb-&gt;wButtonDef;
-}
-sb-&gt;extent = a-&gt;w;
-break;
-}
-sb-&gt;extent -= sb-&gt;wButton*2;
-sb-&gt;extent -= sb-&gt;wBar;
-sb-&gt;hArrow = sb-&gt;wButton*5/9;
+sb-&gt;extent = ((sb-&gt;type==AG_SCROLLBAR_VERT) ? a-&gt;h : a-&gt;w) -
+             sb-&gt;wButton*2 - sb-&gt;wBar;
+if (sb-&gt;extent &lt; 0) { sb-&gt;extent = 0; }
 return (0);
 }
 
&lt; at &gt;&lt; at &gt; -778,10 +767,11 &lt; at &gt;&lt; at &gt;
 AG_TextColor(TEXT_COLOR);
 AG_TextBGColorHex(0xccccccff);
 
-Snprintf(label, sizeof(label), "%d &lt; %d &lt; %d",
+Snprintf(label, sizeof(label), "%d &lt; %d &lt; %d(%d)",
     AG_WidgetInt(sb,"min"),
     AG_WidgetInt(sb,"value"),
-    AG_WidgetInt(sb,"max"));
+    AG_WidgetInt(sb,"max"),
+    AG_WidgetInt(sb,"visible"));
 
 /* XXX inefficient */
 txt = AG_TextRender(label);
&lt; at &gt;&lt; at &gt; -799,22 +789,20 &lt; at &gt;&lt; at &gt;
 AG_Scrollbar *sb = obj;
 int x, size;
 
-STYLE(sb)-&gt;ScrollbarBackground(sb);
-
 if (GetPosition(sb, &amp;x) == 0) {
 size = (sb-&gt;wBar == -1) ? sb-&gt;extent : sb-&gt;wBar;
 if (size &lt; 0) { size = 0; }
 } else {
 x = 0;
-size = sb-&gt;extent - 1;
+size = sb-&gt;extent + sb-&gt;wBar;
 }
 
 switch (sb-&gt;type) {
 case AG_SCROLLBAR_VERT:
-STYLE(sb)-&gt;ScrollbarVertButtons(sb, x, size);
+STYLE(sb)-&gt;ScrollbarVert(sb, x, size);
 break;
 case AG_SCROLLBAR_HORIZ:
-STYLE(sb)-&gt;ScrollbarHorizButtons(sb, x, size);
+STYLE(sb)-&gt;ScrollbarHoriz(sb, x, size);
 break;
 }
 if (sb-&gt;flags &amp; AG_SCROLLBAR_TEXT)

Modified: trunk/gui/scrollbar.h
===================================================================
--- trunk/gui/scrollbar.h2008-10-06 14:16:41 UTC (rev 7785)
+++ trunk/gui/scrollbar.h2008-10-06 14:43:24 UTC (rev 7786)
&lt; at &gt;&lt; at &gt; -24,7 +24,6 &lt; at &gt;&lt; at &gt;
 Uint flags;
 #define AG_SCROLLBAR_HFILL0x01
 #define AG_SCROLLBAR_VFILL0x02
-#define AG_SCROLLBAR_FOCUSABLE0x04
 #define AG_SCROLLBAR_TEXT0x08/* Print values */
 #define AG_SCROLLBAR_EXPAND(AG_SCROLLBAR_HFILL|AG_SCROLLBAR_VFILL)
 
&lt; at &gt;&lt; at &gt; -33,8 +32,7 &lt; at &gt;&lt; at &gt;
 int visible;/* Subtracts from range */
 enum ag_scrollbar_type type;/* Style of scrollbar */
 enum ag_scrollbar_button curBtn; /* Active button */
-int wButton;/* Effective button size */
-int wButtonDef;/* Default button size */
+int wButton;/* Button size */
 int wBar;/* Scroll bar size */
 int hArrow;/* Arrow height */
 AG_Event *buttonIncFn;/* Alt. handler for increment btns */
&lt; at &gt;&lt; at &gt; -125,7 +123,6 &lt; at &gt;&lt; at &gt;
 AG_ScrollbarSetButtonSize(AG_Scrollbar *sb, int wButton)
 {
 AG_ObjectLock(sb);
-sb-&gt;wButtonDef = wButton;
 sb-&gt;wButton = wButton;
 AG_ObjectUnlock(sb);
 }
</description>
    <dc:creator>Agar-SVN</dc:creator>
    <dc:date>2008-10-06T14:43:50</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.lib.agar.scm/384">
    <title>Agar: r7785 - in trunk: ada-gui gui</title>
    <link>http://permalink.gmane.org/gmane.comp.lib.agar.scm/384</link>
    <description>Author: vedge
Date: 2008-10-06 11:16:41 -0300 (Mon, 06 Oct 2008)
New Revision: 7785

Modified:
   trunk/ada-gui/agar-gui-window.ads
   trunk/gui/AG_Window.3
   trunk/gui/window.c
   trunk/gui/window.h
Log:
introduce WINDOW_NOCLIPPING flag.


Modified: trunk/ada-gui/agar-gui-window.ads
===================================================================
--- trunk/ada-gui/agar-gui-window.ads2008-10-06 13:56:39 UTC (rev 7784)
+++ trunk/ada-gui/agar-gui-window.ads2008-10-06 14:16:41 UTC (rev 7785)
&lt; at &gt;&lt; at &gt; -21,26 +21,33 &lt; at &gt;&lt; at &gt;
   --
 
   subtype flags_t is agar.gui.types.window_flags_t;
-  WINDOW_MODAL         : constant flags_t := 16#00001#;
-  WINDOW_MAXIMIZED     : constant flags_t := 16#00002#;
-  WINDOW_MINIMIZED     : constant flags_t := 16#00004#;
-  WINDOW_KEEPABOVE     : constant flags_t := 16#00008#;
-  WINDOW_KEEPBELOW     : constant flags_t := 16#00010#;
-  WINDOW_DENYFOCUS     : constant flags_t := 16#00020#;
-  WINDOW_NOTITLE       : constant flags_t := 16#00040#;
-  WINDOW_NOBORDERS     : constant flags_t := 16#00080#;
-  WINDOW_NOHRESIZE     : constant flags_t := 16#00100#;
-  WINDOW_NOVRESIZE     : constant flags_t := 16#00200#;
-  WINDOW_NOCLOSE       : constant flags_t := 16#00400#;
-  WINDOW_NOMINIMIZE    : constant flags_t := 16#00800#;
-  WINDOW_NOMAXIMIZE    : constant flags_t := 16#01000#;
-  WINDOW_NOBACKGROUND  : constant flags_t := 16#08000#;
-  WINDOW_NOUPDATERECT  : constant flags_t := 16#10000#;
-  WINDOW_FOCUSONATTACH : constant flags_t := 16#20000#;
-  WINDOW_HMAXIMIZE     : constant flags_t := 16#40000#;
-  WINDOW_VMAXIMIZE     : constant flags_t := 16#80000#;
-  WINDOW_NORESIZE      : constant flags_t := WINDOW_NOHRESIZE or WINDOW_NOVRESIZE;
-  WINDOW_PLAIN         : constant flags_t := WINDOW_NOTITLE or WINDOW_NOBORDERS;
+  WINDOW_MODAL         : constant flags_t := 16#000001#;
+  WINDOW_MAXIMIZED     : constant flags_t := 16#000002#;
+  WINDOW_MINIMIZED     : constant flags_t := 16#000004#;
+  WINDOW_KEEPABOVE     : constant flags_t := 16#000008#;
+  WINDOW_KEEPBELOW     : constant flags_t := 16#000010#;
+  WINDOW_DENYFOCUS     : constant flags_t := 16#000020#;
+  WINDOW_NOTITLE       : constant flags_t := 16#000040#;
+  WINDOW_NOBORDERS     : constant flags_t := 16#000080#;
+  WINDOW_NOHRESIZE     : constant flags_t := 16#000100#;
+  WINDOW_NOVRESIZE     : constant flags_t := 16#000200#;
+  WINDOW_NOCLOSE       : constant flags_t := 16#000400#;
+  WINDOW_NOMINIMIZE    : constant flags_t := 16#000800#;
+  WINDOW_NOMAXIMIZE    : constant flags_t := 16#001000#;
+  WINDOW_NOBACKGROUND  : constant flags_t := 16#008000#;
+  WINDOW_NOUPDATERECT  : constant flags_t := 16#010000#;
+  WINDOW_FOCUSONATTACH : constant flags_t := 16#020000#;
+  WINDOW_HMAXIMIZE     : constant flags_t := 16#040000#;
+  WINDOW_VMAXIMIZE     : constant flags_t := 16#080000#;
+  WINDOW_NOMOVE        : constant flags_t := 16#100000#;
+  WINDOW_NOCLIPPING    : constant flags_t := 16#200000#;
+  WINDOW_NORESIZE      : constant flags_t := WINDOW_NOHRESIZE or
+                                             WINDOW_NOVRESIZE;
+  WINDOW_NOBUTTONS     : constant flags_t := WINDOW_NOCLOSE or
+                                             WINDOW_NOMINIMIZE or
+                                             WINDOW_NOMAXIMIZE;
+  WINDOW_PLAIN         : constant flags_t := WINDOW_NOTITLE or
+                                             WINDOW_NOBORDERS;
 
   subtype alignment_t is agar.gui.types.window_alignment_t;
 

Modified: trunk/gui/AG_Window.3
===================================================================
--- trunk/gui/AG_Window.32008-10-06 13:56:39 UTC (rev 7784)
+++ trunk/gui/AG_Window.32008-10-06 14:16:41 UTC (rev 7785)
&lt; at &gt;&lt; at &gt; -233,6 +233,8 &lt; at &gt;&lt; at &gt;
 Keep window scaled to the display height.
 .It AG_WINDOW_NOMOVE
 User is not allowed to move the window.
+.It AG_WINDOW_NOCLIPPING
+Disable the clipping rectangle over the window area (enabled by default)..
 .El
 .Pp
 The

Modified: trunk/gui/window.c
===================================================================
--- trunk/gui/window.c2008-10-06 13:56:39 UTC (rev 7784)
+++ trunk/gui/window.c2008-10-06 14:16:41 UTC (rev 7785)
&lt; at &gt;&lt; at &gt; -230,15 +230,17 &lt; at &gt;&lt; at &gt;
 STYLE(win)-&gt;Window(win);
 
 hTitle = (win-&gt;tbar != NULL) ? HEIGHT(win-&gt;tbar) : 0;
-AG_PushClipRect(win,
-    AG_RECT(0, 0,
-            WIDTH(win) - win-&gt;wBorderSide*2,
-    HEIGHT(win) - win-&gt;wBorderBot));
-
-WIDGET_FOREACH_CHILD(chld, win)
+if (!(win-&gt;flags &amp; AG_WINDOW_NOCLIPPING)) {
+AG_PushClipRect(win,
+    AG_RECT(0, 0,
+            WIDTH(win) - win-&gt;wBorderSide*2,
+    HEIGHT(win) - win-&gt;wBorderBot));
+}
+WIDGET_FOREACH_CHILD(chld, win) {
 AG_WidgetDraw(chld);
-
-AG_PopClipRect();
+}
+if (!(win-&gt;flags &amp; AG_WINDOW_NOCLIPPING))
+AG_PopClipRect();
 }
 
 /* Apply initial alignment parameter. */

Modified: trunk/gui/window.h
===================================================================
--- trunk/gui/window.h2008-10-06 13:56:39 UTC (rev 7784)
+++ trunk/gui/window.h2008-10-06 14:16:41 UTC (rev 7785)
&lt; at &gt;&lt; at &gt; -68,6 +68,8 &lt; at &gt;&lt; at &gt;
 #define AG_WINDOW_HMAXIMIZE0x040000 /* Keep maximized horizontally */
 #define AG_WINDOW_VMAXIMIZE0x080000 /* Keep maximized vertically */
 #define AG_WINDOW_NOMOVE0x100000 /* Disallow movement of window */
+#define AG_WINDOW_NOCLIPPING0x200000 /* Don't set a clipping rectangle
+    over the window area */
 
 #define AG_WINDOW_NORESIZE(AG_WINDOW_NOHRESIZE|AG_WINDOW_NOVRESIZE)
 #define AG_WINDOW_NOBUTTONS(AG_WINDOW_NOCLOSE|AG_WINDOW_NOMINIMIZE|\
</description>
    <dc:creator>Agar-SVN</dc:creator>
    <dc:date>2008-10-06T14:17:06</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.lib.agar.scm/383">
    <title>Agar: r7784 - trunk/gui</title>
    <link>http://permalink.gmane.org/gmane.comp.lib.agar.scm/383</link>
    <description>Author: vedge
Date: 2008-10-06 10:56:39 -0300 (Mon, 06 Oct 2008)
New Revision: 7784

Modified:
   trunk/gui/AG_Widget.3
Log:
document WidgetSetFocusable()


Modified: trunk/gui/AG_Widget.3
===================================================================
--- trunk/gui/AG_Widget.32008-10-06 13:55:50 UTC (rev 7783)
+++ trunk/gui/AG_Widget.32008-10-06 13:56:39 UTC (rev 7784)
&lt; at &gt;&lt; at &gt; -236,7 +236,7 &lt; at &gt;&lt; at &gt;
 macros evaluate whether the given widget is enabled for input.
 .Sh FOCUS STATE
 The focus state of a widget controls both its appearance and enables the
-reception of specific types of events.
+reception of specific types of events which are filtered by default.
 A focused widget (in a currently focused window) will receive mouse events
 .Sq window-mousemotion ,
 .Sq window-mousebuttonup ,
&lt; at &gt;&lt; at &gt; -245,15 +245,17 &lt; at &gt;&lt; at &gt;
 and
 .Sq window-keydown .
 .Pp
-Note that any widget can still receive those events regardless of focus
-state, using
-.Dv AG_WIDGET_UNFOCUSED_*
-flags, such as
-.Dv AG_WIDGET_UNFOCUSED_MOTION
+Widget can explicitely disable focus-dependent filtering for those events
+by setting the flags
+.Dv AG_WIDGET_UNFOCUSED_MOTION ,
+.Dv AG_WIDGET_UNFOCUSED_BUTTONUP
 and
-.Dv AG_WIDGET_UNFOCUSED_BUTTONUP .
+.Dv AG_WIDGET_UNFOCUSED_BUTTONDOWN .
 .Pp
 .nr nS 1
+.Ft "void"
+.Fn AG_WidgetSetFocusable "AG_Widget *widget" "int enable"
+.Pp
 .Ft "int"
 .Fn AG_WidgetFocused "AG_Widget *widget"
 .Pp
&lt; at &gt;&lt; at &gt; -268,6 +270,10 &lt; at &gt;&lt; at &gt;
 .Pp
 .nr nS 0
 The
+.Fn AG_WidgetSetFocusable
+routine sets whether the widget is allowed to gain focus (off by default).
+.Pp
+The
 .Fn AG_WidgetFocused
 macro evaluates to 1 if a widget holds focus inside of its parent.
 .Pp
&lt; at &gt;&lt; at &gt; -1247,7 +1253,8 &lt; at &gt;&lt; at &gt;
 .Dq INPUT STATE
 section for more details.
 .It AG_WIDGET_FOCUSABLE
-The widget can grab the focus.
+Widget allowed to grab the focus (set by
+.Fn AG_WidgetSetFocusable ) .
 .It AG_WIDGET_UNFOCUSED_MOTION
 Receive
 .Sq window-mousemotion
</description>
    <dc:creator>Agar-SVN</dc:creator>
    <dc:date>2008-10-06T13:57:05</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.lib.agar.scm/382">
    <title>Agar: r7783 - trunk/gui</title>
    <link>http://permalink.gmane.org/gmane.comp.lib.agar.scm/382</link>
    <description>Author: vedge
Date: 2008-10-06 10:55:50 -0300 (Mon, 06 Oct 2008)
New Revision: 7783

Modified:
   trunk/gui/view.h
Log:
fix geometry returned by RectIntersect()


Modified: trunk/gui/view.h
===================================================================
--- trunk/gui/view.h2008-10-06 13:51:44 UTC (rev 7782)
+++ trunk/gui/view.h2008-10-06 13:55:50 UTC (rev 7783)
&lt; at &gt;&lt; at &gt; -483,10 +483,10 &lt; at &gt;&lt; at &gt;
 {
 AG_Rect x;
 
-x.x = (a-&gt;x &gt; b-&gt;x) ? a-&gt;x : b-&gt;x;
-x.y = (a-&gt;y &gt; b-&gt;y) ? a-&gt;y : b-&gt;y;
-x.w = (a-&gt;w &lt; b-&gt;w) ? a-&gt;w : b-&gt;w;
-x.h = (a-&gt;h &lt; b-&gt;h) ? a-&gt;h : b-&gt;h;
+x.x = AG_MAX(a-&gt;x, b-&gt;x);
+x.y = AG_MAX(a-&gt;y, b-&gt;y);
+x.w = AG_MIN((a-&gt;x+a-&gt;w), (b-&gt;x+b-&gt;w)) - x.x;
+x.h = AG_MIN((a-&gt;y+a-&gt;h), (b-&gt;y+b-&gt;h)) - x.y;
 return (x);
 }
 static __inline__ SDL_Rect
</description>
    <dc:creator>Agar-SVN</dc:creator>
    <dc:date>2008-10-06T13:56:16</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.lib.agar.scm/381">
    <title>Agar: r7781 - trunk/gui</title>
    <link>http://permalink.gmane.org/gmane.comp.lib.agar.scm/381</link>
    <description>Author: vedge
Date: 2008-10-06 10:04:21 -0300 (Mon, 06 Oct 2008)
New Revision: 7781

Modified:
   trunk/gui/AG_Scrollview.3
   trunk/gui/scrollview.c
   trunk/gui/scrollview.h
Log:
- adjust offset if needed on resize.
- make SCROLLVIEW_PAN_XY the default.
- fix scrollbar "visible" binding.


Modified: trunk/gui/AG_Scrollview.3
===================================================================
--- trunk/gui/AG_Scrollview.32008-10-06 13:00:53 UTC (rev 7780)
+++ trunk/gui/AG_Scrollview.32008-10-06 13:04:21 UTC (rev 7781)
&lt; at &gt;&lt; at &gt; -66,15 +66,15 &lt; at &gt;&lt; at &gt;
 may include:
 .Pp
 .Bl -tag -width "AG_SCROLLVIEW_BY_CURSOR "
-.It Dv AG_SCROLLVIEW_PAN_X
-The X is pannable.
-.It Dv AG_SCROLLVIEW_PAN_Y
-The Y is pannable.
-.It Dv AG_SCROLLVIEW_PAN_XY
+.It Dv AG_SCROLLVIEW_NOPAN_X
+Disable panning over X.
+.It Dv AG_SCROLLVIEW_NOPAN_Y
+Disable panning over Y.
+.It Dv AG_SCROLLVIEW_NOPAN_XY
 Alias for
-.Dv AG_SCROLLVIEW_PAN_X
+.Dv AG_SCROLLVIEW_NOPAN_X
 and
-.Dv AG_SCROLLVIEW_PAN_Y .
+.Dv AG_SCROLLVIEW_NOPAN_Y .
 .It Dv AG_SCROLLVIEW_BY_CURSOR
 Panning with cursor is permitted (may interfere with the operation
 of child widgets).

Modified: trunk/gui/scrollview.c
===================================================================
--- trunk/gui/scrollview.c2008-10-06 13:00:53 UTC (rev 7780)
+++ trunk/gui/scrollview.c2008-10-06 13:04:21 UTC (rev 7781)
&lt; at &gt;&lt; at &gt; -39,10 +39,8 &lt; at &gt;&lt; at &gt;
 {
 AG_Widget *chld;
 
-if (xRel+wid-&gt;x+wid-&gt;w &lt; 0 ||
-    yRel+wid-&gt;y+wid-&gt;h &lt; 0 ||
-    xRel+wid-&gt;x &gt; WIDTH(sv) ||
-    yRel+wid-&gt;y &gt; HEIGHT(sv)) {
+if (wid-&gt;x+wid-&gt;w &lt; 0 ||
+    wid-&gt;y+wid-&gt;h &lt; 0) {
 wid-&gt;flags |= AG_WIDGET_HIDE;
 } else {
 wid-&gt;flags &amp;= ~(AG_WIDGET_HIDE);
&lt; at &gt;&lt; at &gt; -80,8 +78,20 &lt; at &gt;&lt; at &gt;
 }
 ClipWidgets(sv, chld, 0,0);
 }
-if (wTot != NULL) { *wTot = aChld.x+aChld.w; }
-if (hTot != NULL) { *hTot = aChld.y+aChld.h; }
+switch (sv-&gt;pack) {
+case AG_PACK_HORIZ:
+if (wTot != NULL)
+*wTot = aChld.x + sv-&gt;xOffs;
+if (hTot != NULL)
+*hTot = aChld.y+aChld.h + sv-&gt;yOffs;
+break;
+case AG_PACK_VERT:
+if (wTot != NULL)
+*wTot = aChld.x+aChld.w + sv-&gt;xOffs;
+if (hTot != NULL)
+*hTot = aChld.y + sv-&gt;yOffs;
+break;
+}
 }
 
 static void
&lt; at &gt;&lt; at &gt; -176,20 +186,20 &lt; at &gt;&lt; at &gt;
 if (flags &amp; AG_SCROLLVIEW_HFILL) { AG_ExpandHoriz(sv); }
 if (flags &amp; AG_SCROLLVIEW_VFILL) { AG_ExpandVert(sv); }
 
-if (flags &amp; AG_SCROLLVIEW_PAN_X) {
+if (!(flags &amp; AG_SCROLLVIEW_NOPAN_X)) {
 sv-&gt;hbar = AG_ScrollbarNew(sv, AG_SCROLLBAR_HORIZ, 0);
 AG_WidgetBindInt(sv-&gt;hbar, "value", &amp;sv-&gt;xOffs);
 AG_WidgetBindInt(sv-&gt;hbar, "min", &amp;sv-&gt;xMin);
 AG_WidgetBindInt(sv-&gt;hbar, "max", &amp;sv-&gt;xMax);
-AG_WidgetBindInt(sv-&gt;hbar, "visible", &amp;WIDGET(sv)-&gt;w);
+AG_WidgetBindInt(sv-&gt;hbar, "visible", &amp;sv-&gt;rView.w);
 AG_SetEvent(sv-&gt;hbar, "scrollbar-changed", Scrolled, "%p", sv);
 }
-if (flags &amp; AG_SCROLLVIEW_PAN_Y) {
+if (!(flags &amp; AG_SCROLLVIEW_NOPAN_Y)) {
 sv-&gt;vbar = AG_ScrollbarNew(sv, AG_SCROLLBAR_VERT, 0);
 AG_WidgetBindInt(sv-&gt;vbar, "value", &amp;sv-&gt;yOffs);
 AG_WidgetBindInt(sv-&gt;vbar, "min", &amp;sv-&gt;yMin);
 AG_WidgetBindInt(sv-&gt;vbar, "max", &amp;sv-&gt;yMax);
-AG_WidgetBindInt(sv-&gt;vbar, "visible", &amp;WIDGET(sv)-&gt;h);
+AG_WidgetBindInt(sv-&gt;vbar, "visible", &amp;sv-&gt;rView.h);
 AG_SetEvent(sv-&gt;vbar, "scrollbar-changed", Scrolled, "%p", sv);
 }
 
&lt; at &gt;&lt; at &gt; -224,6 +234,7 &lt; at &gt;&lt; at &gt;
 sv-&gt;hbar = NULL;
 sv-&gt;vbar = NULL;
 sv-&gt;pack = AG_PACK_VERT;
+sv-&gt;rView = AG_RECT(0,0,0,0);
 }
 
 void
&lt; at &gt;&lt; at &gt; -282,28 +293,44 &lt; at &gt;&lt; at &gt;
 AG_SizeReq rBar;
 AG_SizeAlloc aBar;
 int wTot, hTot;
-
+
+sv-&gt;rView.w = a-&gt;w;
+sv-&gt;rView.h = a-&gt;h;
+
 if (sv-&gt;hbar != NULL) {
 AG_WidgetSizeReq(sv-&gt;hbar, &amp;rBar);
-aBar.w = a-&gt;w;
+aBar.w = a-&gt;w - rBar.h;
 aBar.h = rBar.h;
 aBar.x = 0;
 aBar.y = a-&gt;h - rBar.h;
 AG_WidgetSizeAlloc(sv-&gt;hbar, &amp;aBar);
+sv-&gt;rView.h -= aBar.h;
+if (sv-&gt;rView.h &lt; 0) { sv-&gt;rView.h = 0; }
 }
 if (sv-&gt;vbar != NULL) {
 AG_WidgetSizeReq(sv-&gt;vbar, &amp;rBar);
 aBar.w = rBar.w;
-aBar.h = a-&gt;h;
+aBar.h = a-&gt;h - rBar.w;
 aBar.x = a-&gt;w - rBar.w;
 aBar.y = 0;
 AG_WidgetSizeAlloc(sv-&gt;vbar, &amp;aBar);
+sv-&gt;rView.w -= aBar.w;
+if (sv-&gt;rView.w &lt; 0) { sv-&gt;rView.w = 0; }
 }
 
 PlaceWidgets(sv, &amp;wTot, &amp;hTot);
-if (sv-&gt;hbar != NULL) { sv-&gt;xMax = wTot; }
-if (sv-&gt;vbar != NULL) { sv-&gt;yMax = hTot; }
+sv-&gt;xMax = wTot;
+sv-&gt;yMax = hTot;
 
+if (sv-&gt;hbar != NULL) {
+if ((sv-&gt;xMax - sv-&gt;rView.w - sv-&gt;xOffs) &lt; 0)
+sv-&gt;xOffs = MAX(0, sv-&gt;xMax - sv-&gt;rView.w);
+}
+if (sv-&gt;vbar != NULL) {
+if ((sv-&gt;yMax - sv-&gt;rView.h - sv-&gt;yOffs) &lt; 0)
+sv-&gt;yOffs = MAX(0, sv-&gt;yMax - sv-&gt;rView.h);
+}
+#if 0
 if (a-&gt;w &gt;= (wTot - sv-&gt;xOffs)) {
 sv-&gt;xOffs = wTot - a-&gt;w;
 if (sv-&gt;xOffs &lt; 0) { sv-&gt;xOffs = 0; }
&lt; at &gt;&lt; at &gt; -312,6 +339,7 &lt; at &gt;&lt; at &gt;
 sv-&gt;yOffs = hTot - a-&gt;h;
 if (sv-&gt;yOffs &lt; 0) { sv-&gt;yOffs = 0; }
 }
+#endif
 return (0);
 }
 
&lt; at &gt;&lt; at &gt; -320,20 +348,15 &lt; at &gt;&lt; at &gt;
 {
 AG_Scrollview *sv = p;
 AG_Widget *chld;
-AG_Rect rView;
 
 AG_DrawBox(sv,
     AG_RECT(0, 0, WIDTH(sv), HEIGHT(sv)), -1,
     AG_COLOR(FRAME_COLOR));
 
-rView = AG_RECT(0, 0, WIDTH(sv), HEIGHT(sv));
-if (sv-&gt;hbar != NULL) { rView.h -= HEIGHT(sv-&gt;hbar); }
-if (sv-&gt;vbar != NULL) { rView.w -= WIDTH(sv-&gt;vbar); }
-
 if (sv-&gt;hbar != NULL) { AG_WidgetDraw(sv-&gt;hbar); }
 if (sv-&gt;vbar != NULL) { AG_WidgetDraw(sv-&gt;vbar); }
 
-AG_PushClipRect(sv, rView);
+AG_PushClipRect(sv, sv-&gt;rView);
 WIDGET_FOREACH_CHILD(chld, sv) {
 if (chld == WIDGET(sv-&gt;hbar) || chld == WIDGET(sv-&gt;vbar)) {
 continue;

Modified: trunk/gui/scrollview.h
===================================================================
--- trunk/gui/scrollview.h2008-10-06 13:00:53 UTC (rev 7780)
+++ trunk/gui/scrollview.h2008-10-06 13:04:21 UTC (rev 7781)
&lt; at &gt;&lt; at &gt; -14,18 +14,19 &lt; at &gt;&lt; at &gt;
 Uint flags;
 #define AG_SCROLLVIEW_HFILL0x01
 #define AG_SCROLLVIEW_VFILL0x02
-#define AG_SCROLLVIEW_PAN_X0x04 /* X is pannable */ 
-#define AG_SCROLLVIEW_PAN_Y0x08 /* Y is pannable */
+#define AG_SCROLLVIEW_NOPAN_X0x04 /* X is not pannable */ 
+#define AG_SCROLLVIEW_NOPAN_Y0x08 /* Y is not pannable */
 #define AG_SCROLLVIEW_PANNING0x10 /* Panning in progress */
 #define AG_SCROLLVIEW_BY_CURSOR0x20 /* Panning with cursor allowed */
 #define AG_SCROLLVIEW_BY_KBD0x40 /* Panning with keyboard allowed */
 #define AG_SCROLLVIEW_EXPAND(AG_SCROLLVIEW_HFILL|AG_SCROLLVIEW_VFILL)
-#define AG_SCROLLVIEW_PAN_XY(AG_SCROLLVIEW_PAN_X|AG_SCROLLVIEW_PAN_Y)
+#define AG_SCROLLVIEW_NOPAN_XY(AG_SCROLLVIEW_NOPAN_X|AG_SCROLLVIEW_NOPAN_Y)
 
 enum ag_widget_packing pack;/* Packing mode */
 int wPre, hPre;/* Requested geometry */
 int xOffs, yOffs;/* Display offset */
 int xMin, xMax, yMin, yMax;/* Display boundaries */
+AG_Rect rView;/* Available space for widgets */
 AG_Scrollbar *hbar, *vbar;/* Scrollbars for panning */
 } AG_Scrollview;
</description>
    <dc:creator>Agar-SVN</dc:creator>
    <dc:date>2008-10-06T13:04:47</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.lib.agar.scm/380">
    <title>Agar: r7778 - trunk/gui</title>
    <link>http://permalink.gmane.org/gmane.comp.lib.agar.scm/380</link>
    <description>Author: vedge
Date: 2008-10-05 12:46:13 -0300 (Sun, 05 Oct 2008)
New Revision: 7778

Modified:
   trunk/gui/window.c
Log:
push clipping rectangle over window area for now.


Modified: trunk/gui/window.c
===================================================================
--- trunk/gui/window.c2008-10-05 15:45:03 UTC (rev 7777)
+++ trunk/gui/window.c2008-10-05 15:46:13 UTC (rev 7778)
&lt; at &gt;&lt; at &gt; -225,10 +225,20 &lt; at &gt;&lt; at &gt;
 {
 AG_Window *win = obj;
 AG_Widget *chld;
+int hTitle = 0;
+
+STYLE(win)-&gt;Window(win);
 
-STYLE(win)-&gt;Window(win);
+hTitle = (win-&gt;tbar != NULL) ? HEIGHT(win-&gt;tbar) : 0;
+AG_PushClipRect(win,
+    AG_RECT(0, 0,
+            WIDTH(win) - win-&gt;wBorderSide*2,
+    HEIGHT(win) - win-&gt;wBorderBot));
+
 WIDGET_FOREACH_CHILD(chld, win)
 AG_WidgetDraw(chld);
+
+AG_PopClipRect();
 }
 
 /* Apply initial alignment parameter. */
&lt; at &gt;&lt; at &gt; -1159,11 +1169,6 &lt; at &gt;&lt; at &gt;
 return (-1);
 }
 
-static __inline__ void
-UpdateMinSize(AG_Window *win)
-{
-}
-
 /* Configure minimum window size in percentage of computed geometry. */
 void
 AG_WindowSetMinSizePct(AG_Window *win, int pct)
&lt; at &gt;&lt; at &gt; -1171,7 +1176,6 &lt; at &gt;&lt; at &gt;
 AG_ObjectLock(win);
 win-&gt;flags |= AG_WINDOW_MINSIZEPCT;
 win-&gt;minPct = pct;
-UpdateMinSize(win);
 AG_ObjectUnlock(win);
 }
 
&lt; at &gt;&lt; at &gt; -1183,7 +1187,6 &lt; at &gt;&lt; at &gt;
 win-&gt;flags &amp;= ~(AG_WINDOW_MINSIZEPCT);
 win-&gt;wMin = w;
 win-&gt;hMin = h;
-UpdateMinSize(win);
 AG_ObjectUnlock(win);
 }
 
&lt; at &gt;&lt; at &gt; -1506,7 +1509,6 &lt; at &gt;&lt; at &gt;
 
 win-&gt;wReq = r-&gt;w;
 win-&gt;hReq = r-&gt;h;
-UpdateMinSize(win);
 ClampToView(win);
 }
</description>
    <dc:creator>Agar-SVN</dc:creator>
    <dc:date>2008-10-05T15:46:35</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.lib.agar.scm/379">
    <title>Agar: r7777 - trunk/gui</title>
    <link>http://permalink.gmane.org/gmane.comp.lib.agar.scm/379</link>
    <description>Author: vedge
Date: 2008-10-05 12:45:03 -0300 (Sun, 05 Oct 2008)
New Revision: 7777

Modified:
   trunk/gui/label.c
Log:
advance pointer in %l* case


Modified: trunk/gui/label.c
===================================================================
--- trunk/gui/label.c2008-10-05 15:44:07 UTC (rev 7776)
+++ trunk/gui/label.c2008-10-05 15:45:03 UTC (rev 7777)
&lt; at &gt;&lt; at &gt; -558,9 +558,11 &lt; at &gt;&lt; at &gt;
 switch (f[2]) {
 case 'f':
 PF("%.2f", AG_LABEL_ARG(lbl,double));
+f += 2;
 break;
 case 'g':
 PF("%g", AG_LABEL_ARG(lbl,double));
+f += 2;
 break;
 #ifdef HAVE_64BIT
 case 'l':
</description>
    <dc:creator>Agar-SVN</dc:creator>
    <dc:date>2008-10-05T15:45:24</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.lib.agar.scm/378">
    <title>Agar: r7776 - trunk/gui</title>
    <link>http://permalink.gmane.org/gmane.comp.lib.agar.scm/378</link>
    <description>Author: vedge
Date: 2008-10-05 12:44:07 -0300 (Sun, 05 Oct 2008)
New Revision: 7776

Modified:
   trunk/gui/tlist.c
Log:
nicer undersize behavior for scrollbar.


Modified: trunk/gui/tlist.c
===================================================================
--- trunk/gui/tlist.c2008-10-05 15:12:48 UTC (rev 7775)
+++ trunk/gui/tlist.c2008-10-05 15:44:07 UTC (rev 7776)
&lt; at &gt;&lt; at &gt; -231,7 +231,6 &lt; at &gt;&lt; at &gt;
 tl-&gt;dblclicked = NULL;
 tl-&gt;nitems = 0;
 tl-&gt;nvisitems = 0;
-tl-&gt;sbar = AG_ScrollbarNew(tl, AG_SCROLLBAR_VERT, 0);
 tl-&gt;compare_fn = AG_TlistComparePtrs;
 tl-&gt;wHint = 0;
 tl-&gt;hHint = tl-&gt;item_h + 2;
&lt; at &gt;&lt; at &gt; -242,6 +241,9 &lt; at &gt;&lt; at &gt;
 TAILQ_INIT(&amp;tl-&gt;items);
 TAILQ_INIT(&amp;tl-&gt;selitems);
 TAILQ_INIT(&amp;tl-&gt;popups);
+
+tl-&gt;sbar = AG_ScrollbarNew(tl, AG_SCROLLBAR_VERT, 0);
+AG_WidgetSetFocusable(tl-&gt;sbar, 0);
 
 AG_SetEvent(tl-&gt;sbar, "scrollbar-changed", ScrollbarChanged, "%p", tl);
 AG_SetEvent(tl, "window-mousebuttondown", MouseButtonDown, NULL);
&lt; at &gt;&lt; at &gt; -340,8 +342,8 &lt; at &gt;&lt; at &gt;
 AG_SizeAlloc aBar;
 
 AG_WidgetSizeReq(tl-&gt;sbar, &amp;rBar);
-if (rBar.w &gt; a-&gt;w) {
-return (-1);
+if (a-&gt;w &lt; rBar.w*2) {
+rBar.w = MAX(0, a-&gt;w/2);
 }
 aBar.w = rBar.w;
 aBar.h = a-&gt;h;
&lt; at &gt;&lt; at &gt; -350,14 +352,7 &lt; at &gt;&lt; at &gt;
 AG_WidgetSizeAlloc(tl-&gt;sbar, &amp;aBar);
 tl-&gt;wRow = a-&gt;w - aBar.w;
 
-if (a-&gt;w &lt; rBar.w || a-&gt;h &lt; tl-&gt;sbar-&gt;wButton*2) {
-WIDGET(tl-&gt;sbar)-&gt;flags |= AG_WIDGET_HIDE;
-} else {
-WIDGET(tl-&gt;sbar)-&gt;flags &amp;= ~(AG_WIDGET_HIDE);
-}
 UpdateListScrollbar(tl);
-
-AG_WidgetEnableClipping(tl, AG_RECT(0,0,a-&gt;w,a-&gt;h));
 return (0);
 }
 
&lt; at &gt;&lt; at &gt; -369,14 +364,11 &lt; at &gt;&lt; at &gt;
 int y = 0, i = 0, selSeen = 0, selPos = 1;
 int offset;
 
-STYLE(tl)-&gt;ListBackground(tl,
-    AG_RECT(0,
-            0,
-    tl-&gt;wRow,
-    HEIGHT(tl)));
-
+STYLE(tl)-&gt;ListBackground(tl, AG_RECT(0, 0, tl-&gt;wRow, HEIGHT(tl)));
 AG_WidgetDraw(tl-&gt;sbar);
 
+AG_PushClipRect(tl, AG_RECT(0, 0, tl-&gt;wRow, HEIGHT(tl)));
+
 if (tl-&gt;flags &amp; AG_TLIST_POLL) {
 AG_PostEvent(NULL, tl, "tlist-poll", NULL);
 }
&lt; at &gt;&lt; at &gt; -452,6 +444,7 &lt; at &gt;&lt; at &gt;
 } else {
 tl-&gt;flags &amp;= ~(AG_TLIST_SCROLLTOSEL);
 }
+AG_PopClipRect();
 }
 
 /*
</description>
    <dc:creator>Agar-SVN</dc:creator>
    <dc:date>2008-10-05T15:44:28</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.lib.agar.scm/377">
    <title>Agar: r7775 - trunk/demos/loader</title>
    <link>http://permalink.gmane.org/gmane.comp.lib.agar.scm/377</link>
    <description>Author: vedge
Date: 2008-10-05 12:12:48 -0300 (Sun, 05 Oct 2008)
New Revision: 7775

Modified:
   trunk/demos/loader/loader.c
Log:
attach the Pixmaps to a Scrollview.


Modified: trunk/demos/loader/loader.c
===================================================================
--- trunk/demos/loader/loader.c2008-10-05 15:12:17 UTC (rev 7774)
+++ trunk/demos/loader/loader.c2008-10-05 15:12:48 UTC (rev 7775)
&lt; at &gt;&lt; at &gt; -28,6 +28,7 &lt; at &gt;&lt; at &gt;
 AG_FileType *ft = AG_PTR(2);
 AG_Surface *bmp;
 AG_Window *win;
+AG_Scrollview *sv;
 Uint8 *pSrc;
 char *title;
 int i;
&lt; at &gt;&lt; at &gt; -63,15 +64,18 &lt; at &gt;&lt; at &gt;
 }
 
 /*
- * Add a pixmap widget displaying the bitmap, scaled down to the
- * maximum view size if needed.
+ * Place an AG_Pixmap(3) widget inside of an AG_Scrollview(3) to
+ * display the image.
  */
-AG_PixmapFromSurfaceScaled(win, 0, bmp,
-    (bmp-&gt;w &lt; (agView-&gt;w - 16)) ? bmp-&gt;w : agView-&gt;w - 16,
-    (bmp-&gt;h &lt; (agView-&gt;h - 40)) ? bmp-&gt;h : agView-&gt;h - 40);
+sv = AG_ScrollviewNew(win, AG_SCROLLVIEW_EXPAND);
+AG_PixmapFromSurfaceScaled(sv, 0, bmp, bmp-&gt;w, bmp-&gt;h);
 
+AG_WindowSetGeometryAligned(win, AG_WINDOW_MC,
+    AG_MIN(agView-&gt;w,bmp-&gt;w),
+    AG_MIN(agView-&gt;h,bmp-&gt;h));
+AG_WindowShow(win);
+
 AG_SurfaceFree(bmp);
-AG_WindowShow(win);
 }
 
 #ifdef HAVE_SDL_IMAGE
&lt; at &gt;&lt; at &gt; -84,8 +88,8 &lt; at &gt;&lt; at &gt;
 char *file = AG_STRING(1);
 AG_FileType *ft = AG_PTR(2);
 SDL_Surface *img;
-AG_Surface *aImg;
 AG_Window *win;
+AG_Scrollview *sv;
 char *title;
 int i;
 
&lt; at &gt;&lt; at &gt; -102,16 +106,20 &lt; at &gt;&lt; at &gt;
 }
 win = AG_WindowNew(0);
 AG_WindowSetCaption(win, "Image &lt;%s&gt;", title);
+
 /*
- * Add a pixmap widget displaying the bitmap, scaled down to the
- * maximum view size if needed.
+ * Place an AG_Pixmap(3) widget inside of an AG_Scrollview(3) to
+ * display the image.
  */
-aImg = AG_SurfaceFromSDL(img);
-AG_PixmapFromSurfaceScaled(win, 0, aImg,
-    (img-&gt;w &lt; (agView-&gt;w - 16)) ? img-&gt;w : agView-&gt;w - 16,
-    (img-&gt;h &lt; (agView-&gt;h - 40)) ? img-&gt;h : agView-&gt;h - 40);
+sv = AG_ScrollviewNew(win, AG_SCROLLVIEW_EXPAND);
+AG_PixmapFromSurface(sv, 0, AG_SurfaceFromSDL(img));
+
+AG_WindowSetGeometryAligned(win, AG_WINDOW_MC,
+    AG_MIN(agView-&gt;w,img-&gt;w),
+    AG_MIN(agView-&gt;h,img-&gt;h));
+AG_WindowShow(win);
+
 SDL_FreeSurface(img);
-AG_WindowShow(win);
 }
 #endif /* HAVE_SDL_IMAGE */
</description>
    <dc:creator>Agar-SVN</dc:creator>
    <dc:date>2008-10-05T15:13:09</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.lib.agar.scm/376">
    <title>Agar: r7774 - trunk/demos/plotting</title>
    <link>http://permalink.gmane.org/gmane.comp.lib.agar.scm/376</link>
    <description>Author: vedge
Date: 2008-10-05 12:12:17 -0300 (Sun, 05 Oct 2008)
New Revision: 7774

Modified:
   trunk/demos/plotting/plotting.c
Log:
use %Lf in LabelPolledNew()


Modified: trunk/demos/plotting/plotting.c
===================================================================
--- trunk/demos/plotting/plotting.c2008-10-05 15:11:10 UTC (rev 7773)
+++ trunk/demos/plotting/plotting.c2008-10-05 15:12:17 UTC (rev 7774)
&lt; at &gt;&lt; at &gt; -276,13 +276,13 &lt; at &gt;&lt; at &gt;
 }
 
 AG_SeparatorNewHoriz(box);
-AG_LabelNewPolled(box, 0, "Aref: %F", &amp;Aref);
-AG_LabelNewPolled(box, 0, "v1: %F", &amp;v1);
-AG_LabelNewPolled(box, 0, "v2: %F", &amp;v2);
-AG_LabelNewPolled(box, 0, "v3: %F", &amp;v3);
-AG_LabelNewPolled(box, 0, "Ts: %F", &amp;Ts);
-AG_LabelNewPolled(box, 0, "Ta: %F", &amp;Ta);
-AG_LabelNewPolled(box, 0, "To: %F", &amp;To);
+AG_LabelNewPolled(box, 0, "Aref: %lf", &amp;Aref);
+AG_LabelNewPolled(box, 0, "v1: %lf", &amp;v1);
+AG_LabelNewPolled(box, 0, "v2: %lf", &amp;v2);
+AG_LabelNewPolled(box, 0, "v3: %lf", &amp;v3);
+AG_LabelNewPolled(box, 0, "Ts: %lf", &amp;Ts);
+AG_LabelNewPolled(box, 0, "Ta: %lf", &amp;Ta);
+AG_LabelNewPolled(box, 0, "To: %lf", &amp;To);
 AG_ButtonAct(box, AG_BUTTON_HFILL, "Generate",
     GeneratePlot, "%p", plt);
 }
</description>
    <dc:creator>Agar-SVN</dc:creator>
    <dc:date>2008-10-05T15:12:38</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.lib.agar.scm/375">
    <title>Agar: r7773 - trunk/demos/scrollbar</title>
    <link>http://permalink.gmane.org/gmane.comp.lib.agar.scm/375</link>
    <description>Author: vedge
Date: 2008-10-05 12:11:10 -0300 (Sun, 05 Oct 2008)
New Revision: 7773

Modified:
   trunk/demos/scrollbar/scrollbar.c
Log:
double is %lf in LabelNewPolled()


Modified: trunk/demos/scrollbar/scrollbar.c
===================================================================
--- trunk/demos/scrollbar/scrollbar.c2008-10-05 15:08:41 UTC (rev 7772)
+++ trunk/demos/scrollbar/scrollbar.c2008-10-05 15:11:10 UTC (rev 7773)
&lt; at &gt;&lt; at &gt; -13,7 +13,7 &lt; at &gt;&lt; at &gt;
 #include &lt;string.h&gt;
 
 int vInt = 50000, minInt = -100000, maxInt = 100000, visInt = 0;
-unsigned vUint = 20, minUint = 10, maxUint = 100, visUint = 0;
+unsigned vUint = 0, minUint = -5, maxUint = 5, visUint = 0;
 Sint8 v8 = 100, min8 = -100, max8 = 100, vis8 = 0;
 Uint32 v32 = 1234, min32 = 1, max32 = 1000000, vis32 = 0;
 float vFlt = 1.0, minFlt = 0.0, maxFlt = 10.0, visFlt = 0.0;
&lt; at &gt;&lt; at &gt; -46,7 +46,7 &lt; at &gt;&lt; at &gt;
 AG_ScrollbarNewFloat(win, AG_SCROLLBAR_HORIZ, AG_SCROLLBAR_HFILL,
     &amp;vFlt, &amp;minFlt, &amp;maxFlt, &amp;visFlt);
 
-AG_LabelNewPolled(win, AG_LABEL_HFILL, "Double binding: %F", &amp;vDbl);
+AG_LabelNewPolled(win, AG_LABEL_HFILL, "Double binding: %lf", &amp;vDbl);
 AG_ScrollbarNewDouble(win, AG_SCROLLBAR_HORIZ, AG_SCROLLBAR_HFILL,
     &amp;vDbl, &amp;minDbl, &amp;maxDbl, &amp;visDbl);
</description>
    <dc:creator>Agar-SVN</dc:creator>
    <dc:date>2008-10-05T15:11:32</dc:date>
  </item>
  <textinput rdf:about="http://search.gmane.org/?group=$group=gmane.comp.lib.agar.scm">
    <title>Search Engine</title>
    <description>Search the mailing list at Gmane</description>
    <name>query</name>
    <link>http://search.gmane.org/?group=$group=gmane.comp.lib.agar.scm</link>
  </textinput>
</rdf:RDF>
