コード例 #1
0
ファイル: wtabview.c プロジェクト: crmafra/wmaker
WMTabViewItem *WMTabViewItemAtPoint(WMTabView * tPtr, int x, int y)
{
	int i;
	int count = tPtr->visibleTabs;
	int first = tPtr->firstVisible;

	if (tPtr->flags.dontFitAll) {
		i = tPtr->selectedItem - tPtr->firstVisible;
		if (i >= 0 && i < tPtr->visibleTabs
		    && isInside(positionOfTab(tPtr, tPtr->selectedItem), 0,
				W_TabViewItemTabWidth(tPtr->items[tPtr->selectedItem]), tPtr->tabHeight, x, y)) {
			return tPtr->items[tPtr->selectedItem];
		}
	} else {
		i = tPtr->selectedItem;
		if (isInside(positionOfTab(tPtr, i), 0,
			     W_TabViewItemTabWidth(tPtr->items[i]), tPtr->tabHeight, x, y)) {
			return tPtr->items[i];
		}
	}

	for (i = first; i < first + count; i++) {
		int pos;

		pos = positionOfTab(tPtr, i);
		if (isInside(pos, 0, W_TabViewItemTabWidth(tPtr->items[i]), tPtr->tabHeight, x, y)) {
			return tPtr->items[i];
		}
	}
	return NULL;
}
コード例 #2
0
static void
handleEvents(XEvent *event, void *data)
{
    TabView *tPtr = (TabView*)data;

    CHECK_CLASS(data, WC_TabView);

    switch (event->type) {
    case Expose:
        if (event->xexpose.count!=0)
            break;
        paintTabView(tPtr);
        break;

    case ButtonPress:
        if (tPtr->flags.enabled) {
            WMTabViewItem *item = WMTabViewItemAtPoint(tPtr,
                                                       event->xbutton.x,
                                                       event->xbutton.y);
            /*if (item && !item->flags.enabled)
             break;*/

            if (item && item->flags.enabled) {
                WMSelectTabViewItem(tPtr, item);
            } else if (tPtr->flags.dontFitAll) {
                int redraw = 0;
                int lastVisible = tPtr->firstVisible+tPtr->visibleTabs-1;

                if (event->xbutton.x < BUTTONED_SIDE_OFFSET) {
                    if (tPtr->firstVisible > 0) {
                        redraw = 1;
                        tPtr->firstVisible--;
                    }
                } else if (event->xbutton.x > positionOfTab(tPtr,lastVisible)){

                    if (lastVisible < tPtr->itemCount-1) {
                        redraw = 1;
                        tPtr->firstVisible++;
                    }
                }
                tPtr->visibleTabs = countVisibleTabs(tPtr, tPtr->firstVisible);
                if (redraw) {
                    paintTabView(tPtr);
                }
            }
        }
        break;

    case DestroyNotify:
        destroyTabView(tPtr);
        break;
    }
}
コード例 #3
0
ファイル: wtabview.c プロジェクト: crmafra/wmaker
static void paintTabView(TabView * tPtr)
{
	Pixmap buffer;
	WMScreen *scr = W_VIEW(tPtr)->screen;
	Display *dpy = scr->display;
	GC white = WMColorGC(scr->white);
	int i;

	if (tPtr->flags.type == WTTopTabsBevelBorder) {
		int count = tPtr->visibleTabs;
		int first = tPtr->firstVisible;
		int moreAtLeft;
		int moreAtRight;
		int selectedIsVisible;
		int ty;
		int twidth, theight;

		ty = 2;
		theight = tPtr->tabHeight;

		buffer = XCreatePixmap(dpy, W_VIEW(tPtr)->window,
				       W_VIEW(tPtr)->size.width, theight, W_VIEW(tPtr)->screen->depth);

		XFillRectangle(dpy, buffer, WMColorGC(W_VIEW(tPtr)->backColor),
			       0, 0, W_VIEW(tPtr)->size.width, tPtr->tabHeight);

		if (tPtr->flags.dontFitAll) {
			moreAtLeft = first > 0;
			moreAtRight = (first + count) < tPtr->itemCount;
			if (tPtr->selectedItem >= first && tPtr->selectedItem < first + count)
				selectedIsVisible = 1;
			else
				selectedIsVisible = 0;
		} else {
			moreAtLeft = 0;
			moreAtRight = 0;
			selectedIsVisible = 1;
		}

		if (moreAtRight) {
			drawTab(tPtr, buffer, positionOfTab(tPtr, first + count), 0,
				W_VIEW_WIDTH(tPtr->view), theight, False);
		}
		for (i = first + count - 1; i >= first; i--) {
			if (!selectedIsVisible || i != tPtr->selectedItem) {
				twidth = W_TabViewItemTabWidth(tPtr->items[i]);

				drawTab(tPtr, buffer, positionOfTab(tPtr, i), 0, twidth, theight, False);
			}
		}
		if (moreAtLeft) {
			drawTab(tPtr, buffer, positionOfTab(tPtr, 0) - 2 * BUTTONED_SIDE_OFFSET,
				0, BUTTONED_SIDE_OFFSET * 4, theight, False);
		}

		if (selectedIsVisible) {
			int idx = tPtr->selectedItem;

			drawTab(tPtr, buffer, positionOfTab(tPtr, idx),
				0, W_TabViewItemTabWidth(tPtr->items[idx]), theight, True);

			XDrawLine(dpy, buffer, white, 0, theight - 1, positionOfTab(tPtr, idx), theight - 1);

			XDrawLine(dpy, buffer, white,
				  positionOfTab(tPtr, idx) + W_TabViewItemTabWidth(tPtr->items[idx]),
				  tPtr->tabHeight - 1, W_VIEW_WIDTH(tPtr->view) - 1, tPtr->tabHeight - 1);
		} else {
			XDrawLine(dpy, buffer, white, 0, theight - 1, W_VIEW_WIDTH(tPtr->view), theight - 1);
		}

		for (i = 0; i < count; i++) {
			WMRect rect;

			rect.pos.x = 15 + positionOfTab(tPtr, first + i);
			rect.pos.y = ty;
			rect.size.width = W_TabViewItemTabWidth(tPtr->items[first + i]);
			rect.size.height = theight;
			W_DrawLabel(tPtr->items[first + i], buffer, rect,
				    tPtr->flags.enabled && tPtr->items[first + i]->flags.enabled);
		}

		if (moreAtLeft) {
			paintDot(tPtr, buffer, 4, 10);
			paintDot(tPtr, buffer, 7, 10);
			paintDot(tPtr, buffer, 10, 10);
		}
		if (moreAtRight) {
			int x;

			x = positionOfTab(tPtr, tPtr->firstVisible + tPtr->visibleTabs);

			x = x + (W_VIEW_WIDTH(tPtr->view) - x) / 2;
			paintDot(tPtr, buffer, x + 5, 10);
			paintDot(tPtr, buffer, x + 8, 10);
			paintDot(tPtr, buffer, x + 11, 10);
		}

		XCopyArea(dpy, buffer, W_VIEW(tPtr)->window, scr->copyGC, 0, 0,
			  W_VIEW_WIDTH(tPtr->view), theight, 0, 0);

		XFreePixmap(dpy, buffer);
	}
	switch (tPtr->flags.type) {
	case WTTopTabsBevelBorder:
		drawRelief(scr, W_VIEW(tPtr)->window, 0, tPtr->tabHeight - 1,
			   W_VIEW(tPtr)->size.width, W_VIEW(tPtr)->size.height - tPtr->tabHeight + 1);
		break;

	case WTNoTabsBevelBorder:
		W_DrawRelief(scr, W_VIEW(tPtr)->window, 0, 0, W_VIEW(tPtr)->size.width,
			     W_VIEW(tPtr)->size.height, WRRaised);
		break;

	case WTNoTabsLineBorder:
		W_DrawRelief(scr, W_VIEW(tPtr)->window, 0, 0, W_VIEW(tPtr)->size.width,
			     W_VIEW(tPtr)->size.height, WRSimple);
		break;

	case WTNoTabsNoBorder:
		break;
	}
}