示例#1
0
int
open_external_editor_cb(gpointer data)
{
	struct external_editor_args	*args;
	struct tab			*t;
	int				found_tab = 0;

	args = (struct external_editor_args*)data;

	/* Check if tab is still open */
	TAILQ_FOREACH(t, &tabs, entry)
		if (t == args->tab) {
			found_tab = 1;
			break;
		}

	/* Tab was deleted */
	if (!found_tab)
		goto done;

	if (update_contents(args))
		goto done;

	return (1);
done:
	/* cleanup and remove from event loop */
	g_free(args->path);
	g_free(args->cb_data);
	g_free(args);

	return (0);
}
示例#2
0
void
external_editor_closed(GPid pid, gint status, gpointer data)
{
	struct external_editor_args	*args;
	struct tab			*t;
	int				found_tab = 0;

	args = (struct external_editor_args *)data;

	TAILQ_FOREACH(t, &tabs, entry)
		if (t == args->tab) {
			found_tab = 1;
			break;
		}

	/* Tab was deleted */
	if (!found_tab)
		goto done;

	/*
	 * unfortunately we can't check the exit status in glib < 2.34,
	 * otherwise a check and warning would be nice here
	 */
	update_contents(args);

done:
	unlink(args->path);
	g_spawn_close_pid(pid);	
}
示例#3
0
static int db_write(backend_store_interface* i, const char* rel_path, const char *buf, size_t size, off_t offset,
	     uint64_t* file_handle) {
	int j;

	logger_logf(LOG(i), "rel_path = %s", rel_path);

	ERR_IF_DOESNT_EXIST(i, rel_path);
	ERR_IF_CANT_WRITE_TO_FILE(i, rel_path);

	char* contents = get_contents(rel_path);
	size_t old_size = get_size(rel_path);
	size_t new_size = (offset + size > old_size ? offset + size : old_size);

	logger_logf(LOG(i), "old_size = %ld, new_size = %ld, offset = %ld", old_size, new_size, offset);

	char new_contents[new_size];
	for (j = 0; j < offset; ++j) {
		new_contents[j] = contents[j];
	}
	for (j = offset; j < offset + size; ++j) {
		new_contents[j] = buf[j - offset];
	}
	for (j = offset; j < old_size; ++j) {
		new_contents[offset + size + offset - j] = buf[j];
	}

	update_contents(rel_path, new_contents, new_size);
	update_size(rel_path, new_size);

	free(contents);

    return size;
}
示例#4
0
static int db_truncate(backend_store_interface* i, const char* rel_path, off_t newsize) {
	int j;

	logger_logf(LOG(i), "rel_path = %s", rel_path);

	ERR_IF_DOESNT_EXIST(i, rel_path);
	ERR_IF_CANT_WRITE_TO_FILE(i, rel_path);

	char* contents = get_contents(rel_path);
	size_t current_size = get_size(rel_path);
	char buf[newsize];
	for (j = 0; j < newsize; ++j) {
		if (j < current_size) {
			buf[j] = contents[j];
		} else {
			buf[j] = '\0';
		}
	}

	update_contents(rel_path, buf, newsize);
	update_size(rel_path, newsize);

	free(contents);

    return 0;
}
示例#5
0
	void View::update(Core *c){
		if (not _is_transposed){
			_contents_frame.p.x = _frame.p.x;
			_contents_frame.p.y = _frame.p.y;
			_contents_frame.s.w = _frame.s.w;
			_contents_frame.s.h = _frame.s.h - header_height();
		}
		else{
			_contents_frame.p.y = _frame.p.x;
			_contents_frame.p.x = _frame.p.y;
			_contents_frame.s.h = _frame.s.w;
			_contents_frame.s.w = _frame.s.h - header_height();
		}

		_header_frame.p.x = _frame.p.x;
		_header_frame.p.y = _frame.p.y + _frame.s.h - header_height();
		_header_frame.s.w = _frame.s.w;
		_header_frame.s.h = header_height();

		if (not _is_transposed){
			update_contents(c);
		}
		else{
			glPushMatrix();
			double m[16] = {
				0.0, 1.0, 0.0, 0.0,
				1.0, 0.0, 0.0, 0.0,
				0.0, 0.0, 1.0, 0.0,
				0.0, 0.0, 0.0, 1.0,
			};
			glMultMatrixd(m);
			update_contents(c);
			glPopMatrix();
		}

		if (_has_header)
			update_header(c);
	}
