aboutsummaryrefslogtreecommitdiff
path: root/popup
diff options
context:
space:
mode:
authorB. Bogart <bbogart@users.sourceforge.net>2004-10-17 01:24:23 +0000
committerB. Bogart <bbogart@users.sourceforge.net>2004-10-17 01:24:23 +0000
commit25ee41bca8316509985e043945225702ade47577 (patch)
treeff54250c878a50a1e9b24444a5d941966985e27b /popup
parentad6e012eaa89eeb73d2239f8a78b77148f8a4c9e (diff)
Fixed disapearing widget on minimzation bug (as per entry)
Added a height argument to specify widget height. Example patches changed. svn path=/trunk/externals/bbogart/; revision=2110
Diffstat (limited to 'popup')
-rw-r--r--popup/popup-gop-test.pd2
-rw-r--r--popup/popup-help.pd2
-rw-r--r--popup/popup.c101
3 files changed, 82 insertions, 23 deletions
diff --git a/popup/popup-gop-test.pd b/popup/popup-gop-test.pd
index 68c2a1a..8cf765a 100644
--- a/popup/popup-gop-test.pd
+++ b/popup/popup-gop-test.pd
@@ -1,5 +1,5 @@
#N canvas 441 293 131 47 10;
-#X obj 0 5 popup 124 grey90 1024x512 opt1;
+#X obj 0 5 popup 124 25 grey90 1024x512 opt1;
#X obj 0 0 cnv 15 128 40 empty empty empty 20 12 0 14 -233017 -66577
0;
#X obj 16 46 outlet;
diff --git a/popup/popup-help.pd b/popup/popup-help.pd
index 89af6e1..d08d280 100644
--- a/popup/popup-help.pd
+++ b/popup/popup-help.pd
@@ -1,5 +1,5 @@
#N canvas 154 131 631 317 10;
-#X obj 66 220 popup 124 white duh! one two three four five six seven
+#X obj 66 220 popup 124 25 white duh! one two three four five six seven
eight nine ten eleven twelve thirteen i14 i15 i16 i17 i18 i19 i20 i21
i22 i23 i24 i25 i26 i26 i27 i28 i29 i30;
#X obj 67 265 print index;
diff --git a/popup/popup.c b/popup/popup.c
index 3f76e77..f169408 100644
--- a/popup/popup.c
+++ b/popup/popup.c
@@ -5,12 +5,12 @@
* This program is distributed under the terms of the GNU General Public *
* License *
- * popup is free software; you can redistribute it and/or modify *
+ * popup is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
- * popup is distributed in the hope that it will be useful, *
+ * popup is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. */
@@ -23,7 +23,6 @@
#include <string.h>
-
#ifdef NT
#pragma warning( disable : 4244 )
#pragma warning( disable : 4305 )
@@ -44,7 +43,7 @@ typedef struct _popup
t_object x_obj;
t_glist * x_glist;
- t_outlet* out2;
+ t_outlet* out2;
int x_rect_width;
int x_rect_height;
t_symbol* x_sym;
@@ -52,16 +51,17 @@ typedef struct _popup
int x_height;
int x_width;
- int x_num_options;
- t_symbol* x_colour;
+ int x_num_options;
+ t_symbol* x_colour;
t_symbol* x_name;
- t_symbol* x_options[MAX_OPTIONS];
+ t_symbol* x_options[MAX_OPTIONS];
} t_popup;
/* widget helper functions */
+/* Append " x " to the following line to show debugging messages */
#define DEBUG(x)
@@ -111,23 +111,30 @@ static void draw_inlets(t_popup *x, t_glist *glist, int firsttime, int nin, int
static void draw_handle(t_popup *x, t_glist *glist, int firsttime) {
- int onset = text_xpix(&x->x_obj, glist) + (x->x_rect_width - IOWIDTH+2);
- if (firsttime)
+ DEBUG(post("draw_handle start");)
+ int onset = text_xpix(&x->x_obj, glist) + (x->x_rect_width - IOWIDTH);
+
+ if (firsttime) {
sys_vgui(".x%x.c create rectangle %d %d %d %d -tags %xhandle\n",
glist_getcanvas(glist),
onset, text_ypix(&x->x_obj, glist) + x->x_rect_height - 12,
onset + IOWIDTH-2, text_ypix(&x->x_obj, glist) + x->x_rect_height-4,
x);
- else
+ }
+ else {
sys_vgui(".x%x.c coords %xhandle %d %d %d %d\n",
glist_getcanvas(glist), x,
onset, text_ypix(&x->x_obj, glist) + x->x_rect_height - 12,
onset + IOWIDTH-2, text_ypix(&x->x_obj, glist) + x->x_rect_height-4);
+ }
+ DEBUG(post("draw_handle end");)
}
static void create_widget(t_popup *x, t_glist *glist)
{
+ DEBUG(post("create_widget start");)
+
char text[MAXPDSTRING];
int len,i;
t_canvas *canvas=glist_getcanvas(glist);
@@ -135,8 +142,10 @@ static void create_widget(t_popup *x, t_glist *glist)
x->x_rect_height = x->x_height+2;
/* Create menubutton and empty menu widget -- maybe the menu should be created elseware?*/
- /* Seems we have to delete the widget in case it already exists */
+
+ /* Seems we have to delete the widget in case it already exists (Provided by Guenter)*/
sys_vgui("destroy .x%x.c.s%x\n",glist_getcanvas(glist),x);
+
sys_vgui("set %xw .x%x.c.s%x ; menubutton $%xw -relief raised -background \"%s\" -text \"%s\" -direction flush -menu $%xw.menu ; menu $%xw.menu -tearoff 0\n",
x,canvas,x,x,x->x_colour->s_name,x->x_name->s_name,x,x);
@@ -147,18 +156,20 @@ static void create_widget(t_popup *x, t_glist *glist)
}
DEBUG(post("id: .x%x.c.s%x", canvas, x);)
+ DEBUG(post("create_widget end");)
}
static void popup_drawme(t_popup *x, t_glist *glist, int firsttime)
{
t_canvas *canvas=glist_getcanvas(glist);
+ DEBUG(post("drawme start");)
DEBUG(post("drawme %d",firsttime);)
if (firsttime) {
DEBUG(post("glist %x canvas %x",x->x_glist,canvas);)
create_widget(x,glist);
x->x_glist = canvas;
- sys_vgui(".x%x.c create window %d %d -width %d -height 25 -anchor nw -window .x%x.c.s%x -tags %xS\n",
- canvas,text_xpix(&x->x_obj, glist), text_ypix(&x->x_obj, glist), x->x_width, x->x_glist,x,x);
+ sys_vgui(".x%x.c create window %d %d -width %d -height %d -anchor nw -window .x%x.c.s%x -tags %xS\n",
+ canvas,text_xpix(&x->x_obj, glist), text_ypix(&x->x_obj, glist), x->x_width, x->x_height, x->x_glist,x,x);
}
else {
@@ -170,6 +181,7 @@ static void popup_drawme(t_popup *x, t_glist *glist, int firsttime)
draw_inlets(x, glist, firsttime, 2,1);
// draw_handle(x, glist, firsttime);
+ DEBUG(post("drawme end");)
}
@@ -177,7 +189,7 @@ static void popup_erase(t_popup* x,t_glist* glist)
{
int n;
- DEBUG(post("erase");)
+ DEBUG(post("erase start");)
sys_vgui("destroy .x%x.c.s%x\n",glist_getcanvas(glist),x);
sys_vgui(".x%x.c delete %xS\n",glist_getcanvas(glist), x);
@@ -187,6 +199,8 @@ static void popup_erase(t_popup* x,t_glist* glist)
sys_vgui(".x%x.c delete %xi\n",glist_getcanvas(glist),x); /* Added tag for all inlets of one instance */
sys_vgui(".x%x.c delete %xo\n",glist_getcanvas(glist),x); /* Added tag for all outlets of one instance */
sys_vgui(".x%x.c delete %xhandle\n",glist_getcanvas(glist),x,0);
+
+ DEBUG(post("erase end");)
}
@@ -197,6 +211,8 @@ static void popup_erase(t_popup* x,t_glist* glist)
static void popup_getrect(t_gobj *z, t_glist *owner,
int *xp1, int *yp1, int *xp2, int *yp2)
{
+ DEBUG(post("getrect start");)
+
int width, height;
t_popup* s = (t_popup*)z;
@@ -206,13 +222,15 @@ static void popup_getrect(t_gobj *z, t_glist *owner,
*yp1 = text_ypix(&s->x_obj, owner) - 1;
*xp2 = text_xpix(&s->x_obj, owner) + width;
*yp2 = text_ypix(&s->x_obj, owner) + height;
+
+ DEBUG(post("getrect end");)
}
static void popup_displace(t_gobj *z, t_glist *glist,
int dx, int dy)
{
t_popup *x = (t_popup *)z;
- DEBUG(post("displace");)
+ DEBUG(post("displace start");)
x->x_obj.te_xpix += dx;
x->x_obj.te_ypix += dy;
if (glist_isvisible(glist))
@@ -230,6 +248,8 @@ static void popup_displace(t_gobj *z, t_glist *glist,
static void popup_select(t_gobj *z, t_glist *glist, int state)
{
+ DEBUG(post("select start");)
+
t_popup *x = (t_popup *)z;
if (state) {
sys_vgui(".x%x.c create rectangle \
@@ -243,10 +263,14 @@ static void popup_select(t_gobj *z, t_glist *glist, int state)
sys_vgui(".x%x.c delete %xSEL\n",
glist_getcanvas(glist), x);
}
+
+ DEBUG(post("select end");)
}
static void popup_activate(t_gobj *z, t_glist *glist, int state)
{
+ DEBUG(post("activate commented out!");)
+
/* What does this do, why commented out?
t_text *x = (t_text *)z;
t_rtext *y = glist_findrtext(glist, x);
@@ -255,8 +279,12 @@ static void popup_activate(t_gobj *z, t_glist *glist, int state)
static void popup_delete(t_gobj *z, t_glist *glist)
{
+ DEBUG(post("delete start");)
+
t_text *x = (t_text *)z;
canvas_deletelinesfor(glist_getcanvas(glist), x);
+
+ DEBUG(post("delete end");)
}
@@ -264,6 +292,7 @@ static void popup_vis(t_gobj *z, t_glist *glist, int vis)
{
t_popup* s = (t_popup*)z;
t_rtext *y;
+ DEBUG(post("vis start");)
DEBUG(post("vis: %d",vis);)
if (vis) {
#ifdef PD_MINOR_VERSION
@@ -278,6 +307,8 @@ static void popup_vis(t_gobj *z, t_glist *glist, int vis)
popup_erase(s,glist);
rtext_free(y);
}
+
+ DEBUG(post("vis end");)
}
static void popup_save(t_gobj *z, t_binbuf *b);
@@ -296,10 +327,13 @@ t_widgetbehavior popup_widgetbehavior = {
#if PD_MINOR_VERSION < 37
w_propertiesfn: NULL,
#endif
+
};
static void popup_output(t_popup* x, t_floatarg popup_index)
{
+ DEBUG(post("output start");)
+
outlet_symbol(x->out2, x->x_options[(int)popup_index]);
outlet_float(x->x_obj.ob_outlet, popup_index);
}
@@ -307,23 +341,29 @@ static void popup_output(t_popup* x, t_floatarg popup_index)
static void popup_save(t_gobj *z, t_binbuf *b)
{
+ DEBUG(post("save start");)
+
int i;
t_popup *x = (t_popup *)z;
- binbuf_addv(b, "ssiisiss", gensym("#X"),gensym("obj"),
+ binbuf_addv(b, "ssiisiiss", gensym("#X"),gensym("obj"),
x->x_obj.te_xpix, x->x_obj.te_ypix ,
- gensym("popup"), x->x_width, x->x_colour, x->x_name);
+ gensym("popup"), x->x_width, x->x_height, x->x_colour, x->x_name);
/* Loop for menu items */
for(i=0 ; i<x->x_num_options ; i++)
{
binbuf_addv(b, "s", x->x_options[i]);
}
binbuf_addv(b, ";");
+
+ DEBUG(post("vis end");)
}
/* function to change the popup's menu */
void popup_options(t_popup* x, t_symbol *s, int argc, t_atom *argv)
{
+ DEBUG(post("options start");)
+
int i;
x->x_num_options = argc;
@@ -337,11 +377,15 @@ void popup_options(t_popup* x, t_symbol *s, int argc, t_atom *argv)
sys_vgui(".x%x.c.s%x.menu add command -label \"%s\" -command {.x%x.c.s%x configure -text \"%s\" ; popup_sel%x \"%d\"} \n",
x->x_glist, x, x->x_options[i]->s_name, x->x_glist, x, x->x_options[i]->s_name, x, i);
}
+
+ DEBUG(post("options end");)
}
/* function to change colour of popup background */
void popup_bgcolour(t_popup* x, t_symbol* col)
{
+ DEBUG(post("bgcolour start");)
+
x->x_colour->s_name = col->s_name;
sys_vgui(".x%x.c.s%x configure -background \"%s\"\n", x->x_glist, x, col->s_name);
}
@@ -349,6 +393,8 @@ void popup_bgcolour(t_popup* x, t_symbol* col)
/* Function to change name of popup */
static void popup_name(t_popup* x, t_symbol *name)
{
+ DEBUG(post("name start");)
+
x->x_name->s_name = name->s_name;
sys_vgui(".x%x.c.s%x configure -text \"%s\"\n", x->x_glist, x, name->s_name);
}
@@ -356,6 +402,8 @@ static void popup_name(t_popup* x, t_symbol *name)
/* Function to select a menu option by inlet */
static void popup_iselect(t_popup* x, t_floatarg item)
{
+ DEBUG(post("iselect start");)
+
int i=(int)item;
if( i<x->x_num_options && i>=0)
{
@@ -364,6 +412,8 @@ static void popup_iselect(t_popup* x, t_floatarg item)
} else {
post("popup: Valid menu selections are from %d to %d\npopup: You entered %d.", 0, x->x_num_options, i);
}
+
+ DEBUG(post("iselect end");)
}
static t_class *popup_class;
@@ -371,6 +421,8 @@ static t_class *popup_class;
static void *popup_new(t_symbol *s, int argc, t_atom *argv)
{
+ DEBUG(post("popup new start");)
+
t_popup *x = (t_popup *)pd_new(popup_class);
int i;
char buf[256];
@@ -384,6 +436,7 @@ static void *popup_new(t_symbol *s, int argc, t_atom *argv)
{
post("popup: You must enter at least 4 arguments. Default values used.");
x->x_width = 124;
+ x->x_height = 25;
x->x_num_options = 1;
x->x_colour = gensym("#ffffff");
x->x_name = gensym("popup");
@@ -393,14 +446,15 @@ static void *popup_new(t_symbol *s, int argc, t_atom *argv)
} else {
/* Copy args into structure */
x->x_width = atom_getint(argv);
- x->x_colour = atom_getsymbol(argv+1);
- x->x_name = atom_getsymbol(argv+2);
+ x->x_height = atom_getint(argv+1);
+ x->x_colour = atom_getsymbol(argv+2);
+ x->x_name = atom_getsymbol(argv+3);
- x->x_num_options = argc-3;
+ x->x_num_options = argc-4;
for(i=0 ; i<x->x_num_options ; i++)
{
- x->x_options[i] = atom_getsymbol( argv+(i+3) );
+ x->x_options[i] = atom_getsymbol( argv+(i+4) );
}
}
@@ -415,9 +469,14 @@ static void *popup_new(t_symbol *s, int argc, t_atom *argv)
outlet_new(&x->x_obj, &s_float);
x->out2 = outlet_new(&x->x_obj, &s_symbol);
return (x);
+
+ DEBUG(post("popup new end");)
}
void popup_setup(void) {
+
+ DEBUG(post("setup start");)
+
popup_class = class_new(gensym("popup"), (t_newmethod)popup_new, 0,
sizeof(t_popup),0,A_GIMME,0);