static void tochildrecurse(btIterator *iter, bt_n* self) {
	to_child(iter, self);
	if (!iter->bln->self->leaf) { // depth-first
		GET_NEW_CHILD(iter)
		tochildrecurse(iter, NODES(iter->btr, iter->bln->self)[iter->bln->in]);
	}
}
Example #2
0
static void
offscreen_window_from_parent (GdkWindow *offscreen_window,
                              double parent_x, double parent_y,
                              double *offscreen_x, double *offscreen_y,
                              WidgetOverlay *ovl)
{
	to_child (ovl, offscreen_window, parent_x, parent_y, offscreen_x, offscreen_y);
}
Example #3
0
static void
offscreen_window_from_parent (GdkWindow     *window,
                              double         parent_x,
                              double         parent_y,
                              double        *offscreen_x,
                              double        *offscreen_y,
                              GtkRotatedBin *bin)
{
  to_child (bin, parent_x, parent_y, offscreen_x, offscreen_y);
}
Example #4
0
static GdkWindow *
pick_offscreen_child (GdkWindow     *offscreen_window,
                      double         widget_x,
                      double         widget_y,
                      GtkRotatedBin *bin)
{
 GtkAllocation child_area;
 double x, y;

 if (bin->child && gtk_widget_get_visible (bin->child))
    {
      to_child (bin, widget_x, widget_y, &x, &y);

      gtk_widget_get_allocation (bin->child, &child_area);

      if (x >= 0 && x < child_area.width &&
          y >= 0 && y < child_area.height)
        return bin->offscreen_window;
    }

  return NULL;
}
Example #5
0
static GdkWindow *
pick_offscreen_child (GdkWindow     *offscreen_window,
                      double         widget_x,
                      double         widget_y,
                      GtkMirrorBin *bin)
{
    GtkAllocation child_area;
    double x, y;

    if (bin->child && GTK_WIDGET_VISIBLE (bin->child))
    {
        to_child (bin, widget_x, widget_y, &x, &y);

        child_area = bin->child->allocation;

        if (x >= 0 && x < child_area.width &&
                y >= 0 && y < child_area.height)
            return bin->offscreen_window;
    }

    return NULL;
}
Example #6
0
static GdkWindow *
pick_offscreen_child (G_GNUC_UNUSED GdkWindow *offscreen_window,
                      double widget_x, double widget_y,
                      WidgetOverlay *ovl)
{
	GList *list;
	GdkWindow *retval = NULL;
	gboolean ign_non_tooltip = FALSE;

	//return ((ChildData*)ovl->priv->children)->offscreen_window;

	for (list = ovl->priv->children; list; list = list->next) {
		ChildData *cd = (ChildData*) list->data;
		if (cd->is_tooltip && gtk_widget_get_visible (cd->child)) {
			ign_non_tooltip = TRUE;
			break;
		}
	}

	for (list = g_list_last (ovl->priv->children); list; list = list->prev) {
		ChildData *cd = (ChildData*) list->data;
		if (!cd->ignore_events && gtk_widget_get_visible (cd->child) && (cd->alpha > 0.) &&
		    (!ign_non_tooltip || (ign_non_tooltip && cd->is_tooltip))) {
			GtkAllocation alloc;
			double x, y;
			to_child (ovl, cd->offscreen_window, widget_x, widget_y, &x, &y);
			gtk_widget_get_allocation ((GtkWidget*) cd->child, &alloc);
			if (x >= 0 && x < alloc.width &&
			    y >= 0 && y < alloc.height) {
				retval = cd->offscreen_window;
				break;
			}
		}
	}

	/*g_print ("%s() => %p\n", __FUNCTION__, retval);*/
	return retval;
}
static bool btScionFind(btSIter *siter, bt_n *x, ulong ofst, bt *btr, bool asc,
						cswc_t  *w,     long  lim) {
	int    i   = asc ? 0        : x->n;                 //DEBUG_SCION_PRE_LOOP1
	int    fin = asc ? x->n + 1 : -1;//LOOPS:(i=0,i<=x->n,i++)&(i=x->n,i>=0,i--)
	while (i != fin) {
		if (x->leaf) break;
		uint32_t scion = NODES(btr, x)[i]->scion;           //DEBUG_SCION_LOOP_1
		if (scion >= ofst) {
			bool i_end_n     = (i == siter->x.bln->self->n);
			siter->x.bln->in = i;
			siter->x.bln->ik = (i_end_n) ? i - 1 : i;  //DEBUG_SCION_LOOP_1_KID
			if (scion == ofst) {
				if (!asc) {
					siter->x.bln->in = siter->x.bln->ik = i - 1;
				}
				return 1;
			}
			siter->x.bln->child = get_new_iter_child(&siter->x);
			to_child(&siter->x, NODES(btr, x)[i]);
			bt_n *kid = NODES(btr, x)[i];          //DEBUG_SCION_LOOP_1_GOT_KID
			if (!kid->leaf) {
				btScionFind(siter, kid, ofst, btr, asc, w, lim);
				return 1;
			} else x = kid;
			break;
		} else ofst -= (scion + 1); // +1 for NODE itself
		i = asc ? i + 1 : i - 1;    // loop increment
	}
	// Now Find the rest of the OFFSET (respecting DRs)
	uint32  n    = siter->x.bln->self->n;
	i            = asc ? 0            : n - 1;
	fin          = asc ? MIN(ofst, n) : MAX(-1, (n - ofst));
	int last     = asc ? n - 1        : 0;
	ulong   cnt  = 0;
	//TODO findminnode() is too inefficient -> needs to be a part of btr
	bt_n   *minx = findminnode(btr, btr->root);
	int     btdl = btr->dirty_left;
	int     dr   = 0;                                   //DEBUG_SCION_PRE_LOOP2
	while (i != fin) {
		dr   = getDR(btr, x, i);
		cnt += dr;
		if (!i && x == minx) cnt += btdl;                   //DEBUG_SCION_LOOP2
		if (cnt >= ofst) break;
		cnt++;
		i = asc ? i + 1 : i - 1; // loop increment
	}                                              //DEBUG_SCION_OFFSET_TOO_BIG
	if      (i == fin && i == last) {
		if (cnt >= x->scion) return 0;
	}
	else if (cnt < ofst)                                   return 0; //OFST 2big
	siter->x.bln->ik = i;
	INIT_ITER_BEENTRY(siter, btr, x, siter->x.bln->ik);
	if (asc)  {
		if ((ofst + dr) != cnt) siter->missed = 1;
	}
	else      {
		if (!i && x == minx) {
			if (ofst != (cnt - btdl)) siter->missed = 1;
		}
		else                 {
			if (ofst != cnt)          siter->missed = 1;
		}
	}                                                  //DEBUG_SCION_POST_LOOP2
	return 1;
}