static int WithinList(struct gfc_data *d,GEvent *event) { GRect size; GGadget *list; int32 pos; unichar_t *ufile; char *file, **fontnames; int cnt, len; unichar_t *msg; if ( event->type!=et_mousemove ) return( false ); GFileChooserGetChildren(d->gfc,NULL, &list, NULL); if ( list==NULL ) return( false ); if ( !GGadgetWithin(list,event->u.mouse.x,event->u.mouse.y) ) return( false ); pos = GListIndexFromY(list,event->u.mouse.y); if ( pos == d->filename_popup_pos ) return( pos!=-1 ); if ( pos==-1 || GFileChooserPosIsDir(d->gfc,pos)) { d->filename_popup_pos = -1; return( pos!=-1 ); } ufile = GFileChooserFileNameOfPos(d->gfc,pos); if ( ufile==NULL ) return( true ); file = u2def_copy(ufile); free(ufile); fontnames = GetFontNames(file, 0); if ( fontnames==NULL || fontnames[0]==NULL ) msg = uc_copy( "???" ); else { len = 0; for ( cnt=0; fontnames[cnt]!=NULL; ++cnt ) len += strlen(fontnames[cnt])+1; msg = malloc((len+2)*sizeof(unichar_t)); len = 0; for ( cnt=0; fontnames[cnt]!=NULL; ++cnt ) { uc_strcpy(msg+len,fontnames[cnt]); len += strlen(fontnames[cnt]); msg[len++] = '\n'; } msg[len-1] = '\0'; } GGadgetPreparePopup(GGadgetGetWindow(d->gfc),msg); if ( fontnames!=NULL ) { for ( cnt=0; fontnames[cnt]!=NULL; ++cnt ) { free(fontnames[cnt]); } free(fontnames); } free(file); free(d->lastpopupfontname); d->lastpopupfontname = msg; return( true ); }
static int gradio_mouse(GGadget *g, GEvent *event) { GRadio *gr = (GRadio *) g; int within = gr->within, pressed = gr->pressed; if ( !g->takes_input || (g->state!=gs_enabled && g->state!=gs_active && g->state!=gs_focused )) return( false ); if ( event->type == et_crossing ) { if ( gr->within && !event->u.crossing.entered ) gr->within = false; } else if ( gr->pressed && event->type!=et_mousemove ) { if ( event->type == et_mousedown ) /* They pressed 2 mouse buttons? */ gr->pressed = false; else if ( GGadgetWithin(g,event->u.mouse.x,event->u.mouse.y)) { gr->pressed = false; if ( !gr->isradio || !gr->ison ) GRadioChanged(gr); } else if ( event->type == et_mouseup ) gr->pressed = false; else gr->within = true; } else if ( event->type == et_mousedown && GGadgetWithin(g,event->u.mouse.x,event->u.mouse.y)) { gr->pressed = true; gr->within = true; } else if ( event->type == et_mousemove && GGadgetWithin(g,event->u.mouse.x,event->u.mouse.y)) { gr->within = true; if ( !gr->pressed && g->popup_msg ) GGadgetPreparePopup(g->base,g->popup_msg); } else if ( event->type == et_mousemove && gr->within ) { gr->within = false; } else { return( false ); } if ( within != gr->within ) g->state = gr->within? gs_active : gs_enabled; if ( within != gr->within || pressed != gr->pressed ) _ggadget_redraw(g); return( gr->within ); }
static int growcol_mouse(GGadget *g, GEvent *event) { GRowCol *grc = (GRowCol *) g; int pos; if ( !g->takes_input || (g->state!=gs_active && g->state!=gs_enabled && g->state!=gs_focused)) return( false ); if ( event->type == et_crossing ) return( false ); if ( event->type==et_mousemove && !grc->pressed && !grc->parentpressed ) { if ( GGadgetWithin(g,event->u.mouse.x,event->u.mouse.y) && g->popup_msg ) GGadgetPreparePopup(g->base,g->popup_msg); return( true ); } else if ( event->type==et_mouseup && grc->parentpressed && !GGadgetInnerWithin(&grc->g,event->u.mouse.x,event->u.mouse.y)) { grc->parentpressed = false; GDrawPointerUngrab(GDrawGetDisplayOfWindow(grc->g.base)); } else if ( event->type==et_mousemove && grc->parentpressed && GGadgetInnerWithin(&grc->g,event->u.mouse.x,event->u.mouse.y)) { if ( grc->pressed == NULL ) grc->pressed = GDrawRequestTimer(g->base,GRowColScrollTime,GRowColScrollTime,NULL); GDrawPointerUngrab(GDrawGetDisplayOfWindow(grc->g.base)); grc->parentpressed = false; growcol_scroll_selbymouse(grc,event); return( true ); } else if ( event->type==et_mousemove && grc->pressed ) { growcol_scroll_selbymouse(grc,event); return( true ); } else if ( event->type==et_mousedown ) { if ( grc->pressed == NULL ) grc->pressed = GDrawRequestTimer(g->base,GRowColScrollTime,GRowColScrollTime,NULL); pos = GRowColIndexFromPos(grc,event->u.mouse.y); if ( pos==-1 ) return( true ); /* Do Nothing, nothing selectable */ else if ( !grc->exactly_one && grc->ti[pos]->selected && (event->u.mouse.state&(ksm_control|ksm_shift))) { grc->ti[pos]->selected = false; } else if ( !grc->multiple_sel || !(event->u.mouse.state&(ksm_control|ksm_shift))) { GRowColClearSel(grc); grc->ti[pos]->selected = true; grc->start = grc->end = pos; } else if ( event->u.mouse.state&ksm_control ) { grc->ti[pos]->selected = !grc->ti[pos]->selected; grc->start = grc->end = pos; } else if ( event->u.mouse.state&ksm_shift ) { GRowColExpandSelection(grc,pos); } _ggadget_redraw(&grc->g); } else if ( event->type==et_mouseup && grc->pressed ) { GDrawCancelTimer(grc->pressed); grc->pressed = NULL; if ( GGadgetInnerWithin(&grc->g,event->u.mouse.x,event->u.mouse.y) ) { growcol_scroll_selbymouse(grc,event); if ( event->u.mouse.clicks==2 ) GRowColDoubleClick(grc); else GRowColSelected(grc); } } else return( false ); return( true ); }
static int _GWidget_Container_eh(GWindow gw, GEvent *event) { /* Gadgets can get mouse, char and expose events */ /* Widgets might need char events redirected to them */ /* If a gadget doesn't want an event it returns false from its eh */ /* If a subwidget doesn't want an event it may send it up to us */ int handled = false; GGadget *gadget; GContainerD *gd = (GContainerD *) (gw->widget_data); GWindow pixmap; GWindow parent; GTopLevelD *topd; if ( gd==NULL ) /* dying */ return(true); for ( parent = gw; parent->parent!=NULL && parent->parent->widget_data!=NULL && !parent->is_toplevel; parent = parent->parent ); topd = (GTopLevelD *) (parent->widget_data); if ( topd==NULL ) fprintf( stderr, "No top level window found\n" ); GGadgetPopupExternalEvent(event); if ( event->type == et_expose ) { GRect old; pixmap = _GWidget_GetPixmap(gw,&event->u.expose.rect); pixmap->ggc->bg = gw->ggc->bg; GDrawPushClip(pixmap,&event->u.expose.rect,&old); pixmap->user_data = gw->user_data; if ( gd->e_h!=NULL ) { (gd->e_h)(pixmap,event); } for ( gadget = gd->gadgets; gadget!=NULL ; gadget=gadget->prev ) if ( ! ( gadget->r.x>event->u.expose.rect.x+event->u.expose.rect.width || gadget->r.y>event->u.expose.rect.y+event->u.expose.rect.height || gadget->r.x+gadget->r.width<event->u.expose.rect.x || gadget->r.y+gadget->r.height<event->u.expose.rect.y ) && gadget->state!=gs_invisible ) (gadget->funcs->handle_expose)(pixmap,gadget,event); GDrawPopClip(pixmap,&old); _GWidget_RestorePixmap(gw,pixmap,&event->u.expose.rect); return( true ); } else if ( event->type >= et_mousemove && event->type <= et_crossing ) { if ( topd!=NULL && topd->popupowner!=NULL ) { handled = (topd->popupowner->funcs->handle_mouse)(topd->popupowner,event); return( handled ); } if ( gd->grabgadget && event->type==et_mousedown && (event->u.mouse.state&ksm_buttons)==0 ) gd->grabgadget = NULL; /* Happens if a gadget invokes a popup menu. Gadget remains grabbed because menu gets the mouse up */ if ( gd->grabgadget!=NULL ) { handled = (gd->grabgadget->funcs->handle_mouse)(gd->grabgadget,event); if ( !GDrawNativeWindowExists(NULL,event->native_window) || gw->is_dying || gw->widget_data==NULL ) return( true ); if ( event->type==et_mouseup ) gd->grabgadget = NULL; } else if ( event->type==et_mousedown ) { if ( !parent->is_popup ) last_input_window = parent; for ( gadget = gd->gadgets; gadget!=NULL && !handled ; gadget=gadget->prev ) { if ( gadget->state!=gs_disabled && gadget->state!=gs_invisible && gadget->takes_input && GGadgetWithin(gadget,event->u.mouse.x,event->u.mouse.y)) { handled = (gadget->funcs->handle_mouse)(gadget,event); if ( !GDrawNativeWindowExists(NULL,event->native_window) || gw->is_dying || gw->widget_data==NULL ) return( true ); gd->grabgadget = gadget; if ( gadget->focusable && handled ) GWidgetIndicateFocusGadget(gadget); } } } else { for ( gadget = gd->gadgets; gadget!=NULL && !handled ; gadget=gadget->prev ) { if ( !gadget->state!=gs_disabled && gadget->state!=gs_invisible && /*gadget->takes_input &&*/ /* everybody needs mouse moves for popups, even labels */ GGadgetWithin(gadget,event->u.mouse.x,event->u.mouse.y)) { if ( gd->lastwiggle!=NULL && gd->lastwiggle!=gadget ) (gd->lastwiggle->funcs->handle_mouse)(gd->lastwiggle,event); handled = (gadget->funcs->handle_mouse)(gadget,event); if ( !GDrawNativeWindowExists(NULL,event->native_window) || gw->is_dying || gw->widget_data==NULL ) return( true ); gd->lastwiggle = gadget; } } if ( !handled && gd->lastwiggle!=NULL ) { (gd->lastwiggle->funcs->handle_mouse)(gd->lastwiggle,event); if ( !GDrawNativeWindowExists(NULL,event->native_window) || gw->is_dying ) return( true ); } } } else if ( event->type == et_char || event->type == et_charup ) { if ( topd!=NULL ) { handled = (topd->handle_key)(parent,gw,event); } } else if ( event->type == et_drag || event->type == et_dragout || event->type==et_drop ) { GGadget *lastdd = NULL; GEvent e; for ( gadget = gd->gadgets; gadget!=NULL && !handled ; gadget=gadget->prev ) { if ( gadget->funcs->handle_sel && GGadgetWithin(gadget,event->u.drag_drop.x,event->u.drag_drop.y)) if (( handled = (gadget->funcs->handle_sel)(gadget,event) )) { lastdd = gadget; if ( !GDrawNativeWindowExists(NULL,event->native_window) || gw->is_dying ) return( true ); } } if ( !handled && gd->e_h!=NULL ) { handled = (gd->e_h)(gw,event); if ( !GDrawNativeWindowExists(NULL,event->native_window) || gw->is_dying ) return( true ); lastdd = (GGadget *) -1; } e.type = et_dragout; e.w = gw; if ( lastdd!=gd->lastddgadget ) { if ( gd->lastddgadget==(GGadget *) -1 ) (gd->e_h)(gw,&e); else if ( gd->lastddgadget!=NULL ) (gd->lastddgadget->funcs->handle_sel)(gd->lastddgadget,&e); if ( !GDrawNativeWindowExists(NULL,event->native_window) || gw->is_dying ) return( true ); } if ( event->type==et_drag ) gd->lastddgadget = lastdd; else gd->lastddgadget = NULL; return( handled ); } else if ( event->type == et_selclear ) { for ( gadget = gd->gadgets; gadget!=NULL && !handled ; gadget=gadget->prev ) { if ( gadget->funcs->handle_sel ) { if ( (handled = (gadget->funcs->handle_sel)(gadget,event)) ) break; } } } else if ( event->type == et_timer ) { for ( gadget = gd->gadgets; gadget!=NULL && !handled ; gadget=gadget->prev ) { if ( gadget->funcs->handle_timer ) { if ( (handled = (gadget->funcs->handle_timer)(gadget,event)) ) break; } } } else if ( event->type == et_resize ) { GWidgetFlowGadgets(gw); } if ( gd->e_h!=NULL && (!handled || event->type==et_mousemove )) handled = (gd->e_h)(gw,event); if ( event->type == et_destroy ) { GGadget *prev; for ( gadget = gd->gadgets; gadget!=NULL ; gadget=prev ) { prev = gadget->prev; if ( !gadget->contained ) (gadget->funcs->destroy)(gadget); /* contained ggadgets will be destroyed when their owner is destroyed */ } /* Widgets are windows and should get their own destroy events and free themselves */ /* remove us from our parent */ parent = gw->parent; if ( parent!=NULL && parent->widget_data!=NULL ) { GContainerD *pgd = (GContainerD *) (parent->widget_data); struct gwidgetdata *wd, *pwd; for ( pwd=NULL, wd=pgd->widgets; wd!=NULL && wd!=(struct gwidgetdata *) gd; pwd = wd, wd = wd->next ); if ( pwd==NULL ) pgd->widgets = gd->next; else pwd->next = gd->next; } free(gd); gw->widget_data = NULL; } return( handled ); }
static int glist_mouse(GGadget *g, GEvent *event) { GDList *gl = (GDList *) g; int pos; if ( !g->takes_input || (g->state!=gs_active && g->state!=gs_enabled && g->state!=gs_focused)) return( false ); if ( event->type == et_crossing ) return( false ); if (( event->type==et_mouseup || event->type==et_mousedown ) && (event->u.mouse.button>=4 && event->u.mouse.button<=7)) { if ( gl->vsb!=NULL ) return( GGadgetDispatchEvent(&gl->vsb->g,event)); else return( true ); } if ( event->type==et_mousemove && !gl->pressed && !gl->parentpressed ) { if ( GGadgetWithin(g,event->u.mouse.x,event->u.mouse.y) ) { if ( gl->popup_callback!=NULL ) (gl->popup_callback)(g,GListIndexFromPos(gl,event->u.mouse.y)); else if ( g->popup_msg ) GGadgetPreparePopup(g->base,g->popup_msg); } return( true ); } else if ( event->type==et_mouseup && gl->parentpressed /* && !GGadgetInnerWithin(&gl->g,event->u.mouse.x,event->u.mouse.y)*/ ) { gl->parentpressed = false; GDrawPointerUngrab(GDrawGetDisplayOfWindow(gl->g.base)); } else if ( event->type==et_mousemove && gl->parentpressed && GGadgetInnerWithin(&gl->g,event->u.mouse.x,event->u.mouse.y)) { if ( gl->pressed == NULL ) gl->pressed = GDrawRequestTimer(g->base,GListScrollTime,GListScrollTime,NULL); GDrawPointerUngrab(GDrawGetDisplayOfWindow(gl->g.base)); gl->parentpressed = false; glist_scroll_selbymouse(gl,event); return( true ); } else if ( event->type==et_mousemove && gl->pressed ) { glist_scroll_selbymouse(gl,event); return( true ); } else if ( event->type==et_mousedown ) { if ( gl->pressed == NULL ) gl->pressed = GDrawRequestTimer(g->base,GListScrollTime,GListScrollTime,NULL); pos = GListIndexFromPos(gl,event->u.mouse.y); if ( pos==-1 ) return( true ); /* Do Nothing, nothing selectable */ else if ( !gl->exactly_one && gl->ti[pos]->selected && (event->u.mouse.state&(ksm_control|ksm_shift))) { gl->ti[pos]->selected = false; gl->start = gl->end = 0xffff; } else if ( !gl->multiple_sel || (!gl->ti[pos]->selected && !(event->u.mouse.state&(ksm_control|ksm_shift)))) { GListClearSel(gl); gl->ti[pos]->selected = true; gl->start = gl->end = pos; } else if ( event->u.mouse.state&ksm_control || ((event->u.mouse.state&ksm_shift) && gl->ti[pos]->selected)) { gl->ti[pos]->selected = !gl->ti[pos]->selected; gl->start = gl->end = pos; } else if ( event->u.mouse.state&ksm_shift ) { GListExpandSelection(gl,pos); } else { gl->ti[pos]->selected = true; gl->start = gl->end = pos; } _ggadget_redraw(&gl->g); } else if ( event->type==et_mouseup && gl->pressed ) { GDrawCancelTimer(gl->pressed); gl->pressed = NULL; if ( GGadgetInnerWithin(&gl->g,event->u.mouse.x,event->u.mouse.y) ) { pos = GListIndexFromPos(gl,event->u.mouse.y); if ( !(event->u.mouse.state&(ksm_control|ksm_shift)) || gl->start!=0xffff ) glist_scroll_selbymouse(gl,event); if ( event->u.mouse.clicks==2 ) GListDoubleClick(gl,true,pos); else GListSelected(gl,true,pos); } } else return( false ); return( true ); }
static int gscrollbar_mouse(GGadget *g, GEvent *event) { GScrollBar *gsb = (GScrollBar *) g; int active_pos, active_len; if ( !g->takes_input || (g->state!=gs_enabled && g->state!=gs_active && g->state!=gs_focused )) return( false ); if ( event->type == et_crossing ) return( false ); if ( gsb->g.vert ) { active_pos = event->u.mouse.y-g->inner.y; active_len = g->inner.height; } else { active_pos = event->u.mouse.x-g->inner.x; active_len = g->inner.width; } if ( (event->type==et_mouseup || event->type==et_mousedown) && (event->u.mouse.button>=4 && event->u.mouse.button<=7) ) { /* X treats scroll wheels as though they send events from buttons 4 and 5 */ /* Badly configured wacom mice send "p5 r5 p4 r4" or "p4 r4 p5 r5" */ /* properly configured mice just send "p4 r4" or "p5 r5" */ /* And apple's mouse with a scrollwheel sends buttons 6&7 for horizontal*/ /* scrolling */ /* Convention is that shift-vertical scroll=horizontal scroll */ /* control-vertical scroll=minimize/maximize */ if ( event->type==et_mousedown ) { GDrawCancelTimer(gsb->pressed); gsb->pressed = NULL; int isv = event->u.mouse.button<=5; if ( event->u.mouse.state&ksm_shift ) isv = !isv; if ( isv != g->vert ) return( false ); /* Only respond to scrolling events in our direction */ else if ( event->u.mouse.state&ksm_control ) return( false ); if ( event->u.mouse.button==5 || event->u.mouse.button==7 ) { GScrollBarChanged(gsb,et_sb_down,0); } else if ( event->u.mouse.button==4 || event->u.mouse.button==6 ) { GScrollBarChanged(gsb,et_sb_up,0); } } return( true ); } if ( event->type == et_mousedown && GGadgetWithin(g,event->u.mouse.x,event->u.mouse.y)) { GDrawCancelTimer(gsb->pressed); gsb->pressed = NULL; if ( event->u.mouse.button!=1 ) { gsb->thumbpressed = true; gsb->thumboff = 0; active_pos = event->u.mouse.y-g->inner.y; GScrollBarChanged(gsb,et_sb_thumb,active_pos); } else if ( active_pos >= gsb->thumbpos && active_pos < gsb->thumbpos+gsb->thumbsize ) { gsb->thumbpressed = true; gsb->thumboff = active_pos-gsb->thumbpos; } else if ( active_pos < gsb->thumbpos && (event->u.mouse.state&(ksm_control|ksm_meta)) ) { gsb->thumbpressed = true; gsb->thumboff = active_pos; GScrollBarChanged(gsb,et_sb_top,0); } else if ( active_pos >= gsb->thumbpos+gsb->thumbsize && (event->u.mouse.state&(ksm_control|ksm_meta)) ) { gsb->thumbpressed = true; gsb->thumboff = active_pos-active_len+gsb->thumbsize; GScrollBarChanged(gsb,et_sb_bottom,0); } else { if ( active_pos<0 ) gsb->repeatcmd = et_sb_up; else if ( active_pos >= active_len ) gsb->repeatcmd = et_sb_down; else if ( active_pos < gsb->thumbpos ) gsb->repeatcmd = et_sb_uppage; else /* if ( active_pos > gsb->thumbpos+gsb->thumbsize )*/ gsb->repeatcmd = et_sb_downpage; GScrollBarChanged(gsb,gsb->repeatcmd,0); gsb->pressed = GDrawRequestTimer(g->base,_GScrollBar_StartTime,_GScrollBar_RepeatTime,NULL); } } else if ( event->type == et_mousemove && gsb->thumbpressed ) { GDrawSkipMouseMoveEvents(gsb->g.base,event); if ( gsb->g.vert ) { active_pos = event->u.mouse.y-g->inner.y; } else { active_pos = event->u.mouse.x-g->inner.x; } GScrollBarChanged(gsb,et_sb_thumb,active_pos); } else if ( event->type == et_mouseup && (gsb->thumbpressed || gsb->pressed)) { if ( gsb->thumbpressed ) GScrollBarChanged(gsb,et_sb_thumbrelease,active_pos); GDrawCancelTimer(gsb->pressed); gsb->pressed = NULL; gsb->thumbpressed = false; } else if ( event->type == et_mousemove && !gsb->pressed && g->popup_msg!=NULL && GGadgetWithin(g,event->u.mouse.x,event->u.mouse.y)) { GGadgetPreparePopup(g->base,g->popup_msg); return( true ); } else return( false ); return( true ); }