#include <stdlib.h>
#include <string.h>
+
+#define PANE_DATA_TYPE struct crop_data
+
#include "core.h"
struct crop_data {
struct mark *start safe;
struct mark *end safe;
};
+#include "core-pane.h"
static bool in_range(struct mark *m, struct crop_data *cd safe)
{
DEF_CMD(crop_close)
{
- struct crop_data *cd = ci->home->data;
+ struct crop_data *cd = &ci->home->data;
mark_free(cd->start);
mark_free(cd->end);
DEF_CMD(crop_write)
{
struct pane *p = ci->home->parent;
- struct crop_data *cd = ci->home->data;
+ struct crop_data *cd = &ci->home->data;
return home_call(p, ci->key, ci->focus, ci->num,
ci->mark ?: cd->start,
int num, int num2, const char *key safe)
{
struct pane *p = home->parent;
- struct crop_data *cd = home->data;
+ struct crop_data *cd = &home->data;
int ret;
/* Always force marks to be in range */
DEF_CMD(crop_clip)
{
- struct crop_data *cd = ci->home->data;
+ struct crop_data *cd = &ci->home->data;
mark_clip(cd->start, ci->mark, ci->mark2, !!ci->num);
mark_clip(cd->end, ci->mark, ci->mark2, !!ci->num);
DEF_CMD(crop_content)
{
- struct crop_data *cd = ci->home->data;
+ struct crop_data *cd = &ci->home->data;
struct mark *m, *m2;
int ret;
DEF_CMD(crop_generic)
{
struct pane *p = ci->home->parent;
- struct crop_data *cd = ci->home->data;
+ struct crop_data *cd = &ci->home->data;
int ret;
if (!ci->mark && !ci->mark2)
return Enoarg;
if (ci->mark->seq >= ci->mark2->seq)
return Einval;
- alloc(cd, pane);
- p = pane_register(ci->focus, 0, &crop_handle.c, cd);
- if (!p) {
- free(cd);
+ p = pane_register(ci->focus, 0, &crop_handle.c);
+ if (!p)
return Efail;
- }
+
+ cd = &p->data;
cd->start = mark_dup(ci->mark);
cd->end = mark_dup(ci->mark2);
crop_map = key_alloc();
key_add_prefix(crop_map, "doc:", &crop_generic);
key_add(crop_map, "Close", &crop_close);
- key_add(crop_map, "Free", &edlib_do_free);
key_add(crop_map, "doc:write_file", &crop_write);
key_add(crop_map, "doc:char", &crop_char);
key_add(crop_map, "doc:byte", &crop_char);