示例#6
0
文件: reflect.c 项目: GNOME/vte
/* Handle deleted text by removing the text from our gunichar array. */
static void
text_changed_delete(AtkObject *obj, gint offset, gint length, gpointer data)
{
	int i;
	for (i = offset + length - 1; i >= offset; i--) {
		if ((guint)i > contents->len - 1) {
			g_warning("Invalid character %d was deleted.\n", i);
		}
		g_array_remove_index(contents, i);
	}
#ifdef VTE_DEBUG
	if ((getenv("REFLECT_VERBOSE") != NULL) &&
	    (atol(getenv("REFLECT_VERBOSE")) != 0)) {
		g_printerr("Deleted %d chars at %d.\n", length, offset);
	}
#endif
	update_contents(obj, GTK_WIDGET(data));
}
示例#7
0
文件: reflect.c 项目: GNOME/vte
/* Handle inserted text by inserting the text into our gunichar array. */
static void
text_changed_insert(AtkObject *obj, gint offset, gint length, gpointer data)
{
	char *inserted, *p;
	gunichar c;
	int i;

	inserted = atk_text_get_text(ATK_TEXT(obj), offset, offset + length);

	if (!g_utf8_validate(inserted, -1, NULL)) {
		g_free(inserted);
		g_error("UTF-8 validation error");
		return;
	}

	p = inserted;
	i = 0;
	while (i < length) {
		c = g_utf8_get_char(p);
		if ((guint)(offset + i) >= contents->len) {
			g_array_append_val(contents, c);
		} else {
			g_array_insert_val(contents, offset + i, c);
		}
		i++;
		p = g_utf8_next_char(p);
	}

#ifdef VTE_DEBUG
	if ((getenv("REFLECT_VERBOSE") != NULL) &&
	    (atol(getenv("REFLECT_VERBOSE")) != 0)) {
		g_printerr("Inserted %d chars ('%.*s') at %d,",
			length, (int)(p - inserted), inserted, offset);
		g_printerr(" buffer contains %d characters.\n",
			contents->len);
	}
#endif

	g_free(inserted);

	update_contents(obj, GTK_WIDGET(data));
}
示例#8
0
word do_menu(char *title, word width, word height, char *list[],
             word *result, bool(*reload)(char*, word*), char *preload )
{
    word i;
    word ev,key,mx,my;
    word currenty,currentx;
    word visible;
    word num;
    struct ws *menuw;
    char menu_so_far[MAXMENUWIDTH+1];		/* can, in theory, recurse */
    word numlist;

    if (preload==NULL)
        menu_so_far[0]=0;
    else
    {
        stccpy(menu_so_far,preload,MAXMENUWIDTH);
        strupr(menu_so_far);
    }
    currentx=strlen(menu_so_far);
    (reload)(menu_so_far,&numlist);		/* initial value */
    if (numlist==0)
    {
        *result=-1;
        return 0;
    }
    if ( (num=spare_window())==-1)
        return ERRM_NOSPARE;

    if (width>MAXMENUWIDTH)
        width=MAXMENUWIDTH;

    menuw=wlist[num];

    /* centered on screen */
    menuw->x=(maxw-width-2)/2;
    menuw->y=(maxh-height-2)/2;
    menuw->w=width+2;
    menuw->h=height+2;

    menuw->open=TRUE;
    menuw->number=num;
    menuw->type=WTYPE_DIALOG;
    menuw->magic=NULL;

    add_wlist(menuw);


    /* mark us on the screen, carefully as we are not in the wlist */
    window_cls(menuw);
    window_title2(menuw,title,FALSE);
    recalcw(menuw);
    update_rectangle(menuw->x,menuw->y,menuw->w,menuw->h);

    for (;;)
    {
p:
        visible=min(height,numlist);
        currenty=0;
        /* print the entries */
        for (i=0; i<visible; i++)
        {
            menuw->xpos=DLOGX;
            menuw->ypos=i+1;
            wprint_str(list[i]);
        }
k:
        if (visible)
            light_line(currenty,(word)(currentx+1),(word)(width-currentx-1));
        else
            light_line(currenty,1,(word)(width-1));

        ev=get_event(&key,&mx,&my);

        if (visible)
            light_line(currenty,(word)(currentx+1),(word)(width-currentx-1));
        else
            light_line(currenty,1,(word)(width-1));

        if (ev&EV_CLICK)
        {
            word w;
            ubyte edge;
            if (visible)
            {
                w=which_window(&mx,&my,&edge);
                if ( (w==num) && (edge==0) && (my<=visible) )
                {
                    if (key)
                    {   /* a double-click */
                        key=KEY_RETURN;
                        break;
                    }
                    currenty=--my;
                    goto k;
                }
            }
        }
        if (ev&EV_KEY)
        {
            if ( (key==KEY_UP) && (currenty) && visible )
            {
                currenty--;
                goto k;
            }
            if ( (key==KEY_DOWN) && visible && (currenty<(visible-1)) )
            {
                currenty++;
                goto k;
            }
            if ( (key==KEY_RETURN) || (key==KEY_ENTER) || (key==KEY_ESC) )
                break;
            if (reload)
            {
                if (key==KEY_BACKSPACE)
                {
                    if (currentx)
                        menu_so_far[--currentx]=0;
                }
                else if (key==KEY_CLEAR)
                {
                    menu_so_far[currentx=0]=0;
                }
                else if (key&0xFF)
                {
                    if (currentx<MAXMENUWIDTH)
                        menu_so_far[currentx++]=upper((char)key);
                    menu_so_far[currentx]=0;
                }
                else
                    goto k;
                if ( (reload)(menu_so_far,&numlist) )
                {
                    window_cls(menuw);
                    update_contents(menuw);
                    goto p;
                }
                else
                    goto k;
            }
        }
        goto k;
    }
    /* like close_dialog */
    remove_wlist(menuw);
    menuw->open=FALSE;

    /* restore correct view of world */
    recalc_frontback();
    /* and redraw this new place */
    update_rectangle(menuw->x, menuw->y, (word)(menuw->x+menuw->w),
                     (word)(menuw->y+menuw->h) );

    *result=( (key==KEY_ESC) || (visible==0) )
            ? -2 : currenty;
    return 0;
}
示例#9
0
文件: reflect.c 项目: GNOME/vte
int
main(int argc, char **argv)
{
	GtkWidget *label, *terminal, *tophalf, *pane, *window, *sw;
	AtkObject *obj;
	char *text, *p;
	gunichar c;
	guint count;

	gtk_init(&argc, &argv);

	contents = g_array_new(TRUE, FALSE, sizeof(gunichar));

	terminal_init(&terminal);

#ifdef USE_TEXT_VIEW
	tophalf = gtk_scrolled_window_new(NULL, terminal_adjustment(terminal));
	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(tophalf),
				       GTK_POLICY_AUTOMATIC,
				       GTK_POLICY_AUTOMATIC);
	gtk_container_add(GTK_CONTAINER(tophalf), terminal);
