diff -ru Thunar-1.6.3.orig/plugins/thunar-uca/thunar-uca-editor.c Thunar-1.6.3/plugins/thunar-uca/thunar-uca-editor.c --- Thunar-1.6.3.orig/plugins/thunar-uca/thunar-uca-editor.c 2013-05-21 19:50:07.000000000 -0700 +++ Thunar-1.6.3/plugins/thunar-uca/thunar-uca-editor.c 2013-05-21 19:50:20.000000000 -0700 @@ -63,6 +63,8 @@ GtkWidget *sn_button; GtkWidget *parameter_entry; GtkWidget *patterns_entry; + GtkWidget *upper_button; + GtkWidget *lower_button; GtkWidget *directories_button; GtkWidget *audio_files_button; GtkWidget *image_files_button; @@ -102,6 +104,8 @@ GtkWidget *table; GtkWidget *hbox; GtkWidget *vbox; + GtkWidget *spin; + GtkAdjustment *adj; /* configure the dialog properties */ gtk_dialog_add_button (GTK_DIALOG (uca_editor), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); @@ -381,6 +385,25 @@ gtk_label_set_mnemonic_widget (GTK_LABEL (label), uca_editor->patterns_entry); gtk_widget_show (uca_editor->patterns_entry); + /* widgets for setting the upper and lower bounds */ + label = gtk_label_new ("Minimum number of files:"); + gtk_widget_show (label); + gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); + adj = (GtkAdjustment *) gtk_adjustment_new (-1.0, -1.0, 9999.0, 1.0, 1.0, 0.0); + spin = gtk_spin_button_new (adj, 1.0, 0); + gtk_widget_show (spin); + gtk_table_attach (GTK_TABLE (table), spin, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); + uca_editor->lower_button = spin; + + label = gtk_label_new ("Maximum number of files:"); + gtk_widget_show (label); + gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); + adj = (GtkAdjustment *) gtk_adjustment_new (-1.0, -1.0, 9999.0, 1.0, 1.0, 0.0); + spin = gtk_spin_button_new (adj, 1.0, 0); + gtk_widget_show (spin); + gtk_table_attach (GTK_TABLE (table), spin, 1, 2, 2, 3, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); + uca_editor->upper_button = spin; + /* set Atk label relation for the entry */ object = gtk_widget_get_accessible (uca_editor->patterns_entry); relations = atk_object_ref_relation_set (gtk_widget_get_accessible (label)); @@ -389,15 +412,15 @@ g_object_unref (G_OBJECT (relation)); align = g_object_new (GTK_TYPE_ALIGNMENT, "height-request", 0, NULL); - gtk_table_attach (GTK_TABLE (table), align, 0, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach (GTK_TABLE (table), align, 0, 2, 3, 4, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show (align); label = g_object_new (GTK_TYPE_LABEL, "label", _("Appears if selection contains:"), "xalign", 0.0f, NULL); - gtk_table_attach (GTK_TABLE (table), label, 0, 2, 2, 3, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach (GTK_TABLE (table), label, 0, 2, 4, 5, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show (label); align = g_object_new (GTK_TYPE_ALIGNMENT, "left-padding", 18, NULL); - gtk_table_attach (GTK_TABLE (table), align, 0, 2, 3, 4, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach (GTK_TABLE (table), align, 0, 2, 5, 6, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show (align); itable = gtk_table_new (3, 2, TRUE); @@ -431,11 +454,11 @@ gtk_widget_show (uca_editor->other_files_button); align = g_object_new (GTK_TYPE_ALIGNMENT, "height-request", 12, NULL); - gtk_table_attach (GTK_TABLE (table), align, 0, 2, 4, 5, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach (GTK_TABLE (table), align, 0, 2, 6, 7, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show (align); hbox = gtk_hbox_new (FALSE, 6); - gtk_table_attach (GTK_TABLE (table), hbox, 0, 2, 5, 6, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach (GTK_TABLE (table), hbox, 0, 2, 7, 8, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show (hbox); image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DND); @@ -746,6 +769,8 @@ { ThunarUcaTypes types; gchar *description; + gchar *upper; + gchar *lower; gchar *patterns; gchar *command; gchar *icon_name; @@ -759,6 +784,8 @@ /* determine the current values from the model */ gtk_tree_model_get (GTK_TREE_MODEL (uca_model), iter, THUNAR_UCA_MODEL_COLUMN_DESCRIPTION, &description, + THUNAR_UCA_MODEL_COLUMN_UPPER, &upper, + THUNAR_UCA_MODEL_COLUMN_LOWER, &lower, THUNAR_UCA_MODEL_COLUMN_PATTERNS, &patterns, THUNAR_UCA_MODEL_COLUMN_COMMAND, &command, THUNAR_UCA_MODEL_COLUMN_TYPES, &types, @@ -778,10 +805,14 @@ gtk_entry_set_text (GTK_ENTRY (uca_editor->patterns_entry), (patterns != NULL) ? patterns : ""); gtk_entry_set_text (GTK_ENTRY (uca_editor->command_entry), (command != NULL) ? command : ""); gtk_entry_set_text (GTK_ENTRY (uca_editor->name_entry), (name != NULL) ? name : ""); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (uca_editor->upper_button), (upper != NULL) ? g_strtod (upper, NULL) : -1.0); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (uca_editor->lower_button), (lower != NULL) ? g_strtod (lower, NULL) : -1.0); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (uca_editor->sn_button), startup_notify); /* cleanup */ g_free (description); + g_free (upper); + g_free (lower); g_free (patterns); g_free (command); g_free (icon_name); @@ -804,10 +835,16 @@ ThunarUcaModel *uca_model, GtkTreeIter *iter) { + gchar *upper_string; + gchar *lower_string; + g_return_if_fail (THUNAR_UCA_IS_EDITOR (uca_editor)); g_return_if_fail (THUNAR_UCA_IS_MODEL (uca_model)); g_return_if_fail (iter != NULL); + upper_string = g_strdup_printf ("%d", gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (uca_editor->upper_button))); + lower_string = g_strdup_printf ("%d", gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (uca_editor->lower_button))); + thunar_uca_model_update (uca_model, iter, gtk_entry_get_text (GTK_ENTRY (uca_editor->name_entry)), NULL, /* don't touch the unique id */ @@ -816,6 +853,8 @@ gtk_entry_get_text (GTK_ENTRY (uca_editor->command_entry)), gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (uca_editor->sn_button)), gtk_entry_get_text (GTK_ENTRY (uca_editor->patterns_entry)), + upper_string, + lower_string, thunar_uca_editor_get_types (uca_editor)); } diff -ru Thunar-1.6.3.orig/plugins/thunar-uca/thunar-uca-model.c Thunar-1.6.3/plugins/thunar-uca/thunar-uca-model.c --- Thunar-1.6.3.orig/plugins/thunar-uca/thunar-uca-model.c 2013-05-21 19:50:07.000000000 -0700 +++ Thunar-1.6.3/plugins/thunar-uca/thunar-uca-model.c 2013-05-21 19:53:41.000000000 -0700 @@ -79,6 +79,8 @@ PARSER_COMMAND, PARSER_STARTUP_NOTIFY, PARSER_PATTERNS, + PARSER_UPPER, + PARSER_LOWER, PARSER_DESCRIPTION, PARSER_DIRECTORIES, PARSER_AUDIO_FILES, @@ -169,6 +171,8 @@ gchar *command; guint startup_notify : 1; gchar **patterns; + gchar *upper; + gchar *lower; ThunarUcaTypes types; /* derived attributes */ @@ -190,6 +194,8 @@ GString *command; GString *patterns; GString *description; + GString *upper; + GString *lower; gboolean startup_notify; gboolean description_use; guint description_match; @@ -343,7 +349,13 @@ case THUNAR_UCA_MODEL_COLUMN_PATTERNS: return G_TYPE_STRING; - + + case THUNAR_UCA_MODEL_COLUMN_UPPER: + return G_TYPE_STRING; + + case THUNAR_UCA_MODEL_COLUMN_LOWER: + return G_TYPE_STRING; + case THUNAR_UCA_MODEL_COLUMN_TYPES: return G_TYPE_UINT; @@ -452,7 +464,15 @@ str = g_strjoinv (";", item->patterns); g_value_take_string (value, str); break; - + + case THUNAR_UCA_MODEL_COLUMN_UPPER: + g_value_set_static_string (value, item->upper); + break; + + case THUNAR_UCA_MODEL_COLUMN_LOWER: + g_value_set_static_string (value, item->lower); + break; + case THUNAR_UCA_MODEL_COLUMN_TYPES: g_value_set_uint (value, item->types); break; @@ -585,6 +605,8 @@ parser.icon_name = g_string_new (NULL); parser.command = g_string_new (NULL); parser.patterns = g_string_new (NULL); + parser.upper = g_string_new (NULL); + parser.lower = g_string_new (NULL); parser.description = g_string_new (NULL); parser.startup_notify = FALSE; parser.unique_id_generated = FALSE; @@ -598,6 +620,8 @@ /* cleanup */ g_markup_parse_context_free (context); g_string_free (parser.description, TRUE); + g_string_free (parser.upper, TRUE); + g_string_free (parser.lower, TRUE); g_string_free (parser.patterns, TRUE); g_string_free (parser.command, TRUE); g_string_free (parser.icon_name, TRUE); @@ -622,6 +646,8 @@ { /* release the previous values... */ g_strfreev (item->patterns); + g_free (item->upper); + g_free (item->lower); g_free (item->description); g_free (item->command); g_free (item->name); @@ -679,6 +705,8 @@ g_string_truncate (parser->unique_id, 0); g_string_truncate (parser->command, 0); g_string_truncate (parser->patterns, 0); + g_string_truncate (parser->upper, 0); + g_string_truncate (parser->lower, 0); g_string_truncate (parser->description, 0); xfce_stack_push (parser->stack, PARSER_ACTION); } @@ -736,6 +764,16 @@ g_string_truncate (parser->patterns, 0); xfce_stack_push (parser->stack, PARSER_PATTERNS); } + else if (strcmp (element_name, "upper") == 0) + { + g_string_truncate (parser->upper, 0); + xfce_stack_push (parser->stack, PARSER_UPPER); + } + else if (strcmp (element_name, "lower") == 0) + { + g_string_truncate (parser->lower, 0); + xfce_stack_push (parser->stack, PARSER_LOWER); + } else if (strcmp (element_name, "description") == 0) { for (n = 0; attribute_names[n] != NULL; ++n) @@ -850,6 +888,8 @@ parser->command->str, parser->startup_notify, parser->patterns->str, + parser->upper->str, + parser->lower->str, parser->types); /* check if a new id should've been generated */ @@ -884,7 +924,17 @@ if (strcmp (element_name, "patterns") != 0) goto unknown_element; break; - + + case PARSER_UPPER: + if (strcmp (element_name, "upper") != 0) + goto unknown_element; + break; + + case PARSER_LOWER: + if (strcmp (element_name, "lower") != 0) + goto unknown_element; + break; + case PARSER_DESCRIPTION: if (strcmp (element_name, "description") != 0) goto unknown_element; @@ -970,7 +1020,15 @@ case PARSER_PATTERNS: g_string_append_len (parser->patterns, text, text_len); break; - + + case PARSER_UPPER: + g_string_append_len (parser->upper, text, text_len); + break; + + case PARSER_LOWER: + g_string_append_len (parser->lower, text, text_len); + break; + case PARSER_DESCRIPTION: if (parser->description_use) g_string_append_len (parser->description, text, text_len); @@ -1099,6 +1157,7 @@ GList *lp; gint n_files; gint i, m, n; + gint upper, lower; g_return_val_if_fail (THUNAR_UCA_IS_MODEL (uca_model), NULL); g_return_val_if_fail (file_infos != NULL, NULL); @@ -1140,7 +1199,16 @@ { /* check if we can just ignore this item */ item = (ThunarUcaModelItem *) lp->data; - if (!item->multiple_selection && n_files > 1) + upper = g_strtod(item->upper, NULL); + lower = g_strtod(item->lower, NULL); + + if (upper == -1) + upper = n_files; + + if (lower == -1) + lower = n_files; + + if (((!item->multiple_selection) && (n_files > 1)) || (n_files > upper) || (n_files < lower)) continue; /* match the specified files */ @@ -1316,6 +1384,8 @@ const gchar *command, gboolean startup_notify, const gchar *patterns, + const gchar *upper, + const gchar *lower, ThunarUcaTypes types) { ThunarUcaModelItem *item; @@ -1336,6 +1406,10 @@ item->icon_name = g_strdup (icon); if (G_LIKELY (command != NULL && *command != '\0')) item->command = g_strdup (command); + if (G_LIKELY (upper != NULL && *upper != '\0')) + item->upper = g_strdup (upper); + if (G_LIKELY (lower != NULL && *lower != '\0')) + item->lower = g_strdup (lower); if (G_LIKELY (description != NULL && *description != '\0')) item->description = g_strdup (description); item->types = types; @@ -1436,12 +1510,16 @@ "\t%s\n" "\t%s\n" "\t%s\n" + "\t%s\n" + "\t%s\n" "\t%s\n", (item->icon_name != NULL) ? item->icon_name : "", (item->name != NULL) ? item->name : "", (item->unique_id != NULL) ? item->unique_id : "", (item->command != NULL) ? item->command : "", (item->description != NULL) ? item->description : "", + (item->upper != NULL) ? item->upper : "", + (item->lower != NULL) ? item->lower : "", patterns); fprintf (fp, "%s", escaped); g_free (patterns); diff -ru Thunar-1.6.3.orig/plugins/thunar-uca/thunar-uca-model.h Thunar-1.6.3/plugins/thunar-uca/thunar-uca-model.h --- Thunar-1.6.3.orig/plugins/thunar-uca/thunar-uca-model.h 2013-05-21 19:50:07.000000000 -0700 +++ Thunar-1.6.3/plugins/thunar-uca/thunar-uca-model.h 2013-05-21 19:50:20.000000000 -0700 @@ -44,6 +44,8 @@ THUNAR_UCA_MODEL_COLUMN_UNIQUE_ID, THUNAR_UCA_MODEL_COLUMN_COMMAND, THUNAR_UCA_MODEL_COLUMN_STARTUP_NOTIFY, + THUNAR_UCA_MODEL_COLUMN_UPPER, + THUNAR_UCA_MODEL_COLUMN_LOWER, THUNAR_UCA_MODEL_COLUMN_PATTERNS, THUNAR_UCA_MODEL_COLUMN_TYPES, THUNAR_UCA_MODEL_COLUMN_STOCK_LABEL, @@ -96,6 +98,8 @@ const gchar *command, gboolean startup_notify, const gchar *patterns, + const gchar *upper, + const gchar *lower, ThunarUcaTypes types); gboolean thunar_uca_model_save (ThunarUcaModel *uca_model, diff -ru Thunar-1.6.3.orig/plugins/thunar-uca/uca.xml.in Thunar-1.6.3/plugins/thunar-uca/uca.xml.in --- Thunar-1.6.3.orig/plugins/thunar-uca/uca.xml.in 2013-05-21 19:50:07.000000000 -0700 +++ Thunar-1.6.3/plugins/thunar-uca/uca.xml.in 2013-05-21 19:50:20.000000000 -0700 @@ -40,6 +40,8 @@ utilities-terminal * + -1 + -1 <_name>Open Terminal Here exo-open --working-directory %f --launch TerminalEmulator <_description>Example for a custom action @@ -47,4 +49,15 @@ + + preferences-desktop-wallpaper + * + 0 + 1 + <_name>Set as wallpaper + xfconf-query -c xfce4-desktop -p /backdrop/screen0/monitor0/image-path --create -t string -s \"%f\" + <_description>Implementing the entire wallpaper plugin with just a bit of XML + + +