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); }
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); }
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; }
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; }
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); }
/* 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)); }
/* 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)); }
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; }
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; }
static void text_selection_changed(AtkObject *obj, gpointer data) { update_contents(obj, GTK_WIDGET(data)); }
static void text_caret_moved(AtkObject *obj, gint offset, gpointer data) { update_contents(obj, GTK_WIDGET(data)); }