Le 22/10/2010 02:30, Colomban Wendling a écrit : > Le 21/10/2010 19:08, Colomban Wendling a écrit : >> Le 21/10/2010 17:19, Nick Treleaven a écrit : >>> On Sat, 16 Oct 2010 17:59:28 +0200 >>> Colomban Wendling <lists....@herbesfolles.org> wrote: >>> >>>> Le 15/10/2010 00:35, Colomban Wendling a écrit : >>>>> Joined 0001-Add-filetype-icon.patch (depends on previous >>>>> 0001-Add-MIME-type-to-GeanyFiletype.patch) that add filetype->icon, a >>>>> 16x16 GdkPixbuf icon that represents the file type. >>>> Joined is an updated patch, thanks to Andrian Dimitrov for finding >>>> gtk_icon_size_lookup() :) >>> >>> I like the idea but haven't examined the patches yet. If it makes sense >>> can you combine the patches into one to review as it's a bit confusing >>> at the moment. >> OK, no problem. Which one would you have combined? All stuff needed for >> the one that adds filetype->icon, or also the one that uses these icons >> in the Documents sidebar? > […] > > The combined patch(es) will come separately in a few minutes for less > confusion. Here we are:
0001-Add-MIME-type-and-icon-to-GeanyFiletype.patch: * Combination of 0001-Add-MIME-type-to-GeanyFiletype.patch and 0002-Add-filetype-icon.patch, so it adds both MIME type and icon to filetypes. @Nick: If you want me to provide further combination of some of these patches, just tell me :) Regards, Colomban
diff --git a/src/filetypes.c b/src/filetypes.c index 3661ca2..192c7ed 100644 --- a/src/filetypes.c +++ b/src/filetypes.c @@ -95,6 +95,7 @@ static void init_builtin_filetypes(void) ft = filetypes[GEANY_FILETYPES_NONE]; ft->name = g_strdup(_("None")); ft->title = g_strdup(_("None")); + ft->mime_type = g_strdup("text/plain"); ft->group = GEANY_FILETYPE_GROUP_NONE; #define C @@ -102,6 +103,7 @@ static void init_builtin_filetypes(void) ft->lang = 0; ft->name = g_strdup("C"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/x-csrc"); ft->group = GEANY_FILETYPE_GROUP_COMPILED; #define CPP @@ -109,6 +111,7 @@ static void init_builtin_filetypes(void) ft->lang = 1; ft->name = g_strdup("C++"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/x-c++src"); ft->group = GEANY_FILETYPE_GROUP_COMPILED; #define CS @@ -116,6 +119,7 @@ static void init_builtin_filetypes(void) ft->lang = 25; ft->name = g_strdup("C#"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/x-csharp"); ft->group = GEANY_FILETYPE_GROUP_COMPILED; #define VALA @@ -123,6 +127,7 @@ static void init_builtin_filetypes(void) ft->lang = 33; ft->name = g_strdup("Vala"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/x-vala"); ft->group = GEANY_FILETYPE_GROUP_COMPILED; #define D @@ -130,6 +135,7 @@ static void init_builtin_filetypes(void) ft->lang = 17; ft->name = g_strdup("D"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/x-dsrc"); ft->group = GEANY_FILETYPE_GROUP_COMPILED; #define JAVA @@ -137,6 +143,7 @@ static void init_builtin_filetypes(void) ft->lang = 2; ft->name = g_strdup("Java"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/x-java"); ft->group = GEANY_FILETYPE_GROUP_COMPILED; #define PAS /* to avoid warnings when building under Windows, the symbol PASCAL is there defined */ @@ -144,6 +151,7 @@ static void init_builtin_filetypes(void) ft->lang = 4; ft->name = g_strdup("Pascal"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/x-pascal"); ft->group = GEANY_FILETYPE_GROUP_COMPILED; #define ASM @@ -151,6 +159,7 @@ static void init_builtin_filetypes(void) ft->lang = 9; ft->name = g_strdup("ASM"); ft->title = g_strdup_printf(_("%s source file"), "Assembler"); + ft->mime_type = g_strdup("text/plain"); /* FIXME */ ft->group = GEANY_FILETYPE_GROUP_COMPILED; #define BASIC @@ -158,6 +167,7 @@ static void init_builtin_filetypes(void) ft->lang = 26; ft->name = g_strdup("FreeBasic"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/plain"); /* FIXME */ ft->group = GEANY_FILETYPE_GROUP_COMPILED; #define FORTRAN @@ -165,6 +175,7 @@ static void init_builtin_filetypes(void) ft->lang = 18; ft->name = g_strdup("Fortran"); ft->title = g_strdup_printf(_("%s source file"), "Fortran (F90)"); + ft->mime_type = g_strdup("text/x-fortran"); ft->group = GEANY_FILETYPE_GROUP_COMPILED; #define F77 @@ -172,6 +183,7 @@ static void init_builtin_filetypes(void) ft->lang = 30; ft->name = g_strdup("F77"); ft->title = g_strdup_printf(_("%s source file"), "Fortran (F77)"); + ft->mime_type = g_strdup("text/x-fortran"); ft->group = GEANY_FILETYPE_GROUP_COMPILED; #define GLSL @@ -179,12 +191,14 @@ static void init_builtin_filetypes(void) ft->lang = 31; ft->name = g_strdup("GLSL"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/plain"); /* FIXME */ ft->group = GEANY_FILETYPE_GROUP_COMPILED; #define CAML ft = filetypes[GEANY_FILETYPES_CAML]; ft->name = g_strdup("CAML"); ft->title = g_strdup_printf(_("%s source file"), "(O)Caml"); + ft->mime_type = g_strdup("text/x-ocaml"); ft->group = GEANY_FILETYPE_GROUP_COMPILED; #define PERL @@ -192,6 +206,7 @@ static void init_builtin_filetypes(void) ft->lang = 5; ft->name = g_strdup("Perl"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("application/x-perl"); ft->group = GEANY_FILETYPE_GROUP_SCRIPT; #define PHP @@ -199,6 +214,7 @@ static void init_builtin_filetypes(void) ft->lang = 6; ft->name = g_strdup("PHP"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("application/x-php"); ft->group = GEANY_FILETYPE_GROUP_SCRIPT; #define JAVASCRIPT @@ -206,6 +222,7 @@ static void init_builtin_filetypes(void) ft->lang = 23; ft->name = g_strdup("Javascript"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("application/javascript"); ft->group = GEANY_FILETYPE_GROUP_SCRIPT; #define PYTHON @@ -213,6 +230,7 @@ static void init_builtin_filetypes(void) ft->lang = 7; ft->name = g_strdup("Python"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/x-python"); ft->group = GEANY_FILETYPE_GROUP_SCRIPT; #define RUBY @@ -220,6 +238,7 @@ static void init_builtin_filetypes(void) ft->lang = 14; ft->name = g_strdup("Ruby"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("application/x-ruby"); ft->group = GEANY_FILETYPE_GROUP_SCRIPT; #define TCL @@ -227,6 +246,7 @@ static void init_builtin_filetypes(void) ft->lang = 15; ft->name = g_strdup("Tcl"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/x-tcl"); ft->group = GEANY_FILETYPE_GROUP_SCRIPT; #define LUA @@ -234,6 +254,7 @@ static void init_builtin_filetypes(void) ft->lang = 22; ft->name = g_strdup("Lua"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/x-lua"); ft->group = GEANY_FILETYPE_GROUP_SCRIPT; #define FERITE @@ -241,6 +262,7 @@ static void init_builtin_filetypes(void) ft->lang = 19; ft->name = g_strdup("Ferite"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/plain"); /* FIXME */ ft->group = GEANY_FILETYPE_GROUP_SCRIPT; #define HASKELL @@ -248,6 +270,7 @@ static void init_builtin_filetypes(void) ft->lang = 24; ft->name = g_strdup("Haskell"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/x-haskell"); ft->group = GEANY_FILETYPE_GROUP_COMPILED; #define MARKDOWN @@ -255,6 +278,7 @@ static void init_builtin_filetypes(void) ft->lang = 36; ft->name = g_strdup("Markdown"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/plain"); /* FIXME */ ft->group = GEANY_FILETYPE_GROUP_MISC; #define TXT2TAGS @@ -262,6 +286,7 @@ static void init_builtin_filetypes(void) ft->lang = 37; ft->name = g_strdup("Txt2tags"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/x-txt2tags"); ft->group = GEANY_FILETYPE_GROUP_MISC; #define ABC @@ -269,6 +294,7 @@ static void init_builtin_filetypes(void) ft->lang = 38; ft->name = g_strdup("Abc"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/plain"); /* FIXME */ ft->group = GEANY_FILETYPE_GROUP_MISC; #define SH @@ -276,6 +302,7 @@ static void init_builtin_filetypes(void) ft->lang = 16; ft->name = g_strdup("Sh"); ft->title = g_strdup(_("Shell script file")); + ft->mime_type = g_strdup("application/x-shellscript"); ft->group = GEANY_FILETYPE_GROUP_SCRIPT; #define MAKE @@ -283,12 +310,14 @@ static void init_builtin_filetypes(void) ft->lang = 3; ft->name = g_strdup("Make"); ft->title = g_strdup(_("Makefile")); + ft->mime_type = g_strdup("text/x-makefile"); ft->group = GEANY_FILETYPE_GROUP_SCRIPT; #define XML ft = filetypes[GEANY_FILETYPES_XML]; ft->name = g_strdup("XML"); ft->title = g_strdup(_("XML document")); + ft->mime_type = g_strdup("application/xml"); ft->group = GEANY_FILETYPE_GROUP_MARKUP; #define DOCBOOK @@ -296,6 +325,7 @@ static void init_builtin_filetypes(void) ft->lang = 12; ft->name = g_strdup("Docbook"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("application/docbook+xml"); ft->group = GEANY_FILETYPE_GROUP_MARKUP; #define HTML @@ -303,6 +333,7 @@ static void init_builtin_filetypes(void) ft->lang = 29; ft->name = g_strdup("HTML"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/html"); ft->group = GEANY_FILETYPE_GROUP_MARKUP; #define CSS @@ -310,6 +341,7 @@ static void init_builtin_filetypes(void) ft->lang = 13; ft->name = g_strdup("CSS"); ft->title = g_strdup(_("Cascading StyleSheet")); + ft->mime_type = g_strdup("text/css"); ft->group = GEANY_FILETYPE_GROUP_MARKUP; /* not really markup but fit quite well to HTML */ #define SQL @@ -317,6 +349,7 @@ static void init_builtin_filetypes(void) ft->lang = 11; ft->name = g_strdup("SQL"); ft->title = g_strdup(_("SQL Dump file")); + ft->mime_type = g_strdup("text/x-sql"); ft->group = GEANY_FILETYPE_GROUP_MISC; #define LATEX @@ -324,6 +357,7 @@ static void init_builtin_filetypes(void) ft->lang = 8; ft->name = g_strdup("LaTeX"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/x-tex"); ft->group = GEANY_FILETYPE_GROUP_MISC; #define VHDL @@ -331,6 +365,7 @@ static void init_builtin_filetypes(void) ft->lang = 21; ft->name = g_strdup("VHDL"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/x-vhdl"); ft->group = GEANY_FILETYPE_GROUP_COMPILED; #define VERILOG @@ -338,6 +373,7 @@ static void init_builtin_filetypes(void) ft->lang = 39; ft->name = g_strdup("Verilog"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/plain"); /* FIXME */ ft->group = GEANY_FILETYPE_GROUP_COMPILED; #define DIFF @@ -345,18 +381,21 @@ static void init_builtin_filetypes(void) ft->lang = 20; ft->name = g_strdup("Diff"); filetype_make_title(ft, TITLE_FILE); + ft->mime_type = g_strdup("text/x-patch"); ft->group = GEANY_FILETYPE_GROUP_MISC; #define LISP ft = filetypes[GEANY_FILETYPES_LISP]; ft->name = g_strdup("Lisp"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/plain"); /* FIXME */ ft->group = GEANY_FILETYPE_GROUP_SCRIPT; #define ERLANG ft = filetypes[GEANY_FILETYPES_ERLANG]; ft->name = g_strdup("Erlang"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/x-erlang"); ft->group = GEANY_FILETYPE_GROUP_SCRIPT; #define CONF @@ -364,12 +403,14 @@ static void init_builtin_filetypes(void) ft->lang = 10; ft->name = g_strdup("Conf"); ft->title = g_strdup(_("Config file")); + ft->mime_type = g_strdup("text/plain"); /* FIXME */ ft->group = GEANY_FILETYPE_GROUP_MISC; #define PO ft = filetypes[GEANY_FILETYPES_PO]; ft->name = g_strdup("Po"); ft->title = g_strdup(_("Gettext translation file")); + ft->mime_type = g_strdup("text/x-gettext-translation"); ft->group = GEANY_FILETYPE_GROUP_MISC; #define HAXE @@ -377,6 +418,7 @@ static void init_builtin_filetypes(void) ft->lang = 27; ft->name = g_strdup("Haxe"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/plain"); /* FIXME */ ft->group = GEANY_FILETYPE_GROUP_COMPILED; #define ACTIONSCRIPT @@ -384,6 +426,7 @@ static void init_builtin_filetypes(void) ft->lang = 34; ft->name = g_strdup("ActionScript"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("application/ecmascript"); ft->group = GEANY_FILETYPE_GROUP_SCRIPT; #define R @@ -391,6 +434,7 @@ static void init_builtin_filetypes(void) ft->lang = 40; ft->name = g_strdup("R"); ft->title = g_strdup_printf(_("%s script file"), "R"); + ft->mime_type = g_strdup("text/plain"); /* FIXME */ ft->group = GEANY_FILETYPE_GROUP_SCRIPT; #define REST @@ -398,6 +442,7 @@ static void init_builtin_filetypes(void) ft->lang = 28; ft->name = g_strdup("reStructuredText"); filetype_make_title(ft, TITLE_FILE); + ft->mime_type = g_strdup("text/plain"); /* FIXME */ ft->group = GEANY_FILETYPE_GROUP_MISC; #define MATLAB @@ -405,18 +450,21 @@ static void init_builtin_filetypes(void) ft->lang = 32; ft->name = g_strdup("Matlab/Octave"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/x-matlab"); ft->group = GEANY_FILETYPE_GROUP_SCRIPT; #define YAML ft = filetypes[GEANY_FILETYPES_YAML]; ft->name = g_strdup("YAML"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/plain"); /* FIXME */ ft->group = GEANY_FILETYPE_GROUP_MISC; #define CMAKE ft = filetypes[GEANY_FILETYPES_CMAKE]; ft->name = g_strdup("CMake"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/x-cmake"); ft->group = GEANY_FILETYPE_GROUP_MISC; #define NSIS @@ -424,18 +472,21 @@ static void init_builtin_filetypes(void) ft->lang = 35; ft->name = g_strdup("NSIS"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/plain"); /* FIXME */ ft->group = GEANY_FILETYPE_GROUP_MISC; #define ADA ft = filetypes[GEANY_FILETYPES_ADA]; ft->name = g_strdup("Ada"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/x-adasrc"); ft->group = GEANY_FILETYPE_GROUP_COMPILED; #define FORTH ft = filetypes[GEANY_FILETYPES_FORTH]; ft->name = g_strdup("Forth"); filetype_make_title(ft, TITLE_SOURCE_FILE); + ft->mime_type = g_strdup("text/plain"); /* FIXME */ ft->group = GEANY_FILETYPE_GROUP_SCRIPT; } @@ -449,6 +500,7 @@ static GeanyFiletype *filetype_new(void) /* pattern must not be null */ ft->pattern = g_new0(gchar*, 1); ft->project_list_entry = -1; /* no entry */ + ft->icon = NULL; ft->priv = g_new0(GeanyFiletypePrivate, 1); return ft; @@ -480,6 +532,9 @@ static void filetype_add(GeanyFiletype *ft) g_hash_table_insert(filetypes_hash, ft->name, ft); filetypes_by_title = g_slist_insert_sorted(filetypes_by_title, ft, cmp_filetype); + + if (!ft->icon && ft->mime_type) + ft->icon = ui_get_mime_icon(ft->mime_type, GTK_ICON_SIZE_MENU); } @@ -958,6 +1013,7 @@ static void filetype_free(gpointer data, G_GNUC_UNUSED gpointer user_data) g_free(ft->name); g_free(ft->title); g_free(ft->extension); + g_free(ft->mime_type); g_free(ft->comment_open); g_free(ft->comment_close); g_free(ft->context_action_cmd); @@ -965,6 +1021,8 @@ static void filetype_free(gpointer data, G_GNUC_UNUSED gpointer user_data) g_free(ft->ftdefcmds); g_free(ft->execcmds); set_error_regex(ft, NULL); + if (ft->icon) + g_object_unref(ft->icon); g_strfreev(ft->pattern); g_free(ft->priv); diff --git a/src/filetypes.h b/src/filetypes.h index d1d8086..213c909 100644 --- a/src/filetypes.h +++ b/src/filetypes.h @@ -129,6 +129,8 @@ struct GeanyFiletype GeanyFiletypeGroupID group; gchar *error_regex_string; GeanyFiletype *lexer_filetype; + gchar *mime_type; + GdkPixbuf *icon; struct GeanyFiletypePrivate *priv; /* must be last, append fields before this item */ #ifdef GEANY_PRIVATE diff --git a/src/ui_utils.c b/src/ui_utils.c index a728052..2f8699f 100644 --- a/src/ui_utils.c +++ b/src/ui_utils.c @@ -2453,3 +2453,48 @@ void ui_editable_insert_text_callback(GtkEditable *editable, gchar *new_text, g_signal_stop_emission_by_name(editable, "insert-text"); } + +/* gets the icon that applies to a particular MIME type */ +GdkPixbuf *ui_get_mime_icon(const gchar *mime_type, GtkIconSize size) +{ + GdkPixbuf *icon = NULL; +#if defined(HAVE_GIO) && GLIB_CHECK_VERSION(2, 18, 0) + gchar *ctype; + GIcon *gicon; + GtkIconInfo *info; + GtkIconTheme *theme; + gint real_size; + + g_return_val_if_fail(gtk_icon_size_lookup(size, &real_size, NULL), NULL); + + theme = gtk_icon_theme_get_default(); + ctype = g_content_type_from_mime_type(mime_type); + gicon = g_content_type_get_icon(ctype); + info = gtk_icon_theme_lookup_by_gicon(theme, gicon, real_size, 0); + g_object_unref(gicon); + g_free(ctype); + + if (info) + { + icon = gtk_icon_info_load_icon(info, NULL); + gtk_icon_info_free(info); + } +#else + const gchar *stock_id = GTK_STOCK_FILE; + GtkIconSet *icon_set; + + if (strstr(mime_type, "directory")) + stock_id = GTK_STOCK_DIRECTORY; + + icon_set = gtk_icon_factory_lookup_default(stock_id); + if (icon_set) + { + icon = gtk_icon_set_render_icon(icon_set, gtk_widget_get_default_style(), + gtk_widget_get_default_direction(), + GTK_STATE_NORMAL, size, NULL, NULL); + } +#endif + + return icon; +} + diff --git a/src/ui_utils.h b/src/ui_utils.h index c1bc2e9..d1aee0a 100644 --- a/src/ui_utils.h +++ b/src/ui_utils.h @@ -321,4 +321,6 @@ gboolean ui_is_keyval_enter_or_return(guint keyval); gint ui_get_gtk_settings_integer(const gchar *property_name, gint default_value); +GdkPixbuf *ui_get_mime_icon(const gchar *mime_type, GtkIconSize size); + #endif
_______________________________________________ Geany-devel mailing list Geany-devel@uvena.de http://lists.uvena.de/cgi-bin/mailman/listinfo/geany-devel