all repos — tint2 @ 6a285a628da5d5d49d154d5352a0f3e08172effe

fork of the tint2 desktop panel for my custom setup - only minimized windows across all desktops for the taskbar

Executor: tint2conf support
o9000 mrovi9000@gmail.com
commit

6a285a628da5d5d49d154d5352a0f3e08172effe

parent

8c3017634f7ec9f59ed61d33bbb7fdf3d9ebb68b

3 files changed, 365 insertions(+), 176 deletions(-)

jump to
M src/tint2conf/properties.csrc/tint2conf/properties.c

@@ -46,6 +46,8 @@ GtkWidget *screen_position[12];

GSList *screen_position_group; GtkWidget *panel_background; +GtkWidget *notebook; + // taskbar GtkWidget *taskbar_show_desktop, *taskbar_show_name, *taskbar_padding_x, *taskbar_padding_y, *taskbar_spacing; GtkWidget *taskbar_hide_inactive_tasks, *taskbar_hide_diff_monitor;

@@ -111,13 +113,8 @@ GtkWidget *tooltip_task_show, *tooltip_show_after, *tooltip_hide_after;

GtkWidget *clock_format_tooltip, *clock_tmz_tooltip; GtkWidget *tooltip_background; -// Executor -GtkWidget *execp_command, *execp_has_icon, *execp_cache_icon, *execp_interval, *execp_show_tooltip; -GtkWidget *execp_continuous, *execp_markup, *execp_tooltip; -GtkWidget *execp_left_command, *execp_right_command; -GtkWidget *execp_mclick_command, *execp_rclick_command, *execp_uwheel_command, *execp_dwheel_command; -GtkWidget *execp_font, *execp_font_color, *execp_padding_x, *execp_padding_y, *execp_centered, *execp_background; -GtkWidget *execp_icon_w, *execp_icon_h; +// Executors +GArray *executors; // launcher

@@ -177,7 +174,7 @@ GtkWidget **task_status_icon_saturation,

GtkWidget **task_status_icon_brightness, GtkWidget **task_status_background, GtkWidget **task_status_background_set); -void create_execp(GtkWidget *parent); +void create_execp(GtkWidget *parent, int i); void create_clock(GtkWidget *parent); void create_systemtray(GtkWidget *parent); void create_battery(GtkWidget *parent);

@@ -224,14 +221,16 @@ }

GtkWidget *create_properties() { - GtkWidget *view, *dialog_vbox3, *button, *notebook; + GtkWidget *view, *dialog_vbox3, *button; GtkTooltips *tooltips; - GtkWidget *page_panel, *page_panel_items, *page_launcher, *page_taskbar, *page_battery, *page_clock, *page_execp, + GtkWidget *page_panel, *page_panel_items, *page_launcher, *page_taskbar, *page_battery, *page_clock, *page_tooltip, *page_systemtray, *page_task, *page_background; GtkWidget *label; tooltips = gtk_tooltips_new(); (void) tooltips; + + executors = g_array_new(FALSE, TRUE, sizeof(Executor)); // global layer view = gtk_dialog_new();

@@ -340,14 +339,6 @@ gtk_container_set_border_width(GTK_CONTAINER(page_battery), 10);

gtk_widget_show(page_battery); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), addScrollBarToWidget(page_battery), label); create_battery(page_battery); - - label = gtk_label_new(_("Executors")); - gtk_widget_show(label); - page_execp = gtk_vbox_new(FALSE, DEFAULT_HOR_SPACING); - gtk_container_set_border_width(GTK_CONTAINER(page_execp), 10); - gtk_widget_show(page_execp); - gtk_notebook_append_page(GTK_NOTEBOOK(notebook), addScrollBarToWidget(page_execp), label); - create_execp(page_execp); label = gtk_label_new(_("Tooltip")); gtk_widget_show(label);

@@ -1682,6 +1673,11 @@ gtk_list_store_set(all_items, &iter,

itemsColName, _("Free space"), itemsColValue, "F", -1); + gtk_list_store_append(all_items, &iter); + gtk_list_store_set(all_items, &iter, + itemsColName, _("Executor"), + itemsColValue, "E", + -1); panel_items_view = gtk_tree_view_new(); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(panel_items_view),

@@ -1840,9 +1836,11 @@ void set_panel_items(const char *items)

{ gtk_list_store_clear(panel_items); + int execp_index = -1; for (; items && *items; items++) { const char *value = NULL; const char *name = NULL; + char buffer[256]; char v = *items; if (v == 'B') {

@@ -1864,8 +1862,11 @@ } else if (v == 'F') {

value = "F"; name = _("Free space"); } else if (v == 'E') { + execp_index++; + buffer[0] = 0; + sprintf(buffer, "%s %d", _("Executor"), execp_index + 1); + name = buffer; value = "E"; - name = _("Executor"); } else { continue; }

@@ -1893,15 +1894,19 @@ itemsColName, &name,

itemsColValue, &value, -1); - if (!panel_contains(value)) { + if (!panel_contains(value) || g_str_equal(value, "E")) { GtkTreeIter iter; gtk_list_store_append(panel_items, &iter); gtk_list_store_set(panel_items, &iter, itemsColName, g_strdup(name), itemsColValue, g_strdup(value), -1); + if (g_str_equal(value, "E")) { + execp_create_new(); + } } } + execp_update_indices(); } void panel_remove_item(GtkWidget *widget, gpointer data)

@@ -1910,8 +1915,28 @@ GtkTreeIter iter;

GtkTreeModel *model; if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(panel_items_view)), &model, &iter)) { + gchar *name; + gchar *value; + + gtk_tree_model_get(model, &iter, + itemsColName, &name, + itemsColValue, &value, + -1); + + if (g_str_equal(value, "E")) { + for (int i = 0; i < executors->len; i++) { + Executor *executor = &g_array_index(executors, Executor, i); + if (g_str_equal(name, executor->name)) { + execp_remove(i); + break; + } + } + } + gtk_list_store_remove(panel_items, &iter); } + + execp_update_indices(); } void panel_move_item_down(GtkWidget *widget, gpointer data)

@@ -1922,9 +1947,40 @@

if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(panel_items_view)), &model, &iter)) { GtkTreeIter next = iter; if (gtk_tree_model_iter_next(model, &next)) { + gchar *name1; + gchar *value1; + gtk_tree_model_get(model, &iter, + itemsColName, &name1, + itemsColValue, &value1, + -1); + gchar *name2; + gchar *value2; + gtk_tree_model_get(model, &next, + itemsColName, &name2, + itemsColValue, &value2, + -1); + + if (g_str_equal(value1, "E") && g_str_equal(value2, "E")) { + Executor *executor1 = NULL; + Executor *executor2 = NULL; + for (int i = 0; i < executors->len; i++) { + Executor *executor = &g_array_index(executors, Executor, i); + if (g_str_equal(name1, executor->name)) { + executor1 = executor; + } + if (g_str_equal(name2, executor->name)) { + executor2 = executor; + } + } + Executor tmp = *executor1; + *executor1 = *executor2; + *executor2 = tmp; + } + gtk_list_store_swap(panel_items, &iter, &next); } } + execp_update_indices(); } void panel_move_item_up(GtkWidget *widget, gpointer data)

@@ -1936,10 +1992,41 @@

if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(panel_items_view)), &model, &iter)) { GtkTreeIter prev = iter; if (gtk_tree_model_iter_prev_tint2(model, &prev)) { + gchar *name1; + gchar *value1; + gtk_tree_model_get(model, &iter, + itemsColName, &name1, + itemsColValue, &value1, + -1); + gchar *name2; + gchar *value2; + gtk_tree_model_get(model, &prev, + itemsColName, &name2, + itemsColValue, &value2, + -1); + + if (g_str_equal(value1, "E") && g_str_equal(value2, "E")) { + Executor *executor1 = NULL; + Executor *executor2 = NULL; + for (int i = 0; i < executors->len; i++) { + Executor *executor = &g_array_index(executors, Executor, i); + if (g_str_equal(name1, executor->name)) { + executor1 = executor; + } + if (g_str_equal(name2, executor->name)) { + executor2 = executor; + } + } + Executor tmp = *executor1; + *executor1 = *executor2; + *executor2 = tmp; + } + gtk_list_store_swap(panel_items, &iter, &prev); } } } + execp_update_indices(); } enum {

@@ -3981,12 +4068,26 @@

change_paragraph(parent); } -void create_execp(GtkWidget *parent) +void create_execp(GtkWidget *notebook, int i) { + GtkWidget *label; GtkWidget *table; - GtkWidget *label; int row, col; GtkTooltips *tooltips = gtk_tooltips_new(); + + Executor *executor = &g_array_index(executors, Executor, i); + + executor->name[0] = 0; + sprintf(executor->name, "%s %d", _("Executor"), i + 1); + executor->page_label = gtk_label_new(executor->name); + gtk_widget_show(executor->page_label); + executor->page_execp = gtk_vbox_new(FALSE, DEFAULT_HOR_SPACING); + executor->container = addScrollBarToWidget(executor->page_execp); + gtk_container_set_border_width(GTK_CONTAINER(executor->page_execp), 10); + gtk_widget_show(executor->page_execp); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), executor->container, executor->page_label); + + GtkWidget *parent = executor->page_execp; table = gtk_table_new(1, 2, FALSE); gtk_widget_show(table);

@@ -4013,12 +4114,12 @@ gtk_widget_show(label);

gtk_table_attach(GTK_TABLE(table), label, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - execp_command = gtk_entry_new(); - gtk_widget_show(execp_command); - gtk_entry_set_width_chars(GTK_ENTRY(execp_command), 50); - gtk_table_attach(GTK_TABLE(table), execp_command, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); + executor->execp_command = gtk_entry_new(); + gtk_widget_show(executor->execp_command); + gtk_entry_set_width_chars(GTK_ENTRY(executor->execp_command), 50); + gtk_table_attach(GTK_TABLE(table), executor->execp_command, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - gtk_tooltips_set_tip(tooltips, execp_command, + gtk_tooltips_set_tip(tooltips, executor->execp_command, _("Specifies the command to execute."), NULL); row++, col = 2;

@@ -4028,11 +4129,11 @@ gtk_widget_show(label);

gtk_table_attach(GTK_TABLE(table), label, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - execp_interval = gtk_spin_button_new_with_range(0, 1000000, 1); - gtk_widget_show(execp_interval); - gtk_table_attach(GTK_TABLE(table), execp_interval, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); + executor->execp_interval = gtk_spin_button_new_with_range(0, 1000000, 1); + gtk_widget_show(executor->execp_interval); + gtk_table_attach(GTK_TABLE(table), executor->execp_interval, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - gtk_tooltips_set_tip(tooltips, execp_interval, _("Specifies the interval at which the command is executed, in seconds. " + gtk_tooltips_set_tip(tooltips, executor->execp_interval, _("Specifies the interval at which the command is executed, in seconds. " "If zero, the command is executed only once."), NULL); row++, col = 2;

@@ -4042,11 +4143,11 @@ gtk_widget_show(label);

gtk_table_attach(GTK_TABLE(table), label, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - execp_has_icon = gtk_check_button_new(); - gtk_widget_show(execp_has_icon); - gtk_table_attach(GTK_TABLE(table), execp_has_icon, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); + executor->execp_has_icon = gtk_check_button_new(); + gtk_widget_show(executor->execp_has_icon); + gtk_table_attach(GTK_TABLE(table), executor->execp_has_icon, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - gtk_tooltips_set_tip(tooltips, execp_has_icon, _("If enabled, the first line printed by the command is interpreted " + gtk_tooltips_set_tip(tooltips, executor->execp_has_icon, _("If enabled, the first line printed by the command is interpreted " "as a path to an image file."), NULL); row++, col = 2;

@@ -4056,12 +4157,12 @@ gtk_widget_show(label);

gtk_table_attach(GTK_TABLE(table), label, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - execp_cache_icon = gtk_check_button_new(); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(execp_cache_icon), 1); - gtk_widget_show(execp_cache_icon); - gtk_table_attach(GTK_TABLE(table), execp_cache_icon, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); + executor->execp_cache_icon = gtk_check_button_new(); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(executor->execp_cache_icon), 1); + gtk_widget_show(executor->execp_cache_icon); + gtk_table_attach(GTK_TABLE(table), executor->execp_cache_icon, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - gtk_tooltips_set_tip(tooltips, execp_cache_icon, _("If enabled, the image is not reloaded from disk every time the command is executed if the path remains unchanged. Enabling this is recommended."), NULL); + gtk_tooltips_set_tip(tooltips, executor->execp_cache_icon, _("If enabled, the image is not reloaded from disk every time the command is executed if the path remains unchanged. Enabling this is recommended."), NULL); row++, col = 2; label = gtk_label_new(_("Continuous output"));

@@ -4070,11 +4171,11 @@ gtk_widget_show(label);

gtk_table_attach(GTK_TABLE(table), label, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - execp_continuous = gtk_spin_button_new_with_range(0, 1000000, 1); - gtk_widget_show(execp_continuous); - gtk_table_attach(GTK_TABLE(table), execp_continuous, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); + executor->execp_continuous = gtk_spin_button_new_with_range(0, 1000000, 1); + gtk_widget_show(executor->execp_continuous); + gtk_table_attach(GTK_TABLE(table), executor->execp_continuous, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - gtk_tooltips_set_tip(tooltips, execp_continuous, _("If non-zero, the last execp_continuous lines from the output of " + gtk_tooltips_set_tip(tooltips, executor->execp_continuous, _("If non-zero, the last execp_continuous lines from the output of " "the command are displayed, every execp_continuous lines; this is " "useful for showing the output of commands that run indefinitely, " "such as 'ping 127.0.0.1'. If zero, the output of the command is "

@@ -4086,12 +4187,12 @@ gtk_widget_show(label);

gtk_table_attach(GTK_TABLE(table), label, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - execp_markup = gtk_check_button_new(); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(execp_markup), 1); - gtk_widget_show(execp_markup); - gtk_table_attach(GTK_TABLE(table), execp_markup, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); + executor->execp_markup = gtk_check_button_new(); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(executor->execp_markup), 1); + gtk_widget_show(executor->execp_markup); + gtk_table_attach(GTK_TABLE(table), executor->execp_markup, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - gtk_tooltips_set_tip(tooltips, execp_markup, _("If enabled, the output of the command is treated as Pango markup, " + gtk_tooltips_set_tip(tooltips, executor->execp_markup, _("If enabled, the output of the command is treated as Pango markup, " "which allows rich text formatting. Note that using this with commands " "that print data downloaded from the Internet is a potential security risk."), NULL);

@@ -4116,12 +4217,12 @@ gtk_widget_show(label);

gtk_table_attach(GTK_TABLE(table), label, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - execp_left_command = gtk_entry_new(); - gtk_widget_show(execp_left_command); - gtk_entry_set_width_chars(GTK_ENTRY(execp_left_command), 50); - gtk_table_attach(GTK_TABLE(table), execp_left_command, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); + executor->execp_left_command = gtk_entry_new(); + gtk_widget_show(executor->execp_left_command); + gtk_entry_set_width_chars(GTK_ENTRY(executor->execp_left_command), 50); + gtk_table_attach(GTK_TABLE(table), executor->execp_left_command, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - gtk_tooltips_set_tip(tooltips, execp_left_command, + gtk_tooltips_set_tip(tooltips, executor->execp_left_command, _("Specifies a command that will be executed when the executor receives a left click."), NULL); row++, col = 2;

@@ -4131,12 +4232,12 @@ gtk_widget_show(label);

gtk_table_attach(GTK_TABLE(table), label, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - execp_right_command = gtk_entry_new(); - gtk_widget_show(execp_right_command); - gtk_entry_set_width_chars(GTK_ENTRY(execp_right_command), 50); - gtk_table_attach(GTK_TABLE(table), execp_right_command, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); + executor->execp_right_command = gtk_entry_new(); + gtk_widget_show(executor->execp_right_command); + gtk_entry_set_width_chars(GTK_ENTRY(executor->execp_right_command), 50); + gtk_table_attach(GTK_TABLE(table), executor->execp_right_command, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - gtk_tooltips_set_tip(tooltips, execp_right_command, + gtk_tooltips_set_tip(tooltips, executor->execp_right_command, _("Specifies a command that will be executed when the executor receives a right click."), NULL); row++, col = 2;

@@ -4146,12 +4247,12 @@ gtk_widget_show(label);

gtk_table_attach(GTK_TABLE(table), label, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - execp_mclick_command = gtk_entry_new(); - gtk_widget_show(execp_mclick_command); - gtk_entry_set_width_chars(GTK_ENTRY(execp_mclick_command), 50); - gtk_table_attach(GTK_TABLE(table), execp_mclick_command, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); + executor->execp_mclick_command = gtk_entry_new(); + gtk_widget_show(executor->execp_mclick_command); + gtk_entry_set_width_chars(GTK_ENTRY(executor->execp_mclick_command), 50); + gtk_table_attach(GTK_TABLE(table), executor->execp_mclick_command, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - gtk_tooltips_set_tip(tooltips, execp_mclick_command, + gtk_tooltips_set_tip(tooltips, executor->execp_mclick_command, _("Specifies a command that will be executed when the executor receives a middle click."), NULL); row++, col = 2;

@@ -4161,12 +4262,12 @@ gtk_widget_show(label);

gtk_table_attach(GTK_TABLE(table), label, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - execp_uwheel_command = gtk_entry_new(); - gtk_widget_show(execp_uwheel_command); - gtk_entry_set_width_chars(GTK_ENTRY(execp_uwheel_command), 50); - gtk_table_attach(GTK_TABLE(table), execp_uwheel_command, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); + executor->execp_uwheel_command = gtk_entry_new(); + gtk_widget_show(executor->execp_uwheel_command); + gtk_entry_set_width_chars(GTK_ENTRY(executor->execp_uwheel_command), 50); + gtk_table_attach(GTK_TABLE(table), executor->execp_uwheel_command, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - gtk_tooltips_set_tip(tooltips, execp_uwheel_command, + gtk_tooltips_set_tip(tooltips, executor->execp_uwheel_command, _("Specifies a command that will be executed when the executor receives a mouse scroll up."), NULL); row++, col = 2;

@@ -4176,12 +4277,12 @@ gtk_widget_show(label);

gtk_table_attach(GTK_TABLE(table), label, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - execp_dwheel_command = gtk_entry_new(); - gtk_widget_show(execp_dwheel_command); - gtk_entry_set_width_chars(GTK_ENTRY(execp_dwheel_command), 50); - gtk_table_attach(GTK_TABLE(table), execp_dwheel_command, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); + executor->execp_dwheel_command = gtk_entry_new(); + gtk_widget_show(executor->execp_dwheel_command); + gtk_entry_set_width_chars(GTK_ENTRY(executor->execp_dwheel_command), 50); + gtk_table_attach(GTK_TABLE(table), executor->execp_dwheel_command, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - gtk_tooltips_set_tip(tooltips, execp_dwheel_command, + gtk_tooltips_set_tip(tooltips, executor->execp_dwheel_command, _("Specifies a command that will be executed when the executor receives a mouse scroll down."), NULL); change_paragraph(parent);

@@ -4205,11 +4306,11 @@ gtk_widget_show(label);

gtk_table_attach(GTK_TABLE(table), label, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - execp_background = create_background_combo(_("execp")); - gtk_widget_show(execp_background); - gtk_table_attach(GTK_TABLE(table), execp_background, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); + executor->execp_background = create_background_combo(_("Executor")); + gtk_widget_show(executor->execp_background); + gtk_table_attach(GTK_TABLE(table), executor->execp_background, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - gtk_tooltips_set_tip(tooltips, execp_background, _("Selects the background used to display the executor. " + gtk_tooltips_set_tip(tooltips, executor->execp_background, _("Selects the background used to display the executor. " "Backgrounds can be edited in the Backgrounds tab."), NULL); row++, col = 2;

@@ -4219,11 +4320,11 @@ gtk_widget_show(label);

gtk_table_attach(GTK_TABLE(table), label, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - execp_padding_x = gtk_spin_button_new_with_range(0, 500, 1); - gtk_widget_show(execp_padding_x); - gtk_table_attach(GTK_TABLE(table), execp_padding_x, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); + executor->execp_padding_x = gtk_spin_button_new_with_range(0, 500, 1); + gtk_widget_show(executor->execp_padding_x); + gtk_table_attach(GTK_TABLE(table), executor->execp_padding_x, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - gtk_tooltips_set_tip(tooltips, execp_padding_x, _("Specifies the horizontal padding of the executor. " + gtk_tooltips_set_tip(tooltips, executor->execp_padding_x, _("Specifies the horizontal padding of the executor. " "This is the space between the border and the content inside."), NULL); row++, col = 2;

@@ -4233,11 +4334,11 @@ gtk_widget_show(label);

gtk_table_attach(GTK_TABLE(table), label, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - execp_padding_y = gtk_spin_button_new_with_range(0, 500, 1); - gtk_widget_show(execp_padding_y); - gtk_table_attach(GTK_TABLE(table), execp_padding_y, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); + executor->execp_padding_y = gtk_spin_button_new_with_range(0, 500, 1); + gtk_widget_show(executor->execp_padding_y); + gtk_table_attach(GTK_TABLE(table), executor->execp_padding_y, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - gtk_tooltips_set_tip(tooltips, execp_padding_y, _("Specifies the vertical padding of the executor. " + gtk_tooltips_set_tip(tooltips, executor->execp_padding_y, _("Specifies the vertical padding of the executor. " "This is the space between the border and the content inside."), NULL); row++, col = 2;

@@ -4247,11 +4348,11 @@ gtk_widget_show(label);

gtk_table_attach(GTK_TABLE(table), label, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - execp_font = gtk_font_button_new(); - gtk_widget_show(execp_font); - gtk_table_attach(GTK_TABLE(table), execp_font, col, col+3, row, row+1, GTK_FILL, 0, 0, 0); + executor->execp_font = gtk_font_button_new(); + gtk_widget_show(executor->execp_font); + gtk_table_attach(GTK_TABLE(table), executor->execp_font, col, col+3, row, row+1, GTK_FILL, 0, 0, 0); col++; - gtk_font_button_set_show_style(GTK_FONT_BUTTON(execp_font), TRUE); + gtk_font_button_set_show_style(GTK_FONT_BUTTON(executor->execp_font), TRUE); row++, col = 2; label = gtk_label_new(_("Font color"));

@@ -4260,10 +4361,10 @@ gtk_widget_show(label);

gtk_table_attach(GTK_TABLE(table), label, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - execp_font_color = gtk_color_button_new(); - gtk_color_button_set_use_alpha(GTK_COLOR_BUTTON(execp_font_color), TRUE); - gtk_widget_show(execp_font_color); - gtk_table_attach(GTK_TABLE(table), execp_font_color, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); + executor->execp_font_color = gtk_color_button_new(); + gtk_color_button_set_use_alpha(GTK_COLOR_BUTTON(executor->execp_font_color), TRUE); + gtk_widget_show(executor->execp_font_color); + gtk_table_attach(GTK_TABLE(table), executor->execp_font_color, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; row++, col = 2;

@@ -4273,9 +4374,9 @@ gtk_widget_show(label);

gtk_table_attach(GTK_TABLE(table), label, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - execp_centered = gtk_check_button_new(); - gtk_widget_show(execp_centered); - gtk_table_attach(GTK_TABLE(table), execp_centered, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); + executor->execp_centered = gtk_check_button_new(); + gtk_widget_show(executor->execp_centered); + gtk_table_attach(GTK_TABLE(table), executor->execp_centered, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; row++, col = 2;

@@ -4285,11 +4386,11 @@ gtk_widget_show(label);

gtk_table_attach(GTK_TABLE(table), label, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - execp_icon_w = gtk_spin_button_new_with_range(0, 1000000, 1); - gtk_widget_show(execp_icon_w); - gtk_table_attach(GTK_TABLE(table), execp_icon_w, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); + executor->execp_icon_w = gtk_spin_button_new_with_range(0, 1000000, 1); + gtk_widget_show(executor->execp_icon_w); + gtk_table_attach(GTK_TABLE(table), executor->execp_icon_w, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - gtk_tooltips_set_tip(tooltips, execp_icon_w, _("If non-zero, the image is resized to this width."), NULL); + gtk_tooltips_set_tip(tooltips, executor->execp_icon_w, _("If non-zero, the image is resized to this width."), NULL); row++, col = 2; label = gtk_label_new(_("Icon height"));

@@ -4298,11 +4399,11 @@ gtk_widget_show(label);

gtk_table_attach(GTK_TABLE(table), label, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - execp_icon_h = gtk_spin_button_new_with_range(0, 1000000, 1); - gtk_widget_show(execp_icon_h); - gtk_table_attach(GTK_TABLE(table), execp_icon_h, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); + executor->execp_icon_h = gtk_spin_button_new_with_range(0, 1000000, 1); + gtk_widget_show(executor->execp_icon_h); + gtk_table_attach(GTK_TABLE(table), executor->execp_icon_h, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - gtk_tooltips_set_tip(tooltips, execp_icon_h, _("If non-zero, the image is resized to this height."), NULL); + gtk_tooltips_set_tip(tooltips, executor->execp_icon_h, _("If non-zero, the image is resized to this height."), NULL); row++, col = 2; label = gtk_label_new(_("Tooltip"));

@@ -4311,10 +4412,10 @@ gtk_widget_show(label);

gtk_table_attach(GTK_TABLE(table), label, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - execp_show_tooltip = gtk_check_button_new(); - gtk_widget_show(execp_show_tooltip); - gtk_table_attach(GTK_TABLE(table), execp_show_tooltip, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(execp_show_tooltip), 1); + executor->execp_show_tooltip = gtk_check_button_new(); + gtk_widget_show(executor->execp_show_tooltip); + gtk_table_attach(GTK_TABLE(table), executor->execp_show_tooltip, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(executor->execp_show_tooltip), 1); col++; row++, col = 2;

@@ -4324,15 +4425,80 @@ gtk_widget_show(label);

gtk_table_attach(GTK_TABLE(table), label, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - execp_tooltip = gtk_entry_new(); - gtk_widget_show(execp_tooltip); - gtk_entry_set_width_chars(GTK_ENTRY(execp_tooltip), 50); - gtk_table_attach(GTK_TABLE(table), execp_tooltip, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); + executor->execp_tooltip = gtk_entry_new(); + gtk_widget_show(executor->execp_tooltip); + gtk_entry_set_width_chars(GTK_ENTRY(executor->execp_tooltip), 50); + gtk_table_attach(GTK_TABLE(table), executor->execp_tooltip, col, col+1, row, row+1, GTK_FILL, 0, 0, 0); col++; - gtk_tooltips_set_tip(tooltips, execp_tooltip, + gtk_tooltips_set_tip(tooltips, executor->execp_tooltip, _("The tooltip text to display. Leave this empty to display an automatically generated tooltip with information about when the command was last executed."), NULL); change_paragraph(parent); +} + +void execp_create_new() +{ + g_array_set_size(executors, executors->len + 1); + create_execp(notebook, executors->len - 1); +} + +Executor *execp_get_last() +{ + if (executors->len <= 0) + execp_create_new(); + return &g_array_index(executors, Executor, executors->len - 1); +} + +void execp_remove(int i) +{ + Executor *executor = &g_array_index(executors, Executor, i); + + for (int i_page = 0; i_page < gtk_notebook_get_n_pages(GTK_NOTEBOOK(notebook)); i_page++) { + GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), i_page); + if (page == executor->container) { + gtk_widget_hide(page); + gtk_notebook_remove_page(GTK_NOTEBOOK(notebook), i_page); + } + } + + executors = g_array_remove_index(executors, i); +} + +void execp_update_indices() +{ + for (int i = 0; i < executors->len; i++) { + Executor *executor = &g_array_index(executors, Executor, i); + sprintf(executor->name, "%s %d", _("Executor"), i + 1); + gtk_label_set_text(GTK_LABEL(executor->page_label), executor->name); + } + + GtkTreeModel *model = GTK_TREE_MODEL(panel_items); + GtkTreeIter iter; + if (!gtk_tree_model_get_iter_first(model, &iter)) + return; + int execp_index = -1; + while (1) { + gchar *name; + gchar *value; + gtk_tree_model_get(model, &iter, + itemsColName, &name, + itemsColValue, &value, + -1); + + if (g_str_equal(value, "E")) { + execp_index++; + char buffer[256]; + buffer[0] = 0; + sprintf(buffer, "%s %d", _("Executor"), execp_index + 1); + + gtk_list_store_set(panel_items, &iter, + itemsColName, buffer, + -1); + } + + if (!gtk_tree_model_iter_next(model, &iter)) + break; + } } void create_systemtray(GtkWidget *parent)
M src/tint2conf/properties.hsrc/tint2conf/properties.h

@@ -115,12 +115,20 @@ extern GtkWidget *clock_format_tooltip, *clock_tmz_tooltip;

extern GtkWidget *tooltip_background; // Executor -extern GtkWidget *execp_command, *execp_interval, *execp_has_icon, *execp_cache_icon, *execp_show_tooltip; -extern GtkWidget *execp_continuous, *execp_markup, *execp_tooltip; -extern GtkWidget *execp_left_command, *execp_right_command; -extern GtkWidget *execp_mclick_command, *execp_rclick_command, *execp_uwheel_command, *execp_dwheel_command; -extern GtkWidget *execp_font, *execp_font_color, *execp_padding_x, *execp_padding_y, *execp_centered, *execp_background; -extern GtkWidget *execp_icon_w, *execp_icon_h; +typedef struct Executor { + char name[256]; + GtkWidget *container; + GtkWidget *page_execp; + GtkWidget *page_label; + GtkWidget *execp_command, *execp_interval, *execp_has_icon, *execp_cache_icon, *execp_show_tooltip; + GtkWidget *execp_continuous, *execp_markup, *execp_tooltip; + GtkWidget *execp_left_command, *execp_right_command; + GtkWidget *execp_mclick_command, *execp_rclick_command, *execp_uwheel_command, *execp_dwheel_command; + GtkWidget *execp_font, *execp_font_color, *execp_padding_x, *execp_padding_y, *execp_centered, *execp_background; + GtkWidget *execp_icon_w, *execp_icon_h; +} Executor; + +extern GArray *executors; // launcher

@@ -186,5 +194,10 @@ void background_force_update();

int background_index_safe(int index); GtkWidget *create_properties(); + +void execp_create_new(); +Executor *execp_get_last(); +void execp_remove(int i); +void execp_update_indices(); #endif
M src/tint2conf/properties_rw.csrc/tint2conf/properties_rw.c

@@ -643,44 +643,51 @@ }

void config_write_execp(FILE *fp) { - fprintf(fp, "#-------------------------------------\n"); - fprintf(fp, "# Executor\n"); + for (int i = 0; i < executors->len; i++) { + fprintf(fp, "#-------------------------------------\n"); + fprintf(fp, "# Executor\n"); - fprintf(fp, "execp_command = %s\n", gtk_entry_get_text(GTK_ENTRY(execp_command))); - fprintf(fp, "execp_interval = %d\n", (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(execp_interval))); - fprintf(fp, "execp_has_icon = %d\n", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(execp_has_icon)) ? 1 : 0); - fprintf(fp, "execp_cache_icon = %d\n", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(execp_cache_icon)) ? 1 : 0); - fprintf(fp, "execp_continuous = %d\n", (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(execp_continuous))); - fprintf(fp, "execp_markup = %d\n", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(execp_markup)) ? 1 : 0); - if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(execp_show_tooltip))) { - fprintf(fp, "execp_tooltip = \n"); - } else { - fprintf(fp, "execp_tooltip = %s\n", gtk_entry_get_text(GTK_ENTRY(execp_tooltip))); - } + Executor *executor = &g_array_index(executors, Executor, i); - fprintf(fp, "execp_lclick_command = %s\n", gtk_entry_get_text(GTK_ENTRY(execp_left_command))); - fprintf(fp, "execp_rclick_command = %s\n", gtk_entry_get_text(GTK_ENTRY(execp_right_command))); - fprintf(fp, "execp_mclick_command = %s\n", gtk_entry_get_text(GTK_ENTRY(execp_mclick_command))); - fprintf(fp, "execp_uwheel_command = %s\n", gtk_entry_get_text(GTK_ENTRY(execp_uwheel_command))); - fprintf(fp, "execp_dwheel_command = %s\n", gtk_entry_get_text(GTK_ENTRY(execp_dwheel_command))); + fprintf(fp, "execp = new\n"); + fprintf(fp, "execp_command = %s\n", gtk_entry_get_text(GTK_ENTRY(executor->execp_command))); + fprintf(fp, "execp_interval = %d\n", (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(executor->execp_interval))); + fprintf(fp, "execp_has_icon = %d\n", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(executor->execp_has_icon)) ? 1 : 0); + fprintf(fp, "execp_cache_icon = %d\n", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(executor->execp_cache_icon)) ? 1 : 0); + fprintf(fp, "execp_continuous = %d\n", (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(executor->execp_continuous))); + fprintf(fp, "execp_markup = %d\n", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(executor->execp_markup)) ? 1 : 0); + if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(executor->execp_show_tooltip))) { + fprintf(fp, "execp_tooltip = \n"); + } else { + const gchar *text = gtk_entry_get_text(GTK_ENTRY(executor->execp_tooltip)); + if (strlen(text) > 0) + fprintf(fp, "execp_tooltip = %s\n", text); + } + + fprintf(fp, "execp_lclick_command = %s\n", gtk_entry_get_text(GTK_ENTRY(executor->execp_left_command))); + fprintf(fp, "execp_rclick_command = %s\n", gtk_entry_get_text(GTK_ENTRY(executor->execp_right_command))); + fprintf(fp, "execp_mclick_command = %s\n", gtk_entry_get_text(GTK_ENTRY(executor->execp_mclick_command))); + fprintf(fp, "execp_uwheel_command = %s\n", gtk_entry_get_text(GTK_ENTRY(executor->execp_uwheel_command))); + fprintf(fp, "execp_dwheel_command = %s\n", gtk_entry_get_text(GTK_ENTRY(executor->execp_dwheel_command))); - fprintf(fp, "execp_font = %s\n", gtk_font_button_get_font_name(GTK_FONT_BUTTON(execp_font))); - GdkColor color; - gtk_color_button_get_color(GTK_COLOR_BUTTON(execp_font_color), &color); - config_write_color(fp, - "execp_font_color", - color, - gtk_color_button_get_alpha(GTK_COLOR_BUTTON(execp_font_color)) * 100 / 0xffff); - fprintf(fp, - "execp_padding = %d %d\n", - (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(execp_padding_x)), - (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(execp_padding_y))); - fprintf(fp, "execp_background_id = %d\n", gtk_combo_box_get_active(GTK_COMBO_BOX(execp_background))); - fprintf(fp, "execp_centered = %d\n", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(execp_centered)) ? 1 : 0); - fprintf(fp, "execp_icon_w = %d\n", (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(execp_icon_w))); - fprintf(fp, "execp_icon_h = %d\n", (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(execp_icon_h))); + fprintf(fp, "execp_font = %s\n", gtk_font_button_get_font_name(GTK_FONT_BUTTON(executor->execp_font))); + GdkColor color; + gtk_color_button_get_color(GTK_COLOR_BUTTON(executor->execp_font_color), &color); + config_write_color(fp, + "execp_font_color", + color, + gtk_color_button_get_alpha(GTK_COLOR_BUTTON(executor->execp_font_color)) * 100 / 0xffff); + fprintf(fp, + "execp_padding = %d %d\n", + (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(executor->execp_padding_x)), + (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(executor->execp_padding_y))); + fprintf(fp, "execp_background_id = %d\n", gtk_combo_box_get_active(GTK_COMBO_BOX(executor->execp_background))); + fprintf(fp, "execp_centered = %d\n", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(executor->execp_centered)) ? 1 : 0); + fprintf(fp, "execp_icon_w = %d\n", (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(executor->execp_icon_w))); + fprintf(fp, "execp_icon_h = %d\n", (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(executor->execp_icon_h))); - fprintf(fp, "\n"); + fprintf(fp, "\n"); + } } void config_write_tooltip(FILE *fp)

@@ -1615,73 +1622,76 @@ set_action(value, task_mouse_scroll_down);

} /* Executor */ + else if (strcmp(key, "execp") == 0) { + execp_create_new(); + } else if (strcmp(key, "execp_command") == 0) { - gtk_entry_set_text(GTK_ENTRY(execp_command), value); + gtk_entry_set_text(GTK_ENTRY(execp_get_last()->execp_command), value); } else if (strcmp(key, "execp_interval") == 0) { - gtk_spin_button_set_value(GTK_SPIN_BUTTON(execp_interval), atoi(value)); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(execp_get_last()->execp_interval), atoi(value)); } else if (strcmp(key, "execp_has_icon") == 0) { - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(execp_has_icon), atoi(value)); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(execp_get_last()->execp_has_icon), atoi(value)); } else if (strcmp(key, "execp_cache_icon") == 0) { - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(execp_cache_icon), atoi(value)); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(execp_get_last()->execp_cache_icon), atoi(value)); } else if (strcmp(key, "execp_continuous") == 0) { - gtk_spin_button_set_value(GTK_SPIN_BUTTON(execp_continuous), atoi(value)); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(execp_get_last()->execp_continuous), atoi(value)); } else if (strcmp(key, "execp_markup") == 0) { - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(execp_markup), atoi(value)); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(execp_get_last()->execp_markup), atoi(value)); } else if (strcmp(key, "execp_tooltip") == 0) { - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(execp_show_tooltip), 1); - gtk_entry_set_text(GTK_ENTRY(execp_tooltip), value); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(execp_get_last()->execp_show_tooltip), 1); + gtk_entry_set_text(GTK_ENTRY(execp_get_last()->execp_tooltip), value); } else if (strcmp(key, "execp_lclick_command") == 0) { - gtk_entry_set_text(GTK_ENTRY(execp_left_command), value); + gtk_entry_set_text(GTK_ENTRY(execp_get_last()->execp_left_command), value); } else if (strcmp(key, "execp_rclick_command") == 0) { - gtk_entry_set_text(GTK_ENTRY(execp_right_command), value); + gtk_entry_set_text(GTK_ENTRY(execp_get_last()->execp_right_command), value); } else if (strcmp(key, "execp_mclick_command") == 0) { - gtk_entry_set_text(GTK_ENTRY(execp_mclick_command), value); + gtk_entry_set_text(GTK_ENTRY(execp_get_last()->execp_mclick_command), value); } else if (strcmp(key, "execp_uwheel_command") == 0) { - gtk_entry_set_text(GTK_ENTRY(execp_uwheel_command), value); + gtk_entry_set_text(GTK_ENTRY(execp_get_last()->execp_uwheel_command), value); } else if (strcmp(key, "execp_dwheel_command") == 0) { - gtk_entry_set_text(GTK_ENTRY(execp_dwheel_command), value); + gtk_entry_set_text(GTK_ENTRY(execp_get_last()->execp_dwheel_command), value); } else if (strcmp(key, "execp_font") == 0) { - gtk_font_button_set_font_name(GTK_FONT_BUTTON(execp_font), value); + gtk_font_button_set_font_name(GTK_FONT_BUTTON(execp_get_last()->execp_font), value); } else if (strcmp(key, "execp_font_color") == 0) { extract_values(value, &value1, &value2, &value3); GdkColor col; hex2gdk(value1, &col); - gtk_color_button_set_color(GTK_COLOR_BUTTON(execp_font_color), &col); + gtk_color_button_set_color(GTK_COLOR_BUTTON(execp_get_last()->execp_font_color), &col); if (value2) { int alpha = atoi(value2); - gtk_color_button_set_alpha(GTK_COLOR_BUTTON(execp_font_color), (alpha*65535)/100); + gtk_color_button_set_alpha(GTK_COLOR_BUTTON(execp_get_last()->execp_font_color), (alpha*65535)/100); } } else if (strcmp(key, "execp_padding") == 0) { extract_values(value, &value1, &value2, &value3); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(execp_padding_x), atoi(value1)); - if (value2) gtk_spin_button_set_value(GTK_SPIN_BUTTON(execp_padding_y), atoi(value2)); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(execp_get_last()->execp_padding_x), atoi(value1)); + if (value2) gtk_spin_button_set_value(GTK_SPIN_BUTTON(execp_get_last()->execp_padding_y), atoi(value2)); } else if (strcmp(key, "execp_background_id") == 0) { int id = background_index_safe(atoi(value)); - gtk_combo_box_set_active(GTK_COMBO_BOX(execp_background), id); + gtk_combo_box_set_active(GTK_COMBO_BOX(execp_get_last()->execp_background), id); } else if (strcmp(key, "execp_icon_w") == 0) { - gtk_spin_button_set_value(GTK_SPIN_BUTTON(execp_icon_w), atoi(value)); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(execp_get_last()->execp_icon_w), atoi(value)); } else if (strcmp(key, "execp_icon_h") == 0) { - gtk_spin_button_set_value(GTK_SPIN_BUTTON(execp_icon_h), atoi(value)); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(execp_get_last()->execp_icon_h), atoi(value)); } else if (strcmp(key, "execp_centered") == 0) { - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(execp_centered), atoi(value)); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(execp_get_last()->execp_centered), atoi(value)); } if (value1) free(value1);