示例#1
0
void KMenuBar::setTopLevelMenuInternal(bool top_level)
{
    if(d->forcedTopLevel)
        top_level = true;

    d->wasTopLevel = top_level;
    if(parentWidget() && parentWidget()->topLevelWidget()->isFullScreen())
        top_level = false;

    if(isTopLevelMenu() == top_level)
        return;
    d->topLevel = top_level;
    if(isTopLevelMenu())
    {
#ifdef Q_WS_X11
        d->selection = new KSelectionWatcher(KMenuBarPrivate::makeSelectionAtom(), DefaultScreen(qt_xdisplay()));
        connect(d->selection, SIGNAL(newOwner(Window)), this, SLOT(updateFallbackSize()));
        connect(d->selection, SIGNAL(lostOwner()), this, SLOT(updateFallbackSize()));
#endif
        d->frameStyle = frameStyle();
        d->lineWidth = lineWidth();
        d->margin = margin();
        d->fallback_mode = false;
        bool wasShown = !isHidden();
        reparent(parentWidget(), WType_TopLevel | WStyle_Tool | WStyle_Customize | WStyle_NoBorder, QPoint(0, 0), false);
#ifdef Q_WS_X11
        KWin::setType(winId(), NET::TopMenu);
        if(parentWidget())
            XSetTransientForHint(qt_xdisplay(), winId(), parentWidget()->topLevelWidget()->winId());
#endif
        QMenuBar::setFrameStyle(NoFrame);
        QMenuBar::setLineWidth(0);
        QMenuBar::setMargin(0);
        updateFallbackSize();
        d->min_size = QSize(0, 0);
        if(parentWidget() && !parentWidget()->isTopLevel())
            setShown(parentWidget()->isVisible());
        else if(wasShown)
            show();
    }
    else
    {
#ifdef Q_WS_X11
        delete d->selection;
        d->selection = NULL;
#endif
        setBackgroundMode(PaletteButton);
        setFrameStyle(d->frameStyle);
        setLineWidth(d->lineWidth);
        setMargin(d->margin);
        setMinimumSize(0, 0);
        setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
        updateMenuBarSize();
        if(parentWidget())
            reparent(parentWidget(), QPoint(0, 0), !isHidden());
    }
}
示例#2
0
FlowController::FlowController(Sensor * s, Actuator *a, Component *p, const std::string & name)
  : FlowMeter(s, p, name),  actuator(a), flow_set(0)
{
  // hack to make Bank and Mix work properly
  if (p && (dynamic_cast<Mix *>(p) || dynamic_cast<Bank *>(p)) ) {
    reparent(0);
    reparent(p);
  }
  if (a && a->parent() != this) a->reparent(this);
}
示例#3
0
void map_client(client_t *c)
{
    XWindowAttributes attr;
    strut_t s = { 0, 0, 0, 0 };
    XWMHints *hints;
    int btn, want_raise = 1;

    XGrabServer(dpy);

    XGetWindowAttributes(dpy, c->win, &attr);
    collect_struts(c, &s);

    if (attr.map_state == IsViewable) {
        c->ignore_unmap++;
        reparent(c, &s);
        if (get_wm_state(c->win) == IconicState) {
            c->ignore_unmap++;
            XUnmapWindow(dpy, c->win);
        } else {
            set_wm_state(c, NormalState);
            do_map(c, want_raise);
        }
    } else {
        if ((hints = XGetWMHints(dpy, c->win))) {
            if (hints->flags & StateHint)
                set_wm_state(c, hints->initial_state);
            XFree(hints);
        } else {
            set_wm_state(c, NormalState);
        }
        if (!init_geom(c, &s) && opt_imap) {
            btn = sweep(c, map_curs, recalc_map, SWEEP_DOWN, &s);
            if (btn == Button2)
                btn = sweep(c, resize_curs, recalc_resize, SWEEP_UP, &s);
            if (btn == Button3)
                want_raise = 0;
        }
#ifdef DEBUG
        dump_geom(c, "set to");
        dump_info(c);
#endif
        reparent(c, &s);
        if (get_wm_state(c->win) == NormalState)
            do_map(c, want_raise);
    }

    XSync(dpy, False);
    c->name = get_wm_name(c->win); // horrible kludge
    XUngrabServer(dpy);
}
示例#4
0
Bank::Bank(Component *p,
           const std::string & name, 
           unsigned numOdors, unsigned cleanOdor, const OdorTable & ot)
  : Component(p, name), currentodor(0), num_odors(numOdors), clean_odor(cleanOdor),
    flow(0)
{
  if (clean_odor >= num_odors) clean_odor = 0;
  setOdorTable(ot);
  // hack to make Mix work properly
  if (p && dynamic_cast<Mix *>(p) ) {
    reparent(0);
    reparent(p);
  }
}
示例#5
0
void QAquaFocusWidget::setFocusWidget(QWidget * widget)
{
    hide();
    if(d) {
	if(d->parentWidget())
	    d->parentWidget()->removeEventFilter(this);
	d->removeEventFilter(this);
    }
    d = NULL;
    if(widget && widget->parentWidget()) {
	d = widget;
	reparent(FOCUS_WIDGET_PARENT(d), pos());
	d->installEventFilter(this);
	d->parentWidget()->installEventFilter(this); //we do this so we can trap the ChildAdded event
        if (QComboBox *combo = ::qt_cast<QComboBox *>(d))
            combo->lineEdit()->installEventFilter(this);
	QPoint p(widget->mapTo(parentWidget(), QPoint(0, 0)));
	setGeometry(p.x() - focusOutset(), p.y() - focusOutset(), 
		    widget->width() + (focusOutset() * 2), widget->height() + (focusOutset() * 2));
	setPalette(widget->palette());
        setBackgroundMode(widget->backgroundMode());
	setMask(QRegion(rect()) - focusRegion());
	raise();
	show();
    }
}
示例#6
0
void EvasTargetWidget::enableFullscreen(void)
{
   fullscreen = 1;
   setFixedSize(qApp->desktop()->size());
   showNormal();
   reparent(0, WStyle_Customize|WStyle_NoBorder, QPoint(0,0));
   showFullScreen();
}
示例#7
0
/// construct a new nested named component, adding it to parent's list
Component::Component(Component *p, const std::string & n)
  : _parent(0), nam(""), cid(compIdCtr++)
{
  if (!n.length()) setName(NAMELESS);
  else setName(n);
  reparent(p);
  if (name() != NAMELESS) nameCompMap[name()] = this;
  idCompMap[id()] = this;
}
示例#8
0
QTreeWidgetItem *GenericPanel::addProject(QETProject *project, QTreeWidgetItem *parent_item, PanelOptions options) {
	if (!project) return(0);
	bool creation_required;
	
	QTreeWidgetItem *project_qtwi = getItemForProject(project, &creation_required);
	updateProjectItem(project_qtwi, project, options, creation_required);
	reparent(project_qtwi, parent_item);
	fillProjectItem(project_qtwi, project, options, creation_required);
	
	return(project_qtwi);
}
示例#9
0
void GoRide::enableFullscreen() {
  // Make sure size is correct
  setFixedSize(qApp->desktop()->size());
  // This call is needed because showFullScreen won't work
  // correctly if the widget already considers itself to be fullscreen.
  showNormal();
  // This is needed because showNormal() forcefully changes the window
  // style to WSTyle_TopLevel.
  reparent(0, WStyle_Customize | WStyle_NoBorder, QPoint(0,0));
  // Enable fullscreen.
  showFullScreen();
}
示例#10
0
void VirtualConsole::createContents(QList<QString> &list)
{
  QString t;

  DMXWidget::globalDMXWidgetIDReset();
  
  if (m_drawArea != NULL)
    {
      delete m_drawArea;
      m_drawArea = NULL;
    }

  for (QString* s = list.next(); s != NULL; s = list.next())
    {
      if (*s == QString("Entry"))
	{
	  s = list.next();

	  if (*s == QString("Virtual Console"))
	    {
	      createVirtualConsole(list);
	    }
	  else if (*s == QString("Frame"))
	    {
	      list.prev();
	      createWidget(list);
	    }
	  else if (*s == QString("Button"))
	    {
	      list.prev();
	      createWidget(list);
	    }
	  else if (*s == QString("SpeedSlider"))
	    {
	      list.prev();
	      createWidget(list);
	    }
	  else
	    {
	      // Unknown keyword, skip
	      list.next();
	    }
	}
      else
	{
	  list.next();
	}
    }

  // Virtual console sometimes loses its parent (or vice versa)
  // when loading a new document... try to handle it with this.
  reparent((QWidget*) _app->workspace(), 0, pos(), isVisible());
}
示例#11
0
void OSMDIChildWnd::attachMDI(OSMDIParentWnd *mdiparent) {
  if (!detached) return;
  if (!mdiparent) mdiparent = m_oldparent;
  setMDIParent(mdiparent);
  detached = 0;
  reparent(mdiparent->getMDIClient());
#ifdef DETACHABLE
  HMENU sysm = GetSystemMenu(getOsWindowHandle(), FALSE);
  UINT currentID = MDICHILD_SYSMENU_DETACH;
  ModifyMenu(sysm,MDICHILD_SYSMENU_DETACH,MF_STRING,(UINT_PTR)currentID,"Detach from main window");
#endif
  //SetMenu(gethWnd(), NULL); fucko
}
示例#12
0
void
TextFloat::setText(const QString &text)
{
    // Call reparent() only if we are going to use text float from a
    // newly entered widget
    if (m_newlyAttached) {
        reparent(m_widget);
        m_newlyAttached = false;
    }

    // then wrap to BaseTextFloat
    BaseTextFloat::setText(text);
}
示例#13
0
void
TextFloat::display(QPoint offset)
{
    // Call reparent() only if we are going to use text float from a
    // newly entered widget
    if (m_newlyAttached) {
        reparent(m_widget);
        m_newlyAttached = false;
    }

    // then wrap to BaseTextFloat
    BaseTextFloat::display(offset);
}
示例#14
0
Component::~Component()
{
  reparent(0);
  ComponentList childListCopy = childList; // need to work on a copy of the set due to iterator problems when deleting the children which attempt to remove themselves from the set..
  // clear these two to make the below delete call (which ultimately calls
  // reparent and childAdded()) peppier..
  childList.clear(); 
  childNameMap.clear(); 
  for (ComponentList::iterator it = childListCopy.begin(); it != childListCopy.end(); ++it) 
    delete (*it);
  idCompMap.erase(id());
  NameMap::iterator it = nameCompMap.find(nam);
  if (it != nameCompMap.end() && it->second == this) nameCompMap.erase(it);  
}
示例#15
0
void App::setFullScreen(bool fullScreen)
{
    static QSize normalsize;

    if (fullScreen)
    {
        if (!normalsize.isValid())
            normalsize = size();

        setFixedSize(qApp->desktop()->size());
        showNormal();
        reparent(0, WStyle_Customize | WStyle_NoBorder, QPoint (0, 0));
        QMainWindow::showFullScreen();
    }
    else
    {
        showNormal();
        reparent(0, 0, QPoint (0, 0));
        resize(normalsize);
        showMaximized();
        normalsize = QSize();
    }
}
示例#16
0
FloatWidget::FloatWidget(Gtk::Widget& parent, int width, int height) :
m_width(width),
m_height(height) {
	m_parent = &parent;

	resize(m_width, m_height);
	set_decorated(false);
	set_keep_above();
	set_skip_taskbar_hint(true);
	set_skip_pager_hint(true);
	set_type_hint(Gdk::WINDOW_TYPE_HINT_UTILITY);
	reparent(parent);
	
	m_widgetlist.insert(this);
}
示例#17
0
bool QAquaFocusWidget::eventFilter(QObject * o, QEvent * e)
{
    if((e->type() == QEvent::ChildInserted || e->type() == QEvent::ChildRemoved) &&
	((QChildEvent*)e)->child() == this) {
	if(e->type() == QEvent::ChildRemoved)
	    o->removeEventFilter(this); //once we're removed, stop listening
	return TRUE; //block child events
    } else if(o == d) {
	switch (e->type()) {
	case QEvent::PaletteChange:
	    setPalette(d->palette());
	    break;
	case QEvent::Hide:
	    hide();
	    break;
	case QEvent::Show:
	    show();
	    break;
	case QEvent::Move: {
	    QPoint p(d->mapTo(parentWidget(), QPoint(0, 0)));
	    move(p.x() - focusOutset(), p.y() - focusOutset());
	    break;
	}
	case QEvent::Resize: {
	    QResizeEvent *re = (QResizeEvent*)e;
	    resize(re->size().width() + (focusOutset() * 2), 
		    re->size().height() + (focusOutset() * 2));
	    setMask(QRegion(rect()) - focusRegion());
	    break;
	}
	case QEvent::Reparent: {
	    QWidget *newp = FOCUS_WIDGET_PARENT(d);
	    QPoint p(d->mapTo(newp, QPoint(0, 0)));
	    newp->installEventFilter(this);
	    reparent(newp, p);
	    raise();
	    break; }
	default:
	    break;
	}
    } else if (QComboBox *combo = ::qt_cast<QComboBox *>(d)) {
        if (combo->lineEdit() == o && e->type() == QEvent::FocusOut)
            QApplication::sendEvent(combo, e);
    }
    return FALSE;
}
示例#18
0
void FLReportViewer::rptViewerReparent(QWidget *parentFrame)
{
  if (!parentFrame)
    return;

  QAction *actExit = ::qt_cast<QAction *>(child("salir", "QAction"));
  if (actExit)
    actExit->setVisible(false);

  reparent(parentFrame, 0, QPoint(0, 0));

  if (!parentFrame->layout()) {
    QVBoxLayout *lay = new QVBoxLayout(parentFrame);
    lay->addWidget(this);
  } else
    parentFrame->layout()->add(this);

  QWidget::show();
}
示例#19
0
void OSMDIChildWnd::detachMDI() {
  if (detached) return;
  detached = 1;
  if(m_parent) {
    OSMDIClientWnd * realparent = m_parent->getMDIClient();
    if ( realparent )
      realparent->unregisterRootWndChild(this);
    m_parent->updateMDIControlButtons(isMaximized());
  }
  m_oldparent = m_parent;
  setMDIParent(NULL);
  reparent(NULL);
#ifdef DETACHABLE
  HMENU sysm = GetSystemMenu(getOsWindowHandle(), FALSE);
  UINT currentID = MDICHILD_SYSMENU_DETACH;
  ModifyMenu(sysm,MDICHILD_SYSMENU_DETACH,MF_STRING,(UINT_PTR)currentID,"Attach to main window");
#endif
  //if (getMenu()) SetMenu(gethWnd(), getMenu()); fucko
}
示例#20
0
文件: vcbutton.cpp 项目: speakman/qlc
void VCButton::copyFrom(VCButton* button)
{
  attachFunction(button->m_functionID);

  m_resizeMode = false;

  assert(button->keyBind());
  if (m_keyBind)
    {
      disconnect(m_keyBind);
      delete m_keyBind;
    }

  m_keyBind = new KeyBind(button->keyBind());
  connect(m_keyBind, SIGNAL(pressed()), this, SLOT(pressFunction()));
  connect(m_keyBind, SIGNAL(released()), this, SLOT(releaseFunction()));

  setToggleButton(true);

  setCaption(button->caption());

  if (button->ownFont())
    {
      setFont(button->font());
    }

  if (button->ownPalette())
    {
      setPaletteForegroundColor(button->paletteForegroundColor());
      setPaletteBackgroundColor(button->paletteBackgroundColor());
    }

  if (button->paletteBackgroundPixmap())
    {
      setPaletteBackgroundPixmap(*button->paletteBackgroundPixmap());
    }

  reparent(button->parentWidget(), 0, QPoint(0, 0), true);

  setGeometry(button->geometry());

  move(button->x() + button->width(), button->y());
}
示例#21
0
void PopupMenuEditor::init()
{
    reparent( ( QMainWindow * ) formWnd->mainContainer(), pos() );

    addItem.action()->setMenuText( tr("new item") );
    addSeparator.action()->setMenuText( tr("new separator") );

    setAcceptDrops( TRUE );
    setFocusPolicy( StrongFocus );

    lineEdit = new QLineEdit( this );
    lineEdit->hide();
    lineEdit->setFrameStyle(QFrame::Plain | QFrame::NoFrame);
    lineEdit->polish();
    lineEdit->setBackgroundOrigin(ParentOrigin);
    lineEdit->setBackgroundMode(PaletteButton);
    lineEdit->installEventFilter( this );

    dropLine = new QWidget( this, 0, Qt::WStyle_NoBorder | WStyle_StaysOnTop );
    dropLine->setBackgroundColor( Qt::red );
    dropLine->hide();

    hide();
}
示例#22
0
void VirtualConsole::createContents(QPtrList <QString> &list)
{
    QString t;

    VCFrame::ResetID();

    if (m_drawArea != NULL)
    {
        delete m_drawArea;
        m_drawArea = NULL;
    }

    for (QString* s = list.next(); s != NULL; s = list.next())
    {
        if (*s == QString("Entry"))
        {
            s = list.next();

            if (*s == QString("Virtual Console"))
            {
                createVirtualConsole(list);
            }
            else if (*s == QString("Frame"))
            {
                list.prev();
                createWidget(list);
            }
            else if (*s == QString("Button"))
            {
                list.prev();
                createWidget(list);
            }
            else if (*s == QString("Label"))
            {
                list.prev();
                createWidget(list);
            }
            else if (*s == QString("Slider"))
            {
                list.prev();
                createWidget(list);
            }
            else
            {
                // Unknown keyword, skip
                list.next();
            }
        }
        else
        {
            list.next();
        }
    }

    // Virtual console sometimes loses its parent (or vice versa)
    // when loading a new document... try to handle it with this.
    reparent((QWidget*) _app->workspace(), 0, pos(), isVisible());

    // Check if VC should be open
    QString config;
    _app->settings()->get(KEY_VIRTUAL_CONSOLE_OPEN, config);
    if (config == Settings::trueValue())
    {
        _app->slotViewVirtualConsole();
    }
    else
    {
        hide();
        _app->slotVirtualConsoleClosed();
    }
}
示例#23
0
文件: vcframe.cpp 项目: speakman/qlc
void VCFrame::createContents(QPtrList <QString> &list)
{
  QRect rect(30, 30, 30, 30);

  for (QString* s = list.next(); s != NULL; s = list.next())
    {
      if (*s == QString("Entry"))
	{
	  s = list.prev();
	  break;
	}
      else if (*s == QString("ID"))
	{
	  setID(list.next()->toInt());
	}
      else if (*s == QString("ButtonBehaviour"))
	{
	  setButtonBehaviour(static_cast<ButtonBehaviour>
			     (list.next()->toInt()));
	}
      else if (*s == QString("Parent"))
	{
	  if (m_bottomFrame == false)
	    {
	      VCFrame* parent = 
		_app->virtualConsole()->getFrame(list.next()->toInt());

	      if (parent != NULL)
		{
		  reparent((QWidget*) parent, 0, QPoint(0, 0), true);
		}
	    }
	  else
	    {
	      list.next();
	    }
	}
      else if (*s == QString("Textcolor"))
	{
	  QColor qc;
	  qc.setRgb(list.next()->toUInt());
	  setPaletteForegroundColor(qc);
	}
      else if (*s == QString("Backgroundcolor"))
	{
	  QColor qc;
	  qc.setRgb(list.next()->toUInt());
	  setPaletteBackgroundColor(qc);
	}
      else if (*s == QString("Color"))
	{
	  // Backwards compatibility for frame background color
	  QString t = *(list.next());
	  int i = t.find(QString(","));
	  int r = t.left(i).toInt();
	  int j = t.find(QString(","), i + 1);
	  int g = t.mid(i+1, j-i-1).toInt();
	  int b = t.mid(j+1).toInt();
	  QColor qc(r, g, b);
	  setPaletteBackgroundColor(qc);
	}
      else if (*s == QString("Pixmap"))
	{
	  QString t;
	  t = *(list.next());
	  
	  QPixmap pm(t);
	  if (pm.isNull() == false)
	    {
	      setIconText(t);
	      setPaletteBackgroundPixmap(pm);
	    }
	}
      else if (*s == QString("Font"))
	{
	  QFont f = font();
	  QString q = *(list.next());
	  f.fromString(q);
	  setFont(f);
	}
      else if (*s == QString("X"))
	{
	  rect.setX(list.next()->toInt());
	}
      else if (*s == QString("Y"))
	{
	  rect.setY(list.next()->toInt());
	}
      else if (*s == QString("Width"))
	{
	  rect.setWidth(list.next()->toInt());
	}
      else if (*s == QString("Height"))
	{
	  rect.setHeight(list.next()->toInt());
	}
      else
	{
	  // Unknown keyword, ignore
	  *list.next();
	}
    }

  if (m_bottomFrame == false)
    {
      setGeometry(rect);
    }
}
示例#24
0
文件: dir.c 项目: lacombar/netbsd-alc
/*
 * Scan each entry in a directory block.
 */
