⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fl_window_type.cxx

📁 PIXIL is a small footprint operating environment, complete with PDA PIM applications, a browser and
💻 CXX
📖 第 1 页 / 共 2 页
字号:
	if (o->o->y() < by) by = o->o->y();	if (o->o->x()+o->o->w() > br) br = o->o->x()+o->o->w();	if (o->o->y()+o->o->h() > bt) bt = o->o->y()+o->o->h();      }    recalc = 0;  }  fl_color(FL_RED);  if (drag==BOX && (x1 != mx || y1 != my)) {    int x = x1; int r = mx; if (x > r) {x = mx; r = x1;}    int y = y1; int b = my; if (y > b) {y = my; b = y1;}    fl_rect(x,y,r-x,b-y);  }  if (overlays_invisible && !drag) return;  if (selected) fl_rect(0,0,o->w(),o->h());  if (!numselected) return;  int bx,by,br,bt;  bx = o->w(); by = o->h(); br = 0; bt = 0;  for (Fl_Type *q=next; q && q->level>level; q = q->next)    if (q->selected && q->is_widget() && !q->is_menu_item()) {      Fl_Widget_Type* o = (Fl_Widget_Type*)q;      int x,y,r,t;      newposition(o,x,y,r,t);      fl_rect(x,y,r-x,t-y);      if (x < bx) bx = x;      if (y < by) by = y;      if (r > br) br = r;      if (t > bt) bt = t;    }  if (selected) return;  if (numselected>1) fl_rect(bx,by,br-bx,bt-by);  fl_rectf(bx,by,5,5);  fl_rectf(br-5,by,5,5);  fl_rectf(br-5,bt-5,5,5);  fl_rectf(bx,bt-5,5,5);}// Calculate new bounding box of selected widgets:void Fl_Window_Type::fix_overlay() {  overlays_invisible = 0;  recalc = 1;  ((Overlay_Window *)(this->o))->redraw_overlay();}// do that for every window (when selected set changes):void redraw_overlays() {  for (Fl_Type *o=Fl_Type::first; o; o=o->next)    if (o->is_window()) ((Fl_Window_Type*)o)->fix_overlay();}void toggle_overlays(Fl_Widget *,void *) {  overlays_invisible = !overlays_invisible;  for (Fl_Type *o=Fl_Type::first; o; o=o->next)    if (o->is_window()) {      Fl_Widget_Type* w = (Fl_Widget_Type*)o;      ((Overlay_Window*)(w->o))->redraw_overlay();    }}extern void select(Fl_Type *,int);extern void select_only(Fl_Type *);extern void deselect();extern Fl_Type* in_this_only;extern void fix_group_size(Fl_Type *t);extern Fl_Menu_Item Main_Menu[];extern Fl_Menu_Item New_Menu[];// move the selected children according to current dx,dy,drag state:void Fl_Window_Type::moveallchildren(){  Fl_Type *i;  for (i=next; i && i->level>level;) {    if (i->selected && i->is_widget() && !i->is_menu_item()) {      Fl_Widget_Type* o = (Fl_Widget_Type*)i;      int x,y,r,t;      newposition(o,x,y,r,t);      o->o->resize(x,y,r-x,t-y);      // move all the children, whether selected or not:      Fl_Type* p;      for (p = o->next; p && p->level>o->level; p = p->next)	if (p->is_widget() && !p->is_menu_item()) {	  Fl_Widget_Type* o = (Fl_Widget_Type*)p;	  int x,y,r,t;	  newposition(o,x,y,r,t);	  o->o->resize(x,y,r-x,t-y);	}      i = p;    } else {      i = i->next;    }  }  for (i=next; i && i->level>level; i=i->next)     fix_group_size(i);  o->redraw();  recalc = 1;  ((Overlay_Window *)(this->o))->redraw_overlay();  modflag = 1;  dx = dy = 0;}int Fl_Window_Type::handle(int event) {  static Fl_Type* selection;  switch (event) {  case FL_PUSH:    x1 = mx = Fl::event_x();    y1 = my = Fl::event_y();    drag = 0;    // test for popup menu:    if (Fl::event_button() >= 3) {      in_this_only = this; // modifies how some menu items work.      static const Fl_Menu_Item* prev;      const Fl_Menu_Item* m = New_Menu->popup(mx,my,"New",prev);      if (m && m->callback()) {prev = m; m->do_callback(this->o);}      in_this_only = 0;      return 1;    }    // find the innermost item clicked on:    selection = this;    {for (Fl_Type* i=next; i && i->level>level; i=i->next)      if (i->is_widget() && !i->is_menu_item()) {      Fl_Widget_Type* o = (Fl_Widget_Type*)i;      for (Fl_Widget *o1 = o->o; o1; o1 = o1->parent())	if (!o1->visible()) goto CONTINUE2;      if (Fl::event_inside(o->o)) selection = o;    CONTINUE2:;    }}    // see if user grabs edges of selected region:    if (numselected && !(Fl::event_state(FL_SHIFT)) &&	mx<=br+snap && mx>=bx-snap && my<=bt+snap && my>=by-snap) {      int snap1 = snap>5 ? snap : 5;      int w1 = (br-bx)/4; if (w1 > snap1) w1 = snap1;      if (mx>=br-w1) drag |= RIGHT;      else if (mx<bx+w1) drag |= LEFT;      w1 = (bt-by)/4; if (w1 > snap1) w1 = snap1;      if (my<=by+w1) drag |= BOTTOM;      else if (my>bt-w1) drag |= TOP;      if (!drag) drag = DRAG;    }    // do object-specific selection of other objects:    {Fl_Type* t = selection->click_test(mx, my);    if (t) {      //if (t == selection) return 1; // indicates mouse eaten w/o change      if (Fl::event_state(FL_SHIFT)) {	Fl::event_is_click(0);	select(t, !t->selected);      } else {	deselect();	select(t, 1);	if (t->is_menu_item()) t->open();      }      selection = t;      drag = 0;    } else {      if (!drag) drag = BOX; // if all else fails, start a new selection region    }}    return 1;  case FL_DRAG:    if (!drag) return 0;    mx = Fl::event_x();    my = Fl::event_y();    newdx();    return 1;  case FL_RELEASE:    if (!drag) return 0;    mx = Fl::event_x();    my = Fl::event_y();    newdx();    if (drag != BOX && (dx || dy || !Fl::event_is_click())) {      if (dx || dy) moveallchildren();    } else if ((Fl::event_clicks() || Fl::event_state(FL_CTRL))) {      Fl_Widget_Type::open();    } else {      if (mx<x1) {int t = x1; x1 = mx; mx = t;}      if (my<y1) {int t = y1; y1 = my; my = t;}      int n = 0;      int toggle = Fl::event_state(FL_SHIFT);      // clear selection on everything:      if (!toggle) deselect(); else Fl::event_is_click(0);      // select everything in box:      for (Fl_Type*i=next; i&&i->level>level; i=i->next)	if (i->is_widget() && !i->is_menu_item()) {	Fl_Widget_Type* o = (Fl_Widget_Type*)i;	for (Fl_Widget *o1 = o->o; o1; o1 = o1->parent())	  if (!o1->visible()) goto CONTINUE;	if (Fl::event_inside(o->o)) selection = o;	if (o->o->x()>=x1 && o->o->y()>y1 &&	    o->o->x()+o->o->w()<mx && o->o->y()+o->o->h()<my) {	  n++;	  select(o, toggle ? !o->selected : 1);	}      CONTINUE:;      }      // if nothing in box, select what was clicked on:      if (!n) {	select(selection, toggle ? !selection->selected : 1);      }    }    drag = 0;    return 1;  case FL_KEYBOARD: {    int backtab = 0;    switch (Fl::event_key()) {    case FL_Escape:      ((Fl_Window*)o)->hide();      return 1;    case 0xFE20: // backtab      backtab = 1;    case FL_Tab: {      if (Fl::event_state(FL_SHIFT)) backtab = 1;      // find current child:      Fl_Type *i = Fl_Type::current;      while (i && (!i->is_widget() || i->is_menu_item())) i = i->parent;      if (!i) return 0;      Fl_Type *p = i->parent;      while (p && p != this) p = p->parent;      if (!p || !p->is_widget()) {	i = next; if (!i || i->level <= level) return 0;      }      p = i;      for (;;) {	i = backtab ? i->prev : i->next;	if (!i || i->level <= level) {i = p; break;}	if (i->is_widget() && !i->is_menu_item()) break;      }      deselect(); select(i,1);      return 1;}    case FL_Left:  dx = -1; dy = 0; goto ARROW;    case FL_Right: dx = +1; dy = 0; goto ARROW;    case FL_Up:    dx = 0; dy = -1; goto ARROW;    case FL_Down:  dx = 0; dy = +1; goto ARROW;    ARROW:      // for some reason BOTTOM/TOP are swapped... should be fixed...      drag = (Fl::event_state(FL_SHIFT)) ? (RIGHT|TOP) : DRAG;      if (Fl::event_state(FL_CTRL)) {dx *= gridx; dy *= gridy;}      moveallchildren();      drag = 0;      return 1;    case 'o':      toggle_overlays(0, 0);      break;    default:      return 0;    }}  case FL_SHORTCUT: {    in_this_only = this; // modifies how some menu items work.    const Fl_Menu_Item* m = Main_Menu->test_shortcut();    if (m && m->callback()) m->do_callback(this->o);    in_this_only = 0;    return (m != 0);}  default:    return 0;  }}////////////////////////////////////////////////////////////////#include <stdio.h>#include <string.h>void Fl_Window_Type::write_code1() {  Fl_Widget_Type::write_code1();}void Fl_Window_Type::write_code2() {  write_extra_code();  if (modal) write_c("%so->set_modal();\n", indent());  else if (non_modal) write_c("%so->set_non_modal();\n", indent());  if (!((Fl_Window*)o)->border()) write_c("%so->clear_border();\n", indent());  write_c("%so->end();\n", indent());  if (((Fl_Window*)o)->resizable() == o)    write_c("%so->resizable(o);\n", indent());  write_block_close();}void Fl_Window_Type::write_properties() {  Fl_Widget_Type::write_properties();  if (modal) write_string("modal");  else if (non_modal) write_string("non_modal");  if (!((Fl_Window*)o)->border()) write_string("noborder");  if (xclass) {write_string("xclass"); write_word(xclass);}  if (o->visible()) write_string("visible");}extern int pasteoffset;void Fl_Window_Type::read_property(const char *c) {  if (!strcmp(c,"modal")) {    modal = 1;  } else if (!strcmp(c,"non_modal")) {    non_modal = 1;  } else if (!strcmp(c, "visible")) {    if (Fl::first_window()) open(); // only if we are using user interface  } else if (!strcmp(c,"noborder")) {    ((Fl_Window*)o)->border(0);  } else if (!strcmp(c,"xclass")) {    storestring(read_word(),xclass);    ((Fl_Window*)o)->xclass(xclass);  } else if (!strcmp(c,"xywh")) {    Fl_Widget_Type::read_property(c);    pasteoffset = 0; // make it not apply to contents  } else {    Fl_Widget_Type::read_property(c);  }}int Fl_Window_Type::read_fdesign(const char* name, const char* value) {  int x;  o->box(FL_NO_BOX); // because fdesign always puts an Fl_Box next  if (!strcmp(name,"Width")) {    if (sscanf(value,"%d",&x) == 1) o->size(x,o->h());  } else if (!strcmp(name,"Height")) {    if (sscanf(value,"%d",&x) == 1) o->size(o->w(),x);  } else if (!strcmp(name,"NumberofWidgets")) {    return 1; // we can figure out count from file  } else if (!strcmp(name,"border")) {    if (sscanf(value,"%d",&x) == 1) ((Fl_Window*)o)->border(x);  } else if (!strcmp(name,"title")) {    label(value);  } else {    return Fl_Widget_Type::read_fdesign(name,value);  }  return 1;}//// End of "$Id: Fl_Window_Type.cxx,v 1.1.1.1 2003/08/07 21:18:39 jasonk Exp $".//

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -