Added a "copy" and "select all" toolbar button when viewing text
This commit is contained in:
parent
41598858b3
commit
a46a1689c0
90
src/view.c
90
src/view.c
@ -62,6 +62,8 @@ typedef struct _View
|
||||
|
||||
/* widgets */
|
||||
GtkWidget * window;
|
||||
GtkWidget * toolbar;
|
||||
GtkWidget * view;
|
||||
GtkWidget * ab_window;
|
||||
} View;
|
||||
|
||||
@ -99,9 +101,11 @@ static void _on_file_close(gpointer data);
|
||||
static void _on_help_contents(gpointer data);
|
||||
static void _on_help_about(gpointer data);
|
||||
#endif
|
||||
static void _on_copy(gpointer data);
|
||||
static void _on_edit(gpointer data);
|
||||
static void _on_open_with(gpointer data);
|
||||
static void _on_properties(gpointer data);
|
||||
static void _on_select_all(gpointer data);
|
||||
|
||||
|
||||
/* constants */
|
||||
@ -246,11 +250,11 @@ static View * _view_new(char const * pathname)
|
||||
#else
|
||||
desktop_accel_create(_view_accel, view, group);
|
||||
#endif
|
||||
widget = desktop_toolbar_create(_view_toolbar, view, group);
|
||||
view->toolbar = desktop_toolbar_create(_view_toolbar, view, group);
|
||||
if(mime_get_handler(_mime, type, "edit") == NULL)
|
||||
gtk_widget_set_sensitive(GTK_WIDGET(_view_toolbar[1].widget),
|
||||
FALSE);
|
||||
gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, FALSE, 0);
|
||||
gtk_box_pack_start(GTK_BOX(vbox), view->toolbar, FALSE, FALSE, 0);
|
||||
if(strncmp(type, image, sizeof(image) - 1) == 0)
|
||||
{
|
||||
if((widget = _new_image(view, pathname)) == NULL)
|
||||
@ -288,7 +292,6 @@ static GtkWidget * _new_image(View * view, char const * path)
|
||||
GtkWidget * window;
|
||||
GError * error = NULL;
|
||||
GdkPixbufAnimation * pixbuf;
|
||||
GtkWidget * widget;
|
||||
int pw;
|
||||
int ph;
|
||||
GdkScreen * screen;
|
||||
@ -306,9 +309,9 @@ static GtkWidget * _new_image(View * view, char const * path)
|
||||
}
|
||||
if(pixbuf == NULL)
|
||||
return NULL;
|
||||
widget = gtk_image_new_from_animation(pixbuf);
|
||||
view->view = gtk_image_new_from_animation(pixbuf);
|
||||
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(window),
|
||||
widget);
|
||||
view->view);
|
||||
pw = gdk_pixbuf_animation_get_width(pixbuf) + 4;
|
||||
ph = gdk_pixbuf_animation_get_height(pixbuf) + 4;
|
||||
/* get the current monitor size */
|
||||
@ -329,8 +332,8 @@ static GtkWidget * _new_image(View * view, char const * path)
|
||||
|
||||
static GtkWidget * _new_text(View * view, char const * path)
|
||||
{
|
||||
GtkWidget * widget;
|
||||
GtkWidget * text;
|
||||
GtkToolItem * toolitem;
|
||||
GtkWidget * window;
|
||||
PangoFontDescription * desc;
|
||||
FILE * fp;
|
||||
GtkTextBuffer * tbuf;
|
||||
@ -338,31 +341,53 @@ static GtkWidget * _new_text(View * view, char const * path)
|
||||
char buf[BUFSIZ];
|
||||
size_t len;
|
||||
|
||||
widget = gtk_scrolled_window_new(NULL, NULL);
|
||||
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(widget),
|
||||
toolitem = gtk_separator_tool_item_new();
|
||||
gtk_toolbar_insert(GTK_TOOLBAR(view->toolbar), toolitem, 3);
|
||||
/* copy */
|
||||
toolitem = gtk_tool_button_new_from_stock(GTK_STOCK_COPY);
|
||||
g_signal_connect_swapped(toolitem, "clicked", G_CALLBACK(_on_copy),
|
||||
view);
|
||||
gtk_toolbar_insert(GTK_TOOLBAR(view->toolbar), toolitem, 3);
|
||||
/* select all */
|
||||
#if GTK_CHECK_VERSION(2, 10, 0)
|
||||
toolitem = gtk_tool_button_new_from_stock(GTK_STOCK_SELECT_ALL);
|
||||
#else
|
||||
toolitem = gtk_tool_button_new(gtk_image_new_from_icon_name(
|
||||
"edit-select-all", gtk_toolbar_get_icon_size(
|
||||
GTK_TOOLBAR(view->toolbar))),
|
||||
_("Select All"));
|
||||
#endif
|
||||
g_signal_connect_swapped(toolitem, "clicked", G_CALLBACK(
|
||||
_on_select_all), view);
|
||||
gtk_toolbar_insert(GTK_TOOLBAR(view->toolbar), toolitem, 4);
|
||||
/* view */
|
||||
window = gtk_scrolled_window_new(NULL, NULL);
|
||||
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(window),
|
||||
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
|
||||
text = gtk_text_view_new();
|
||||
gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(text), FALSE);
|
||||
gtk_text_view_set_editable(GTK_TEXT_VIEW(text), FALSE);
|
||||
gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text), GTK_WRAP_WORD_CHAR);
|
||||
view->view = gtk_text_view_new();
|
||||
gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(view->view), FALSE);
|
||||
gtk_text_view_set_editable(GTK_TEXT_VIEW(view->view), FALSE);
|
||||
gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(view->view),
|
||||
GTK_WRAP_WORD_CHAR);
|
||||
desc = pango_font_description_new();
|
||||
pango_font_description_set_family(desc, "monospace");
|
||||
gtk_widget_modify_font(text, desc);
|
||||
gtk_widget_modify_font(view->view, desc);
|
||||
pango_font_description_free(desc);
|
||||
gtk_container_add(GTK_CONTAINER(widget), text);
|
||||
gtk_container_add(GTK_CONTAINER(window), view->view);
|
||||
/* FIXME read asynchronously */
|
||||
if((fp = fopen(path, "r")) == NULL)
|
||||
{
|
||||
_view_error(view, strerror(errno), 0);
|
||||
return widget;
|
||||
return window;
|
||||
}
|
||||
tbuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text));
|
||||
tbuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view->view));
|
||||
while((len = fread(buf, sizeof(char), sizeof(buf), fp)) > 0)
|
||||
{
|
||||
gtk_text_buffer_get_end_iter(tbuf, &iter);
|
||||
gtk_text_buffer_insert(tbuf, &iter, buf, len);
|
||||
}
|
||||
fclose(fp);
|
||||
return widget;
|
||||
return window;
|
||||
}
|
||||
|
||||
|
||||
@ -613,6 +638,20 @@ static gboolean _about_on_closex(gpointer data)
|
||||
#endif /* EMBEDDED */
|
||||
|
||||
|
||||
/* on_copy */
|
||||
static void _on_copy(gpointer data)
|
||||
{
|
||||
View * view = data;
|
||||
GtkClipboard * clipboard;
|
||||
GtkTextBuffer * tbuf;
|
||||
|
||||
clipboard = gtk_widget_get_clipboard(view->view,
|
||||
GDK_SELECTION_CLIPBOARD);
|
||||
tbuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view->view));
|
||||
gtk_text_buffer_copy_clipboard(tbuf, clipboard);
|
||||
}
|
||||
|
||||
|
||||
/* on_edit */
|
||||
static void _on_edit(gpointer data)
|
||||
{
|
||||
@ -641,6 +680,21 @@ static void _on_properties(gpointer data)
|
||||
}
|
||||
|
||||
|
||||
/* on_select_all */
|
||||
static void _on_select_all(gpointer data)
|
||||
{
|
||||
View * view = data;
|
||||
GtkTextBuffer * tbuf;
|
||||
GtkTextIter start;
|
||||
GtkTextIter end;
|
||||
|
||||
tbuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view->view));
|
||||
gtk_text_buffer_get_start_iter(tbuf, &start);
|
||||
gtk_text_buffer_get_end_iter(tbuf, &end);
|
||||
gtk_text_buffer_select_range(tbuf, &start, &end);
|
||||
}
|
||||
|
||||
|
||||
/* usage */
|
||||
static int _usage(void)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user