int
dirscan(struct inodesc *idesc)
{
	struct direct *dp;
	struct bufarea *bp;
	int dsize, n;
	long blksiz;
#if DIRBLKSIZ > APPLEUFS_DIRBLKSIZ
	char dbuf[DIRBLKSIZ];
#else
	char dbuf[APPLEUFS_DIRBLKSIZ];
#endif

	if (idesc->id_type != DATA)
		errexit("wrong type to dirscan %d", idesc->id_type);
	if (idesc->id_entryno == 0 &&
	    (idesc->id_filesize & (dirblksiz - 1)) != 0)
		idesc->id_filesize = roundup(idesc->id_filesize, dirblksiz);
	blksiz = idesc->id_numfrags * sblock->fs_fsize;
	if (chkrange(idesc->id_blkno, idesc->id_numfrags)) {
		idesc->id_filesize -= blksiz;
		return (SKIP);
	}

	/*
	 * If we are are swapping byte order in directory entries, just swap
	 * this block and return.
	 */
	if (do_dirswap) {
		int off;
		bp = getdirblk(idesc->id_blkno, blksiz);
		for (off = 0; off < blksiz; off += iswap16(dp->d_reclen)) {
			dp = (struct direct *)(bp->b_un.b_buf + off);
			dp->d_ino = bswap32(dp->d_ino);
			dp->d_reclen = bswap16(dp->d_reclen);
			if (!newinofmt) {
				u_int8_t tmp = dp->d_namlen;
				dp->d_namlen = dp->d_type;
				dp->d_type = tmp;
			}
			if (dp->d_reclen == 0)
				break;
		}
		dirty(bp);
		idesc->id_filesize -= blksiz;
		return (idesc->id_filesize > 0 ? KEEPON : STOP);
	}

	idesc->id_loc = 0;
	for (dp = fsck_readdir(idesc); dp != NULL; dp = fsck_readdir(idesc)) {
		dsize = iswap16(dp->d_reclen);
		if (dsize > sizeof dbuf)
			dsize = sizeof dbuf;
		memmove(dbuf, dp, (size_t)dsize);
#		if (BYTE_ORDER == LITTLE_ENDIAN)
			if (!newinofmt && !needswap) {
#		else
			if (!newinofmt && needswap) {
#		endif
				struct direct *tdp = (struct direct *)dbuf;
				u_char tmp;

				tmp = tdp->d_namlen;
				tdp->d_namlen = tdp->d_type;
				tdp->d_type = tmp;
			}
		idesc->id_dirp = (struct direct *)dbuf;
		if ((n = (*idesc->id_func)(idesc)) & ALTERED) {
#			if (BYTE_ORDER == LITTLE_ENDIAN)
				if (!newinofmt && !doinglevel2 && !needswap) {
#			else
				if (!newinofmt && !doinglevel2 && needswap) {
#			endif
					struct direct *tdp;
					u_char tmp;

					tdp = (struct direct *)dbuf;
					tmp = tdp->d_namlen;
					tdp->d_namlen = tdp->d_type;
					tdp->d_type = tmp;
				}
			bp = getdirblk(idesc->id_blkno, blksiz);
			memmove(bp->b_un.b_buf + idesc->id_loc - dsize, dbuf,
			    (size_t)dsize);
			dirty(bp);
			sbdirty();
		}
		if (n & STOP) 
			return (n);
	}
	return (idesc->id_filesize > 0 ? KEEPON : STOP);
}

/*
 * get next entry in a directory.
 */
static struct direct *
fsck_readdir(struct inodesc *idesc)
{
	struct direct *dp, *ndp;
	struct bufarea *bp;
	long size, blksiz, fix, dploc;

	blksiz = idesc->id_numfrags * sblock->fs_fsize;
	bp = getdirblk(idesc->id_blkno, blksiz);
	if (idesc->id_loc % dirblksiz == 0 && idesc->id_filesize > 0 &&
	    idesc->id_loc < blksiz) {
		dp = (struct direct *)(bp->b_un.b_buf + idesc->id_loc);
		if (dircheck(idesc, dp))
			goto dpok;
		if (idesc->id_fix == IGNORE)
			return (0);
		fix = dofix(idesc, "DIRECTORY CORRUPTED");
		bp = getdirblk(idesc->id_blkno, blksiz);
		dp = (struct direct *)(bp->b_un.b_buf + idesc->id_loc);
		dp->d_reclen = iswap16(dirblksiz);
		dp->d_ino = 0;
		dp->d_type = 0;
		dp->d_namlen = 0;
		dp->d_name[0] = '\0';
		if (fix)
			dirty(bp);
		else 
			markclean = 0;
		idesc->id_loc += dirblksiz;
		idesc->id_filesize -= dirblksiz;
		return (dp);
	}
dpok:
	if (idesc->id_filesize <= 0 || idesc->id_loc >= blksiz)
		return NULL;
	dploc = idesc->id_loc;
	dp = (struct direct *)(bp->b_un.b_buf + dploc);
	idesc->id_loc += iswap16(dp->d_reclen);
	idesc->id_filesize -= iswap16(dp->d_reclen);
	if ((idesc->id_loc % dirblksiz) == 0)
		return (dp);
	ndp = (struct direct *)(bp->b_un.b_buf + idesc->id_loc);
	if (idesc->id_loc < blksiz && idesc->id_filesize > 0 &&
	    dircheck(idesc, ndp) == 0) {
		size = dirblksiz - (idesc->id_loc % dirblksiz);
		idesc->id_loc += size;
		idesc->id_filesize -= size;
		if (idesc->id_fix == IGNORE)
			return (0);
		fix = dofix(idesc, "DIRECTORY CORRUPTED");
		bp = getdirblk(idesc->id_blkno, blksiz);
		dp = (struct direct *)(bp->b_un.b_buf + dploc);
		dp->d_reclen = iswap16(iswap16(dp->d_reclen) + size);
		if (fix)
			dirty(bp);
		else 
			markclean = 0;
	}
	return (dp);
}

/*
 * Verify that a directory entry is valid.
 * This is a superset of the checks made in the kernel.
 */
static int
dircheck(struct inodesc *idesc, struct direct *dp)
{
	int size;
	char *cp;
	u_char namlen, type;
	int spaceleft;

	spaceleft = dirblksiz - (idesc->id_loc % dirblksiz);
	if (iswap32(dp->d_ino) >= maxino ||
	    dp->d_reclen == 0 ||
	    iswap16(dp->d_reclen) > spaceleft ||
	    (iswap16(dp->d_reclen) & 0x3) != 0) 
		return (0);
	if (dp->d_ino == 0)
		return (1);
	size = DIRSIZ(!newinofmt, dp, needswap);
#	if (BYTE_ORDER == LITTLE_ENDIAN)
		if (!newinofmt && !needswap) {
#	else
		if (!newinofmt && needswap) {
#	endif
			type = dp->d_namlen;
			namlen = dp->d_type;
		} else {
			namlen = dp->d_namlen;
			type = dp->d_type;
		}
	if (iswap16(dp->d_reclen) < size ||
	    idesc->id_filesize < size ||
	    /* namlen > MAXNAMLEN || */
	    type > 15)
		return (0);
	for (cp = dp->d_name, size = 0; size < namlen; size++)
		if (*cp == '\0' || (*cp++ == '/'))
			return (0);
	if (*cp != '\0')
		return (0);
	return (1);
}

void
direrror(ino_t ino, const char *errmesg)
{

	fileerror(ino, ino, errmesg);
}

void
fileerror(ino_t cwd, ino_t ino, const char *errmesg)
{
	union dinode *dp;
	char pathbuf[MAXPATHLEN + 1];
	uint16_t mode;

	pwarn("%s ", errmesg);
	pinode(ino);
	printf("\n");
	getpathname(pathbuf, sizeof(pathbuf), cwd, ino);
	if (ino < ROOTINO || ino > maxino) {
		pfatal("NAME=%s\n", pathbuf);
		return;
	}
	dp = ginode(ino);
	if (ftypeok(dp)) {
		mode = DIP(dp, mode);
		pfatal("%s=%s\n",
		    (iswap16(mode) & IFMT) == IFDIR ? "DIR" : "FILE", pathbuf);
	}
	else
		pfatal("NAME=%s\n", pathbuf);
}

void
adjust(struct inodesc *idesc, int lcnt)
{
	union dinode *dp;
	int16_t nlink;
	int saveresolved;

	dp = ginode(idesc->id_number);
	nlink = iswap16(DIP(dp, nlink));
	if (nlink == lcnt) {
		/*
		 * If we have not hit any unresolved problems, are running
		 * in preen mode, and are on a file system using soft updates,
		 * then just toss any partially allocated files.
		 */
		if (resolved && preen && usedsoftdep) {
			clri(idesc, "UNREF", 1);
			return;
		} else {
			/*
			 * The file system can be marked clean even if
			 * a file is not linked up, but is cleared.
			 * Hence, resolved should not be cleared when
			 * linkup is answered no, but clri is answered yes.
			 */
			saveresolved = resolved;
			if (linkup(idesc->id_number, (ino_t)0, NULL) == 0) {
				resolved = saveresolved;
				clri(idesc, "UNREF", 0);
				return;
			}
			/*
			 * Account for the new reference created by linkup().
			 */
			dp = ginode(idesc->id_number);
			lcnt--;
		}
	}
	if (lcnt != 0) {
		pwarn("LINK COUNT %s", (lfdir == idesc->id_number) ? lfname :
			((iswap16(DIP(dp, mode)) & IFMT) == IFDIR ?
			"DIR" : "FILE"));
		pinode(idesc->id_number);
		printf(" COUNT %d SHOULD BE %d",
			nlink, nlink - lcnt);
		if (preen || usedsoftdep) {
			if (lcnt < 0) {
				printf("\n");
				pfatal("LINK COUNT INCREASING");
			}
			if (preen)
				printf(" (ADJUSTED)\n");
		}
		if (preen || reply("ADJUST") == 1) {
			DIP_SET(dp, nlink, iswap16(nlink - lcnt));
			inodirty();
		} else 
			markclean = 0;
	}
}

static int
mkentry(struct inodesc *idesc)
{
	struct direct *dirp = idesc->id_dirp;
	struct direct newent;
	int newlen, oldlen;

	newent.d_namlen = strlen(idesc->id_name);
	newlen = DIRSIZ(0, &newent, 0);
	if (dirp->d_ino != 0)
		oldlen = DIRSIZ(0, dirp, 0);
	else
		oldlen = 0;
	if (iswap16(dirp->d_reclen) - oldlen < newlen)
		return (KEEPON);
	newent.d_reclen = iswap16(iswap16(dirp->d_reclen) - oldlen);
	dirp->d_reclen = iswap16(oldlen);
	dirp = (struct direct *)(((char *)dirp) + oldlen);
	/* ino to be entered is in id_parent */
	dirp->d_ino = iswap32(idesc->id_parent);
	dirp->d_reclen = newent.d_reclen;
	if (newinofmt)
		dirp->d_type = inoinfo(idesc->id_parent)->ino_type;
	else
		dirp->d_type = 0;
	dirp->d_namlen = newent.d_namlen;
	memmove(dirp->d_name, idesc->id_name, (size_t)newent.d_namlen + 1);
#	if (BYTE_ORDER == LITTLE_ENDIAN)
		/*
		 * If the entry was split, dirscan() will only reverse the byte
		 * order of the original entry, and not the new one, before
		 * writing it back out.  So, we reverse the byte order here if
		 * necessary.
		 */
		if (oldlen != 0 && !newinofmt && !doinglevel2 && !needswap) {
#	else
		if (oldlen != 0 && !newinofmt && !doinglevel2 && needswap) {
#	endif
			u_char tmp;

			tmp = dirp->d_namlen;
			dirp->d_namlen = dirp->d_type;
			dirp->d_type = tmp;
		}
	return (ALTERED|STOP);
}

static int
chgino(struct inodesc *idesc)
{
	struct direct *dirp = idesc->id_dirp;

	if (memcmp(dirp->d_name, idesc->id_name, (int)dirp->d_namlen + 1))
		return (KEEPON);
	dirp->d_ino = iswap32(idesc->id_parent);
	if (newinofmt)
		dirp->d_type = inoinfo(idesc->id_parent)->ino_type;
	else
		dirp->d_type = 0;
	return (ALTERED|STOP);
}

int
linkup(ino_t orphan, ino_t parentdir, char *name)
{
	union dinode *dp;
	int lostdir;
	ino_t oldlfdir;
	struct inodesc idesc;
	char tempname[BUFSIZ];
	int16_t nlink;
	uint16_t mode;

	memset(&idesc, 0, sizeof(struct inodesc));
	dp = ginode(orphan);
	mode = iswap16(DIP(dp, mode));
	nlink = iswap16(DIP(dp, nlink));
	lostdir = (mode & IFMT) == IFDIR;
	pwarn("UNREF %s ", lostdir ? "DIR" : "FILE");
	pinode(orphan);
	if (preen  && DIP(dp, size) == 0)
		return (0);
	if (preen)
		printf(" (RECONNECTED)\n");
	else
		if (reply("RECONNECT") == 0) {
			markclean = 0;
			return (0);
		}
	if (parentdir != 0)
		inoinfo(parentdir)->ino_linkcnt++;
	if (lfdir == 0) {
		dp = ginode(ROOTINO);
		idesc.id_name = lfname;
		idesc.id_type = DATA;
		idesc.id_func = findino;
		idesc.id_number = ROOTINO;
		if ((ckinode(dp, &idesc) & FOUND) != 0) {
			lfdir = idesc.id_parent;
		} else {
			pwarn("NO lost+found DIRECTORY");
			if (preen || reply("CREATE")) {
				lfdir = allocdir(ROOTINO, (ino_t)0, lfmode);
				if (lfdir != 0) {
					if (makeentry(ROOTINO, lfdir, lfname) != 0) {
						numdirs++;
						if (preen)
							printf(" (CREATED)\n");
					} else {
						freedir(lfdir, ROOTINO);
						lfdir = 0;
						if (preen)
							printf("\n");
					}
				}
				if (lfdir != 0) {
					reparent(lfdir, ROOTINO);
				}
			}
		}
		if (lfdir == 0) {
			pfatal("SORRY. CANNOT CREATE lost+found DIRECTORY\n\n");
			markclean = 0;
			return (0);
		}
	}
	dp = ginode(lfdir);
	mode = DIP(dp, mode);
	mode = iswap16(mode);
	if ((mode & IFMT) != IFDIR) {
		pfatal("lost+found IS NOT A DIRECTORY");
		if (reply("REALLOCATE") == 0) {
			markclean = 0;
			return (0);
		}
		oldlfdir = lfdir;
		lfdir = allocdir(ROOTINO, (ino_t)0, lfmode);
		if (lfdir == 0) {
			pfatal("SORRY. CANNOT CREATE lost+found DIRECTORY\n\n");
			markclean = 0;
			return (0);
		}
		if ((changeino(ROOTINO, lfname, lfdir) & ALTERED) == 0) {
			pfatal("SORRY. CANNOT CREATE lost+found DIRECTORY\n\n");
			markclean = 0;
			return (0);
		}
		inodirty();
		reparent(lfdir, ROOTINO);
		idesc.id_type = ADDR;
		idesc.id_func = pass4check;
		idesc.id_number = oldlfdir;
		adjust(&idesc, inoinfo(oldlfdir)->ino_linkcnt + 1);
		inoinfo(oldlfdir)->ino_linkcnt = 0;
		dp = ginode(lfdir);
	}
	if (inoinfo(lfdir)->ino_state != DFOUND) {
		pfatal("SORRY. NO lost+found DIRECTORY\n\n");
		markclean = 0;
		return (0);
	}
	(void)lftempname(tempname, orphan);
	if (makeentry(lfdir, orphan, (name ? name : tempname)) == 0) {
		pfatal("SORRY. NO SPACE IN lost+found DIRECTORY");
		printf("\n\n");
		markclean = 0;
		return (0);
	}
	inoinfo(orphan)->ino_linkcnt--;
	if (lostdir) {
		if ((changeino(orphan, "..", lfdir) & ALTERED) == 0 &&
		    parentdir != (ino_t)-1)
			(void)makeentry(orphan, lfdir, "..");
		dp = ginode(lfdir);
		nlink = DIP(dp, nlink);
		DIP_SET(dp, nlink, iswap16(iswap16(nlink) + 1));
		inodirty();
		inoinfo(lfdir)->ino_linkcnt++;
		reparent(orphan, lfdir);
		pwarn("DIR I=%llu CONNECTED. ", (unsigned long long)orphan);
		if (parentdir != (ino_t)-1)
			printf("PARENT WAS I=%llu\n",
			    (unsigned long long)parentdir);
		if (preen == 0)
			printf("\n");
	}
	return (1);
}

/*
 * fix an entry in a directory.
 */
int
changeino(ino_t dir, const char *name, ino_t newnum)
{
	struct inodesc idesc;

	memset(&idesc, 0, sizeof(struct inodesc));
	idesc.id_type = DATA;
	idesc.id_func = chgino;
	idesc.id_number = dir;
	idesc.id_fix = DONTKNOW;
	idesc.id_name = name;
	idesc.id_parent = newnum;	/* new value for name */
	return (ckinode(ginode(dir), &idesc));
}

/*
 * make an entry in a directory
 */
int
makeentry(ino_t parent, ino_t ino, const char *name)
{
	union dinode *dp;
	struct inodesc idesc;
	char pathbuf[MAXPATHLEN + 1];
	
	if (parent < ROOTINO || parent >= maxino ||
	    ino < ROOTINO || ino >= maxino)
		return (0);
	memset(&idesc, 0, sizeof(struct inodesc));
	idesc.id_type = DATA;
	idesc.id_func = mkentry;
	idesc.id_number = parent;
	idesc.id_parent = ino;	/* this is the inode to enter */
	idesc.id_fix = DONTKNOW;
	idesc.id_name = name;
	dp = ginode(parent);
	if (iswap64(DIP(dp, size)) % dirblksiz) {
		DIP_SET(dp, size,
		    iswap64(roundup(iswap64(DIP(dp, size)), dirblksiz)));
		inodirty();
	}
	if ((ckinode(dp, &idesc) & ALTERED) != 0)
		return (1);
	getpathname(pathbuf, sizeof(pathbuf), parent, parent);
	dp = ginode(parent);
	if (expanddir(dp, pathbuf) == 0)
		return (0);
	return (ckinode(dp, &idesc) & ALTERED);
}

/*
 * Attempt to expand the size of a directory
 */
static int
expanddir(union dinode *dp, char *name)
{
	daddr_t lastbn, newblk, dirblk;
	struct bufarea *bp;
	char *cp;
#if DIRBLKSIZ > APPLEUFS_DIRBLKSIZ
	char firstblk[DIRBLKSIZ];
#else
	char firstblk[APPLEUFS_DIRBLKSIZ];
#endif
	struct ufs1_dinode *dp1 = NULL;
	struct ufs2_dinode *dp2 = NULL;

	if (is_ufs2)
		dp2 = &dp->dp2;
	else
		dp1 = &dp->dp1;

	lastbn = lblkno(sblock, iswap64(DIP(dp, size)));
	if (lastbn >= NDADDR - 1 || DIP(dp, db[lastbn]) == 0 ||
	    DIP(dp, size) == 0)
		return (0);
	if ((newblk = allocblk(sblock->fs_frag)) == 0)
		return (0);
	if (is_ufs2) {
		dp2->di_db[lastbn + 1] = dp2->di_db[lastbn];
		dp2->di_db[lastbn] = iswap64(newblk);
		dp2->di_size = iswap64(iswap64(dp2->di_size)+sblock->fs_bsize);
		dp2->di_blocks = iswap64(iswap64(dp2->di_blocks) +
		    btodb(sblock->fs_bsize));
		dirblk = iswap64(dp2->di_db[lastbn + 1]);
	} else {
		dp1->di_db[lastbn + 1] = dp1->di_db[lastbn];
		dp1->di_db[lastbn] = iswap32((int32_t)newblk);
		dp1->di_size = iswap64(iswap64(dp1->di_size)+sblock->fs_bsize);
		dp1->di_blocks = iswap32(iswap32(dp1->di_blocks) +
		    btodb(sblock->fs_bsize));
		dirblk = iswap32(dp1->di_db[lastbn + 1]);
	}
	bp = getdirblk(dirblk, sblksize(sblock, DIP(dp, size), lastbn + 1));
	if (bp->b_errs)
		goto bad;
	memmove(firstblk, bp->b_un.b_buf, dirblksiz);
	bp = getdirblk(newblk, sblock->fs_bsize);
	if (bp->b_errs)
		goto bad;
	memmove(bp->b_un.b_buf, firstblk, dirblksiz);
	emptydir.dot_reclen = iswap16(dirblksiz);
	for (cp = &bp->b_un.b_buf[dirblksiz];
	     cp < &bp->b_un.b_buf[sblock->fs_bsize];
	     cp += dirblksiz)
		memmove(cp, &emptydir, sizeof emptydir);
	dirty(bp);
	bp = getdirblk(dirblk, sblksize(sblock, DIP(dp, size), lastbn + 1));
	if (bp->b_errs)
		goto bad;
	memmove(bp->b_un.b_buf, &emptydir, sizeof emptydir);
	pwarn("NO SPACE LEFT IN %s", name);
	if (preen)
		printf(" (EXPANDED)\n");
	else if (reply("EXPAND") == 0)
		goto bad;
	dirty(bp);
	inodirty();
	return (1);
bad:
	if (is_ufs2) {
		dp2->di_db[lastbn] = dp2->di_db[lastbn + 1];
		dp2->di_db[lastbn + 1] = 0;
		dp2->di_size = iswap64(iswap64(dp2->di_size)-sblock->fs_bsize);
		dp2->di_blocks = iswap64(iswap64(dp2->di_blocks) -
		    btodb(sblock->fs_bsize));
	} else {
		dp1->di_db[lastbn] = dp1->di_db[lastbn + 1];
		dp1->di_db[lastbn + 1] = 0;
		dp1->di_size = iswap64(iswap64(dp1->di_size)-sblock->fs_bsize);
		dp1->di_blocks = iswap32(iswap32(dp1->di_blocks) -
		    btodb(sblock->fs_bsize));
	}
	freeblk(newblk, sblock->fs_frag);
	markclean = 0;
	return (0);
}

/*
 * allocate a new directory
 */
ino_t
allocdir(ino_t parent, ino_t request, int mode)
{
	ino_t ino;
	char *cp;
	union dinode *dp;
	struct bufarea *bp;
	struct inoinfo *inp;
	struct dirtemplate *dirp;
	daddr_t dirblk;

	ino = allocino(request, IFDIR|mode);
	if (ino < ROOTINO)
		return 0;
	dirhead.dot_reclen = iswap16(12);
	dirhead.dotdot_reclen = iswap16(dirblksiz - 12);
	odirhead.dot_reclen = iswap16(12);
	odirhead.dotdot_reclen = iswap16(dirblksiz - 12);
	odirhead.dot_namlen = iswap16(1);
	odirhead.dotdot_namlen = iswap16(2);
	if (newinofmt)
		dirp = &dirhead;
	else
		dirp = (struct dirtemplate *)&odirhead;
	dirp->dot_ino = iswap32(ino);
	dirp->dotdot_ino = iswap32(parent);
	dp = ginode(ino);
	dirblk = is_ufs2 ? iswap64(dp->dp2.di_db[0])
		    : iswap32(dp->dp1.di_db[0]);
	bp = getdirblk(dirblk, sblock->fs_fsize);
	if (bp->b_errs) {
		freeino(ino);
		return (0);
	}
	memmove(bp->b_un.b_buf, dirp, sizeof(struct dirtemplate));
	emptydir.dot_reclen = iswap16(dirblksiz);
	for (cp = &bp->b_un.b_buf[dirblksiz];
	     cp < &bp->b_un.b_buf[sblock->fs_fsize];
	     cp += dirblksiz)
		memmove(cp, &emptydir, sizeof emptydir);
	dirty(bp);
	DIP_SET(dp, nlink, iswap16(2));
	inodirty();
	if (ino == ROOTINO) {
		inoinfo(ino)->ino_linkcnt = iswap16(DIP(dp, nlink));
		cacheino(dp, ino);
		return(ino);
	}
	if (inoinfo(parent)->ino_state != DSTATE &&
	    inoinfo(parent)->ino_state != DFOUND) {
		freeino(ino);
		return (0);
	}
	cacheino(dp, ino);
	inp = getinoinfo(ino);
	inp->i_parent = parent;
	inp->i_dotdot = parent;
	inoinfo(ino)->ino_state = inoinfo(parent)->ino_state;
	if (inoinfo(ino)->ino_state == DSTATE) {
		inoinfo(ino)->ino_linkcnt = iswap16(DIP(dp, nlink));
		inoinfo(parent)->ino_linkcnt++;
	}
	dp = ginode(parent);
	DIP_SET(dp, nlink, iswap16(iswap16(DIP(dp, nlink)) + 1));
	inodirty();
	return (ino);
}
示例#25
0
//
// Create this slider's contents from list
//
void VCDockSlider::createContents(QPtrList <QString> &list)
{
  QRect rect(0, 0, 60, 200);

  for (QString* s = list.next(); s != NULL; s = list.next())
    {
      if (*s == QString("Entry"))
	{
	  s = list.prev();
	  break;
	}
      else if (*s == QString("Name"))
	{
	  setCaption(*(list.next()));
	}
      else if (*s == QString("Parent"))
	{
	  VCFrame* parent =
	    _app->virtualConsole()->getFrame(list.next()->toInt());

	  if (parent != NULL)
	    {
	      reparent((QFrame*)parent, 0, QPoint(0, 0), true);
	    }
	}
      else if (*s == QString("X"))
	{
	  rect.setX(list.next()->toInt());
	}
      else if (*s == QString("Y"))
	{
	  rect.setY(list.next()->toInt());
	}
      else if (*s == QString("Width"))
	{
	  rect.setWidth(list.next()->toInt());
	}
      else if (*s == QString("Height"))
	{
	  rect.setHeight(list.next()->toInt());
	}
      else if (*s == QString("Textcolor"))
	{
	  QColor qc;
	  qc.setRgb(list.next()->toUInt());
	  setPaletteForegroundColor(qc);
	}
      else if (*s == QString("Backgroundcolor"))
	{
	  QColor qc;
	  qc.setRgb(list.next()->toUInt());
	  setPaletteBackgroundColor(qc);
	}
      else if (*s == QString("Color"))
	{
	  // Backwards compatibility for slider background color
	  QString t = *(list.next());
	  int i = t.find(QString(","));
	  int r = t.left(i).toInt();
	  int j = t.find(QString(","), i + 1);
	  int g = t.mid(i+1, j-i-1).toInt();
	  int b = t.mid(j+1).toInt();
	  QColor qc(r, g, b);
	  setPaletteBackgroundColor(qc);
	}
      else if (*s == QString("Pixmap"))
	{
	  QString t;
	  t = *(list.next());
	  
	  QPixmap pm(t);
	  if (pm.isNull() == false)
	    {
	      setIconText(t);
	      unsetPalette();
	      setPaletteBackgroundPixmap(pm);
	      m_valueLabel->setBackgroundOrigin(ParentOrigin);
	      m_slider->setBackgroundOrigin(ParentOrigin);
	    }
	}
      else if (*s == QString("Frame"))
	{
	  if (*(list.next()) == Settings::trueValue())
	    {
	      setFrameStyle(KFrameStyle);
	    }
	  else
	    {
	      setFrameStyle(NoFrame);
	    }
	}
      else if (*s == QString("Font"))
	{
	  QFont f = font();
	  QString q = *(list.next());
	  f.fromString(q);
	  setFont(f);
	}
      else if (*s == QString("Bus"))
	{
	  QString t = *(list.next());
	  t_bus_value value;
	  if (Bus::value(t.toInt(), value))
	    {
	      setBusID(t.toInt());
	    }
	}
      else if (*s == QString("BusLowLimit"))
	{
	  m_busLowLimit = list.next()->toInt();
	}
      else if (*s == QString("BusHighLimit"))
	{
	  m_busHighLimit = list.next()->toInt();
	}
      else if (*s == QString("Channels"))
	{
	  QString t;

	  unsigned int i = 0;
	  int j = 0;

	  s = list.next();

	  while (i < s->length())
	    {
	      j = s->find(QChar(' '), i, false);
	      if (j == -1)
		{
		  j = s->length();
		}

	      t = s->mid(i, j-i);
	      
	      // Check for duplicates
	      if (m_channels.find(t.toInt()) == m_channels.end())
		{
		  m_channels.append(t.toInt());
		}
	      
	      i = j + 1;
	    }
	}
      else if (*s == QString("LevelLowLimit"))
	{
	  m_levelLowLimit = list.next()->toInt();
	}
      else if (*s == QString("LevelHighLimit"))
	{
	  m_levelHighLimit = list.next()->toInt();
	}
      else if (*s == QString("Mode"))
	{
	  QString t = *list.next();
	  if (t == modeString(Speed))
	    {
	      m_mode = Speed;
	    }
	  else if (t == modeString(Level))
	    {
	      m_mode = Level;
	    }
	  else
	    {
	      m_mode = Submaster;
	    }
	}
      else if (*s == QString("Value"))
	{
	  m_slider->setValue(list.next()->toInt());
	}
      else
	{
	  // Unknown keyword, ignore
	  *list.next();
	}
    }

  setLevelRange(m_levelLowLimit, m_levelHighLimit);
  setBusRange(m_busLowLimit, m_busHighLimit);
  setGeometry(rect);

  if (m_mode == Submaster)
    {
      assignSubmasters(true);
    }

  setMode(m_mode);
}
示例#26
0
bool Overlay::event(QEvent* event)
{
	if (event->type() == QEvent::ParentChange)
		reparent();
	return QLabel::event(event);
}
示例#27
0
void MainWindow::changeSetting()
{
    m_toggleDockingAction->setChecked(ScimKdeSettings::dockingToPanelApplet());
    toggleDocking(true); //retrieve the m_mode first

    if(m_mode == StandAlone)
    {
        //re-initialize embed if next time toggle to that docking mode
        m_embedInitialized = false;

        setName("mainWindow");
        reparent(0, Qt::WStyle_Customize | Qt::WX11BypassWM | Qt::WStyle_StaysOnTop,
                 ScimKdeSettings::mainWindow_Position(),false);

        m_moveHandle->show();
        setFrameStyle( QFrame::PopupPanel | QFrame::Raised );
        //if margin is 0, the frame can not be drawn correctly, frameWidth() is
        // sometimes too big (>1 and the main m_toolbar is not so decent), so
        // just fix it to 1
        m_mainWindowLayout->setMargin(1);
        setBackgroundOrigin(QWidget::WindowOrigin);
    }
    else
    {
        //change name so that it won't be listed in the composite management page
        setName("mainWindow_embedded");
        setWFlags(Qt::WStyle_Customize);

        m_moveHandle->hide();
        setFrameStyle( QFrame::NoFrame );
        m_mainWindowLayout->setMargin(0);
        setBackgroundOrigin(QWidget::AncestorOrigin);
        setBackgroundMode(QWidget::X11ParentRelative);
    }

    m_autoHideTimeout = ScimKdeSettings::hide_Timeout() * 1000;
    m_alwaysShow = ScimKdeSettings::always_Show();
    m_autoSnap = ScimKdeSettings::auto_Snap();
    requestReloadSelf();

    if( m_alwaysShow && m_autoHideTimeout > 0 && m_mode == StandAlone) {
        if(!m_autoHideTimeoutTimer)
        {
            m_autoHideTimeoutTimer = new QTimer(this);
            connect( m_autoHideTimeoutTimer, SIGNAL( timeout() ), this, SLOT( hideToolbar() ) );
        }
    } else {
        if(m_autoHideTimeoutTimer)
            m_autoHideTimeoutTimer->deleteLater();
        m_autoHideTimeoutTimer = 0;
        m_toolbar->show();
        if(m_mode == StandAlone)
            m_moveHandle->show();
    }

    m_alwaysShowHandle = ScimKdeSettings::alwaysShowHandle();

    m_alwaysShowExtensionHandle = ScimKdeSettings::alwaysShowExtensionHandle();

    if(m_mode == PanelEmbedded)
    {
        //init m_alwaysShowHandle option support timer
        if(m_alwaysShowHandle)
        {
            if(m_showHandleTimer)
                m_showHandleTimer->deleteLater();
            m_showHandleTimer = 0;
        }
        else
        {
            if(!m_showHandleTimer)
            {
                m_showHandleTimer = new QTimer(this);
                connect(m_showHandleTimer, SIGNAL(timeout()), this, SLOT(showHandleRequest()));
            }
        }

        //init m_alwaysShowExtensionHandle option support timer
        if(m_alwaysShowExtensionHandle)
        {
            if(m_showExtHandleTimer)
                m_showExtHandleTimer->deleteLater();
            m_showExtHandleTimer = 0;
            if(m_embeddedAreaSize.isValid())  //only reset m_toolbar size if m_embeddedAreaSize is set before
                resetToolbarSize(m_embeddedAreaSize);
        }
        else
        {
            if(!m_showExtHandleTimer)
            {
                m_showExtHandleTimer = new QTimer(this);
                connect(m_showExtHandleTimer, SIGNAL(timeout()), this, SLOT(showExtHandleRequest()));
            }
        }

        initEmbedPanel();
    }

    if(m_mode == StandAlone)
    {
        if(m_alwaysShow)
        {
            if(m_autoHideTimeoutTimer && !m_logo)
            {
                m_logo = new QLabel(this);
                m_logo->setPixmap(KGlobal::iconLoader()->loadIcon("skim", KIcon::Toolbar));
                m_mainWindowLayout->addWidget(m_logo);
                m_logo->hide();
            }
            QTimer::singleShot(0, this, SLOT(show()));//FIXME
        } else if(m_panelTurnedOn)
            QTimer::singleShot(0, this, SLOT(show()));//FIXME

        if((!m_alwaysShow || !m_autoHideTimeoutTimer) && m_logo)
        {
            m_logo->deleteLater();
            m_logo = 0;
        }

        UPDATE_WINDOW_OPACITY(this);
    }

    if(m_mode == StandAlone || (!ScimKdeSettings::force_LeftToRight_In_Kicker() && m_mode == PanelEmbedded))
        changeDirection((QBoxLayout::Direction)(ScimKdeSettings::mainWindow_Direction()));
    else
        changeDirection(QBoxLayout::LeftToRight);

    if(m_mode == StandAlone || (!m_alwaysShowExtensionHandle && m_mode == PanelEmbedded))
    {
        resetToolbarSize();
    }
}
示例#28
0
文件: vcbutton.cpp 项目: speakman/qlc
void VCButton::createContents(QPtrList <QString> &list)
{
  QRect rect(30, 30, 30, 30);

  for (QString* s = list.next(); s != NULL; s = list.next())
    {
      if (*s == QString("Entry"))
	{
	  s = list.prev();
	  break;
	}
      else if (*s == QString("Name"))
	{
	  setCaption(*(list.next()));
	}
      else if (*s == QString("Parent"))
	{
	  VCFrame* parent =
	    _app->virtualConsole()->getFrame(list.next()->toInt());
	  if (parent != NULL)
	    {
	      reparent((QWidget*)parent, 0, QPoint(0, 0), true);
	    }

	  // each Button should set
	  if (parent->buttonBehaviour() == VCFrame::Exclusive)
	    {
	      setExclusive(true);
	    }
	  else
	    {
	      setExclusive(false);
	    }
	}
      else if (*s == QString("X"))
	{
	  rect.setX(list.next()->toInt());
	}
      else if (*s == QString("Y"))
	{
	  rect.setY(list.next()->toInt());
	}
      else if (*s == QString("Width"))
	{
	  rect.setWidth(list.next()->toInt());
	}
      else if (*s == QString("Height"))
	{
	  rect.setHeight(list.next()->toInt());
	}
      else if (*s == QString("Textcolor"))
	{
	  QColor qc;
	  qc.setRgb(list.next()->toUInt());
	  setPaletteForegroundColor(qc);
	}
      else if (*s == QString("Backgroundcolor"))
	{
	  QColor qc;
	  qc.setRgb(list.next()->toUInt());
	  setPaletteBackgroundColor(qc);
	}
      else if (*s == QString("Color"))
	{
	  // Backwards compatibility for button background color
	  QString t = *(list.next());
	  int i = t.find(QString(","));
	  int r = t.left(i).toInt();
	  int j = t.find(QString(","), i + 1);
	  int g = t.mid(i+1, j-i-1).toInt();
	  int b = t.mid(j+1).toInt();
	  QColor qc(r, g, b);
	  setPaletteBackgroundColor(qc);
	}
      else if (*s == QString("Pixmap"))
	{
	  QString t;
	  t = *(list.next());
	  
	  QPixmap pm(t);
	  if (pm.isNull() == false)
	    {
	      setIconText(t);
	      setPaletteBackgroundPixmap(pm);
	    }
	}
      else if (*s == QString("Font"))
	{
	  QFont f = font();
	  QString q = *(list.next());
	  f.fromString(q);
	  setFont(f);
	}
      else if (*s == QString("Function"))
	{
	  attachFunction(list.next()->toInt());
	}
      else if (*s == QString("BindKey"))
	{
	  assert(m_keyBind);
	  QString t = *(list.next());
	  m_keyBind->setKey(t.toInt());
	}
      else if (*s == QString("BindMod"))
	{
	  assert(m_keyBind);
	  QString t = *(list.next());
	  m_keyBind->setMod(t.toInt());
	}
      else if (*s == QString("BindPress"))
	{
	  assert(m_keyBind);
	  QString t = *(list.next());
	  m_keyBind->setPressAction((KeyBind::PressAction) t.toInt());
	}
      else if (*s == QString("BindRelease"))
	{
	  assert(m_keyBind);
	  QString t = *(list.next());
	  m_keyBind->setReleaseAction((KeyBind::ReleaseAction) t.toInt());
	}
      else
	{
	  // Unknown keyword, ignore
	  *list.next();
	}
    }

  setGeometry(rect);
}
示例#29
0
void QWidget::setWindowState(uint newstate)
{
    in_show_maximized = 1;
    bool resized = testWFlags( WState_Resized );
    uint oldstate = effectiveState(widget_state);

    widget_state &= ~(WState_Minimized | WState_Maximized | WState_FullScreen);
    if (newstate & WindowMinimized)
	widget_state |= WState_Minimized;
    if (newstate & WindowMaximized)
	widget_state |= WState_Maximized;
    if (newstate & WindowFullScreen)
	widget_state |= WState_FullScreen;

    uint state = effectiveState(widget_state);

    bool needShow = FALSE;
    if (isTopLevel() && state != oldstate) {
	createTLExtra();
	if ( oldstate == 0 ) { //normal
	    topData()->normalGeometry = geometry();
	} else if ( oldstate == WState_FullScreen ) {
	    reparent( 0, topData()->savedFlags, QPoint(0,0) );
	    needShow = isVisible();
	} else if ( oldstate == WState_Minimized ) {
	    needShow = TRUE;
	}

	if ( state == WState_Minimized ) {
	    //### not ideal...
	    hide();
	    needShow = FALSE;
	} else if ( state == WState_FullScreen ) {
	    needShow = needShow || isVisible();
	    topData()->savedFlags = getWFlags();
	    reparent( 0, WType_TopLevel | WStyle_Customize | WStyle_NoBorder |
		      // preserve some widget flags
		      (getWFlags() & 0xffff0000),
		      QPoint( 0, 0));
	    const QRect screen = qApp->desktop()->screenGeometry( qApp->desktop()->screenNumber( this ) );
	    move( screen.topLeft() );
	    resize( screen.size() );
	    if ( !resized )
		clearWState( WState_Resized );
	    raise();
	} else if ( state == WState_Maximized ) {
#ifndef QT_NO_QWS_MANAGER
	    if ( extra && extra->topextra && extra->topextra->qwsManager )
		extra->topextra->qwsManager->maximize();
	    else
#endif
		setGeometry( qt_maxWindowRect );
	    if ( !resized )
		clearWState( WState_Resized );
	} else { //normal
	    QRect r = topData()->normalGeometry;
	    if ( r.width() >= 0 ) {
		topData()->normalGeometry = QRect(0,0,-1,-1);
		setGeometry( r );
	    }
	}
    }

    in_show_maximized = 0;

    if (needShow)
	show();

    if (newstate & WindowActive)
	setActiveWindow();

    QEvent e(QEvent::WindowStateChange);
    QApplication::sendEvent(this, &e);
}
示例#30
0
void Viewport::init(FXComposite* p, FXGLVisual *vis, const char* title, bool bottomToolbar)
{
	PM = PatchMgr::getInstance();
	
	FXVerticalFrame *vf = new FXVerticalFrame(p, LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN);
	vf->setPadLeft(0);
	vf->setPadTop(0);
	vf->setPadRight(0);
	vf->setPadBottom(0);
	vf->setHSpacing(0);
	vf->setVSpacing(0);

	if (bottomToolbar)
		reparent(vf);

	sideToolbar = new FXHorizontalFrame(vf,LAYOUT_SIDE_TOP|LAYOUT_FILL_X,0,0,0,0, 0,0,0,0, 0,0);

	if (!bottomToolbar)
		reparent(vf);

	new FXLabel(sideToolbar,title,NULL,LAYOUT_LEFT);

	butCPoints		= new FXToggleButton(sideToolbar,"\tPunti di controllo\tMostra o nasconde tutti i punti di controllo.", NULL, new FXGIFIcon(getApp(),IconCpoints_off), new FXGIFIcon(getApp(),IconCpoints), this, ID_CONTROL_POINTS ,FRAME_RAISED|LAYOUT_TOP|LAYOUT_RIGHT|TOGGLEBUTTON_TOOLBAR);
  butCPolygon		= new FXToggleButton(sideToolbar,"\tPoligono di controllo\tMostra o nasconde tutti i poligoni di controllo.", NULL, new FXGIFIcon(getApp(),IconCpoly_off),new FXGIFIcon(getApp(),IconCpoly), this, ID_CONTROL_POLYGON,FRAME_RAISED|LAYOUT_TOP|LAYOUT_RIGHT|TOGGLEBUTTON_TOOLBAR);
  butPatch			= new FXToggleButton(sideToolbar,"\tSuperficie Patch\tMostra o nasconde la superficie di tutte le patch.", NULL, new FXGIFIcon(getApp(),IconDpatch_off), new FXGIFIcon(getApp(),IconDpatch), this,ID_PATCH,FRAME_RAISED|LAYOUT_TOP|LAYOUT_RIGHT|TOGGLEBUTTON_TOOLBAR);

  TOOLBAR_SEPARATOR(sideToolbar);

  butSnapToGrid	= new FXToggleButton(sideToolbar,"\tBlocca alla grigla\tSe attivato permette di muovere i punti solo lungo la griglia.", NULL, new FXGIFIcon(getApp(),IconSnap_off), new FXGIFIcon(getApp(),IconSnap), this,ID_SNAP,FRAME_RAISED|LAYOUT_TOP|LAYOUT_RIGHT|TOGGLEBUTTON_TOOLBAR);
  butCullFace 	= new FXToggleButton(sideToolbar,"\tCull faces\tSe attivato rimuove le facce posteriori.", NULL, new FXGIFIcon(getApp(),IconCull_off), new FXGIFIcon(getApp(),IconCull), this, ID_CULL, FRAME_RAISED|LAYOUT_TOP|LAYOUT_RIGHT|TOGGLEBUTTON_TOOLBAR);
  butGridMinus  = new FXToggleButton(sideToolbar,"\tDiminuisci griglia\tDiminuisce la tassellazione della griglia.", NULL, new FXGIFIcon(getApp(),IconMinus), new FXGIFIcon(getApp(),IconMinus), this, ID_GRID_MINUS, FRAME_RAISED|LAYOUT_TOP|LAYOUT_RIGHT|TOGGLEBUTTON_TOOLBAR);
  butGridPlus   = new FXToggleButton(sideToolbar,"\tAumenta griglia\tAumenta la tassellazione della griglia.", NULL, new FXGIFIcon(getApp(),IconPlus), new FXGIFIcon(getApp(),IconPlus), this, ID_GRID_PLUS, FRAME_RAISED|LAYOUT_TOP|LAYOUT_RIGHT|TOGGLEBUTTON_TOOLBAR);
  butSolid      = new FXToggleButton(sideToolbar,"\tMostra la patch piena o in wireframe\tMostra la patch piena o in wireframe.", NULL, new FXGIFIcon(getApp(),IconSolid_off), new FXGIFIcon(getApp(),IconSolid), this, ID_SOLID, FRAME_RAISED|LAYOUT_TOP|LAYOUT_RIGHT|TOGGLEBUTTON_TOOLBAR);
  butTexture    = new FXToggleButton(sideToolbar,"\tMostra o nasconde le textures\tMostra o nasconde le textures.", NULL, new FXGIFIcon(getApp(),IconTex_off), new FXGIFIcon(getApp(),IconTex), this, ID_TEXTURE, FRAME_RAISED|LAYOUT_TOP|LAYOUT_RIGHT|TOGGLEBUTTON_TOOLBAR);
  butShowGrid   = new FXToggleButton(sideToolbar,"\tMostra o nasconde la griglia\tMostra o nasconde la griglia.", NULL, new FXGIFIcon(getApp(),IconGrid_off), new FXGIFIcon(getApp(),IconGrid), this, ID_SHOW_GRID, FRAME_RAISED|LAYOUT_TOP|LAYOUT_RIGHT|TOGGLEBUTTON_TOOLBAR);

  TOOLBAR_SEPARATOR(sideToolbar);
  
  butCameraTrackball  = new FXToggleButton(sideToolbar,"\tTrackball\tControllo telecamera con trackball.", "\tTelecamera\tControllo telecamera libero.", new FXGIFIcon(getApp(),IconTrackball),new FXGIFIcon(getApp(),IconCam), this, ID_CAMERA_TRACKBALL,FRAME_RAISED|LAYOUT_TOP|LAYOUT_RIGHT|TOGGLEBUTTON_TOOLBAR);

  butCullFace->hide();
  butShowGrid->hide();
  butSolid->hide();
  butTexture->hide();
  butCameraTrackball->hide();
  

  dragCursor = getApp()->getDefaultCursor(DEF_CROSSHAIR_CURSOR);

  Operation = OP_IDLE;
  Tool = TOOL_SELECTOR;

  reproject = true;
  LeftBtn = false;
  RightBtn = false;

  zoom = 50.0f;
  xpos = 0.0f;
  ypos = 0.0f;

  gridSize = 1.0f; 

}