void gui_editor_toggle_mark_at_line (GUIEditor * self, gint line_no) { g_assert (self); GtkTextIter line_start, line_end; GSList *marker_list; GtkSourceMark *marker; /* get line bounds */ gtk_text_buffer_get_iter_at_line (GTK_TEXT_BUFFER (self->buffer), &line_start, line_no); line_end = line_start; gtk_text_iter_forward_to_line_end (&line_end); /* get the breakpoint markers already in the line */ marker_list = gtk_source_buffer_get_source_marks_at_line (self->buffer, line_no, MARKER_BREAKPOINT); if (marker_list != NULL && g_slist_length(marker_list)!=0) { /* markers were found, so delete them */ gtk_source_buffer_remove_source_marks (self->buffer, &line_start, &line_end, MARKER_BREAKPOINT); } else { /* no marker found -> create one */ marker = gtk_source_buffer_create_source_mark (self->buffer, NULL, MARKER_BREAKPOINT, &(line_start)); } g_slist_free (marker_list); }
VISIBLE void toggleBookmark(GtkWidget *widget,GtkTextIter *titer) { ERRDATA pageStruct *page=getPageStructByIDFromPage(-1); GtkWidget *menuitem; GtkTextMark *mark; GtkTextIter *iter; GtkTextIter siter; int line; GtkTextIter startprev,endprev; char *previewtext; GSList *mark_list=NULL; const gchar *mark_type; GList *ptr=NULL; bookMarksNew *bookmarkdata; char *correctedpreview; if(page==NULL) return; mark_type=MARK_TYPE_1; if(titer==NULL) { mark=gtk_text_buffer_get_insert((GtkTextBuffer*)page->buffer); gtk_text_buffer_get_iter_at_mark((GtkTextBuffer*)page->buffer,&siter,mark); gtk_text_iter_set_line_offset(&siter,0); iter=(GtkTextIter*)(&siter); } else iter=titer; mark_list=gtk_source_buffer_get_source_marks_at_line(page->buffer,gtk_text_iter_get_line(iter),mark_type); if(mark_list!=NULL) { //remove entry from bookmark list ptr=newBookMarksList; while(ptr!=NULL) { if((gpointer)((bookMarksNew*)ptr->data)->mark==(gpointer)GTK_TEXT_MARK(mark_list->data)) { ERRDATA debugFree(&((bookMarksNew*)ptr->data)->markName); newBookMarksList=g_list_remove(newBookMarksList,ptr->data); gtk_text_buffer_delete_mark(GTK_TEXT_BUFFER(page->buffer),GTK_TEXT_MARK(mark_list->data)); break; } ptr=g_list_next(ptr); } /* just take the first and delete it */ //rebuild bookmark menu rebuildBookMarkMenu(); ptr=newBookMarksList; while(ptr!=NULL) { menuitem=gtk_menu_item_new_with_label(((bookMarksNew*)ptr->data)->label); gtk_menu_shell_append(GTK_MENU_SHELL(bookMarkSubMenu),menuitem); g_signal_connect(G_OBJECT(menuitem),"activate",G_CALLBACK(jumpToMark),ptr->data); ptr=g_list_next(ptr); } gtk_widget_show_all(bookMarkMenu); g_slist_free(mark_list); } else { /* no mark found: create one */ bookmarkdata=(bookMarksNew*)malloc(sizeof(bookMarksNew)); newBookMarksList=g_list_append(newBookMarksList,(gpointer)bookmarkdata); bookmarkdata->page=page; sinkReturn=asprintf(&bookmarkdata->markName,"%s-%i",BOOKMARK_LABEL,bmMarkNumber++); bookmarkdata->mark=gtk_source_buffer_create_source_mark(page->buffer,bookmarkdata->markName,mark_type,iter); bookmarkdata->pageID=page->pageID; //preview text for menu line=gtk_text_iter_get_line(iter); gtk_text_buffer_get_iter_at_line((GtkTextBuffer*)page->buffer,&startprev,line); gtk_text_buffer_get_iter_at_line((GtkTextBuffer*)page->buffer,&endprev,line+1); previewtext=gtk_text_iter_get_text(&startprev,&endprev); previewtext[strlen(previewtext)-1]=0; g_strchug(previewtext); g_strchomp(previewtext); correctedpreview=truncateWithElipses(previewtext,maxBMChars); ERRDATA debugFree(&previewtext); previewtext=correctedpreview; bookmarkdata->label=previewtext; bookmarkdata->line=line; menuitem=gtk_menu_item_new_with_label(bookmarkdata->label); gtk_menu_shell_append(GTK_MENU_SHELL(bookMarkSubMenu),menuitem); g_signal_connect(G_OBJECT(menuitem),"activate",G_CALLBACK(jumpToMark),(void*)bookmarkdata); gtk_widget_show_all(bookMarkMenu); } }