#else
	tophalf = gtk_hbox_new(FALSE, 0);

	gtk_box_pack_start(GTK_BOX(tophalf), terminal, TRUE, TRUE, 0);
	gtk_widget_show(terminal);

	GtkWidget* scrollbar = gtk_vscrollbar_new(terminal_adjustment(terminal));
	gtk_box_pack_start(GTK_BOX(tophalf), scrollbar, FALSE, TRUE, 0);
	gtk_widget_show(scrollbar);
#endif
	gtk_widget_show(terminal);

	label = gtk_label_new("");
	gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
	gtk_misc_set_alignment(GTK_MISC(label), 0, 0);

	sw = gtk_scrolled_window_new(NULL, NULL);
	gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw), label);
	gtk_widget_show(label);

	pane = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
	gtk_paned_pack1(GTK_PANED(pane), tophalf, TRUE, FALSE);
	gtk_paned_pack2(GTK_PANED(pane), sw, TRUE, FALSE);
	gtk_widget_show(tophalf);
	gtk_widget_show(sw);

	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	g_signal_connect(G_OBJECT(window), "delete_event",
			 G_CALLBACK(gtk_main_quit), NULL);
	gtk_container_add(GTK_CONTAINER(window), pane);
	gtk_widget_show(pane);

	obj = gtk_widget_get_accessible(terminal);
	g_assert(obj != NULL);
	g_signal_connect(G_OBJECT(obj), "text-changed::insert",
			 G_CALLBACK(text_changed_insert), label);
	g_signal_connect(G_OBJECT(obj), "text-changed::delete",
			 G_CALLBACK(text_changed_delete), label);
	g_signal_connect(G_OBJECT(obj), "text-caret-moved",
			 G_CALLBACK(text_caret_moved), label);
	g_signal_connect(G_OBJECT(obj), "text-selection-changed",
			 G_CALLBACK(text_selection_changed), label);

	count = (guint)atk_text_get_character_count(ATK_TEXT(obj));
	if (count > 0) {
		text = atk_text_get_text(ATK_TEXT(obj), 0, count);
		if (text != NULL) {
			for (p = text;
			     contents->len < count;
			     p = g_utf8_next_char(p)) {
				c = g_utf8_get_char(p);
				g_array_append_val(contents, c);
			}
			g_free(text);
		}
	}
	terminal_shell(terminal);

	gtk_window_set_default_size(GTK_WINDOW(window), 600, 450);
	gtk_widget_show(window);

	update_contents(obj, terminal);

	gtk_main();

	g_array_free(contents, TRUE);
	contents = NULL;

	return 0;
}
示例#10
0
文件: reflect.c 项目: GNOME/vte
static void
text_selection_changed(AtkObject *obj, gpointer data)
{
	update_contents(obj, GTK_WIDGET(data));
}
示例#11
0
文件: reflect.c 项目: GNOME/vte
static void
text_caret_moved(AtkObject *obj, gint offset, gpointer data)
{
	update_contents(obj, GTK_WIDGET(data));
}