/* Free buffer space by moving the handle struct right before the useful part of its data buffer or by moving all the data. */ static void shrink_handle(struct memory_handle *h) { size_t delta; if (!h) return; if (h->next && h->filerem == 0 && (h->type == TYPE_ID3 || h->type == TYPE_CUESHEET || h->type == TYPE_BITMAP || h->type == TYPE_CODEC || h->type == TYPE_ATOMIC_AUDIO)) { /* metadata handle: we can move all of it */ uintptr_t handle_distance = ringbuf_sub(ringbuf_offset(h->next), h->data); delta = handle_distance - h->available; /* The value of delta might change for alignment reasons */ if (!move_handle(&h, &delta, h->available, h->type==TYPE_CODEC)) return; size_t olddata = h->data; h->data = ringbuf_add(h->data, delta); h->ridx = ringbuf_add(h->ridx, delta); h->widx = ringbuf_add(h->widx, delta); if (h->type == TYPE_ID3 && h->filesize == sizeof(struct mp3entry)) { /* when moving an mp3entry we need to readjust its pointers. */ adjust_mp3entry((struct mp3entry *)&buffer[h->data], (void *)&buffer[h->data], (const void *)&buffer[olddata]); } else if (h->type == TYPE_BITMAP) { /* adjust the bitmap's pointer */ struct bitmap *bmp = (struct bitmap *)&buffer[h->data]; bmp->data = &buffer[h->data + sizeof(struct bitmap)]; } } else { /* only move the handle struct */ delta = ringbuf_sub(h->ridx, h->data); if (!move_handle(&h, &delta, 0, true)) return; h->data = ringbuf_add(h->data, delta); h->start = ringbuf_add(h->start, delta); h->available -= delta; h->offset += delta; } }
static gboolean on_trough_bg_button_press_event (ClutterActor *actor, ClutterButtonEvent *event, MxSlider *self) { MxSliderPrivate *priv = self->priv; ClutterActor *stage; if (event->button != 1) return FALSE; if (mx_widget_get_disabled (MX_WIDGET (actor))) return FALSE; move_handle (self, event->x, event->y); stage = clutter_actor_get_stage (priv->handle); /* Turn off picking for motion events */ clutter_stage_set_motion_events_enabled (CLUTTER_STAGE (stage), FALSE); priv->capture_handler = g_signal_connect_after (stage, "captured-event", G_CALLBACK (on_handle_capture_event), self); return TRUE; }