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]); } }
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); }
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); }
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; }
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; }
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; }