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 */
|
/* widgets */
|
||||||
GtkWidget * window;
|
GtkWidget * window;
|
||||||
|
GtkWidget * toolbar;
|
||||||
|
GtkWidget * view;
|
||||||
GtkWidget * ab_window;
|
GtkWidget * ab_window;
|
||||||
} View;
|
} View;
|
||||||
|
|
||||||
@ -99,9 +101,11 @@ static void _on_file_close(gpointer data);
|
|||||||
static void _on_help_contents(gpointer data);
|
static void _on_help_contents(gpointer data);
|
||||||
static void _on_help_about(gpointer data);
|
static void _on_help_about(gpointer data);
|
||||||
#endif
|
#endif
|
||||||
|
static void _on_copy(gpointer data);
|
||||||
static void _on_edit(gpointer data);
|
static void _on_edit(gpointer data);
|
||||||
static void _on_open_with(gpointer data);
|
static void _on_open_with(gpointer data);
|
||||||
static void _on_properties(gpointer data);
|
static void _on_properties(gpointer data);
|
||||||
|
static void _on_select_all(gpointer data);
|
||||||
|
|
||||||
|
|
||||||
/* constants */
|
/* constants */
|
||||||
@ -246,11 +250,11 @@ static View * _view_new(char const * pathname)
|
|||||||
#else
|
#else
|
||||||
desktop_accel_create(_view_accel, view, group);
|
desktop_accel_create(_view_accel, view, group);
|
||||||
#endif
|
#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)
|
if(mime_get_handler(_mime, type, "edit") == NULL)
|
||||||
gtk_widget_set_sensitive(GTK_WIDGET(_view_toolbar[1].widget),
|
gtk_widget_set_sensitive(GTK_WIDGET(_view_toolbar[1].widget),
|
||||||
FALSE);
|
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(strncmp(type, image, sizeof(image) - 1) == 0)
|
||||||
{
|
{
|
||||||
if((widget = _new_image(view, pathname)) == NULL)
|
if((widget = _new_image(view, pathname)) == NULL)
|
||||||
@ -288,7 +292,6 @@ static GtkWidget * _new_image(View * view, char const * path)
|
|||||||
GtkWidget * window;
|
GtkWidget * window;
|
||||||
GError * error = NULL;
|
GError * error = NULL;
|
||||||
GdkPixbufAnimation * pixbuf;
|
GdkPixbufAnimation * pixbuf;
|
||||||
GtkWidget * widget;
|
|
||||||
int pw;
|
int pw;
|
||||||
int ph;
|
int ph;
|
||||||
GdkScreen * screen;
|
GdkScreen * screen;
|
||||||
@ -306,9 +309,9 @@ static GtkWidget * _new_image(View * view, char const * path)
|
|||||||
}
|
}
|
||||||
if(pixbuf == NULL)
|
if(pixbuf == NULL)
|
||||||
return 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),
|
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(window),
|
||||||
widget);
|
view->view);
|
||||||
pw = gdk_pixbuf_animation_get_width(pixbuf) + 4;
|
pw = gdk_pixbuf_animation_get_width(pixbuf) + 4;
|
||||||
ph = gdk_pixbuf_animation_get_height(pixbuf) + 4;
|
ph = gdk_pixbuf_animation_get_height(pixbuf) + 4;
|
||||||
/* get the current monitor size */
|
/* 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)
|
static GtkWidget * _new_text(View * view, char const * path)
|
||||||
{
|
{
|
||||||
GtkWidget * widget;
|
GtkToolItem * toolitem;
|
||||||
GtkWidget * text;
|
GtkWidget * window;
|
||||||
PangoFontDescription * desc;
|
PangoFontDescription * desc;
|
||||||
FILE * fp;
|
FILE * fp;
|
||||||
GtkTextBuffer * tbuf;
|
GtkTextBuffer * tbuf;
|
||||||
@ -338,31 +341,53 @@ static GtkWidget * _new_text(View * view, char const * path)
|
|||||||
char buf[BUFSIZ];
|
char buf[BUFSIZ];
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
widget = gtk_scrolled_window_new(NULL, NULL);
|
toolitem = gtk_separator_tool_item_new();
|
||||||
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(widget),
|
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);
|
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
|
||||||
text = gtk_text_view_new();
|
view->view = gtk_text_view_new();
|
||||||
gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(text), FALSE);
|
gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(view->view), FALSE);
|
||||||
gtk_text_view_set_editable(GTK_TEXT_VIEW(text), FALSE);
|
gtk_text_view_set_editable(GTK_TEXT_VIEW(view->view), FALSE);
|
||||||
gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text), GTK_WRAP_WORD_CHAR);
|
gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(view->view),
|
||||||
|
GTK_WRAP_WORD_CHAR);
|
||||||
desc = pango_font_description_new();
|
desc = pango_font_description_new();
|
||||||
pango_font_description_set_family(desc, "monospace");
|
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);
|
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)
|
if((fp = fopen(path, "r")) == NULL)
|
||||||
{
|
{
|
||||||
_view_error(view, strerror(errno), 0);
|
_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)
|
while((len = fread(buf, sizeof(char), sizeof(buf), fp)) > 0)
|
||||||
{
|
{
|
||||||
gtk_text_buffer_get_end_iter(tbuf, &iter);
|
gtk_text_buffer_get_end_iter(tbuf, &iter);
|
||||||
gtk_text_buffer_insert(tbuf, &iter, buf, len);
|
gtk_text_buffer_insert(tbuf, &iter, buf, len);
|
||||||
}
|
}
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
return widget;
|
return window;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -613,6 +638,20 @@ static gboolean _about_on_closex(gpointer data)
|
|||||||
#endif /* EMBEDDED */
|
#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 */
|
/* on_edit */
|
||||||
static void _on_edit(gpointer data)
|
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 */
|
/* usage */
|
||||||
static int _usage(void)
|
static int _usage(void)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user