<p>In <a href="https://github.com/geany/geany-plugins/pull/324#discussion_r49946757">lineoperations/src/lineoperations.c</a>:</p>
<pre style='color:#555'>> + GtkWidget *sortdesc_item;
> +
> + main_menu_item = gtk_menu_item_new_with_mnemonic(_("_Line Operations"));
> + gtk_widget_show(main_menu_item);
> +
> + submenu = gtk_menu_new();
> + gtk_widget_show(submenu);
> + sep1 = gtk_separator_menu_item_new();
> + sep2 = gtk_separator_menu_item_new();
> + rmdupst_item = gtk_menu_item_new_with_mnemonic(_("Remove Duplicate Lines, _Sorted"));
> + rmdupln_item = gtk_menu_item_new_with_mnemonic(_("Remove Duplicate Lines, _Ordered"));
> + rmunqln_item = gtk_menu_item_new_with_mnemonic(_("Remove _Unique Lines"));
> + rmemtyln_item = gtk_menu_item_new_with_mnemonic(_("Remove _Empty Lines"));
> + rmwhspln_item = gtk_menu_item_new_with_mnemonic(_("Remove _Whitespace Lines"));
> + sortasc_item = gtk_menu_item_new_with_mnemonic(_("Sort Lines _Ascending"));
> + sortdesc_item = gtk_menu_item_new_with_mnemonic(_("Sort Lines _Descending"));
</pre>
<p>similarly, there's quite a lot of duplication in the menu building code, while it's basically always exactly the same. you could easily lower duplication with e.g. representing the items to add like that:</p>
<div class="highlight highlight-source-c"><pre>
<span class="pl-k">struct</span>
{
<span class="pl-k">const</span> gchar *label;
GCallback cb_activate;
gpointer cb_data;
}
menu_items[] =
{
{ <span class="pl-c1">N_</span>(<span class="pl-s"><span class="pl-pds">"</span>Remove Duplicate Lines, _Sorted<span class="pl-pds">"</span></span>),
<span class="pl-c1">G_CALLBACK</span>(action_func_item), rmdupst },
{ <span class="pl-c1">N_</span>(<span class="pl-s"><span class="pl-pds">"</span>Remove Duplicate Lines, _Ordered<span class="pl-pds">"</span></span>),
<span class="pl-c1">G_CALLBACK</span>(action_func_item), rmdupln },
{ <span class="pl-c1">N_</span>(<span class="pl-s"><span class="pl-pds">"</span>Remove _Unique Lines<span class="pl-pds">"</span></span>),
<span class="pl-c1">G_CALLBACK</span>(action_func_item), rmunqln },
{ <span class="pl-c1">NULL</span> },
{ <span class="pl-c1">N_</span>(<span class="pl-s"><span class="pl-pds">"</span>Remove _Empty Lines<span class="pl-pds">"</span></span>),
<span class="pl-c1">G_CALLBACK</span>(action_func_item), rmemtyln },
{ <span class="pl-c1">N_</span>(<span class="pl-s"><span class="pl-pds">"</span>Remove _Whitespace Lines<span class="pl-pds">"</span></span>),
<span class="pl-c1">G_CALLBACK</span>(action_func_item), rmwhspln },
{ <span class="pl-c1">NULL</span> },
{ <span class="pl-c1">N_</span>(<span class="pl-s"><span class="pl-pds">"</span>Sort Lines _Ascending<span class="pl-pds">"</span></span>),
<span class="pl-c1">G_CALLBACK</span>(action_sort_item), <span class="pl-c1">GINT_TO_POINTER</span>(<span class="pl-c1">1</span>) },
{ <span class="pl-c1">N_</span>(<span class="pl-s"><span class="pl-pds">"</span>Sort Lines _Descending<span class="pl-pds">"</span></span>),
<span class="pl-c1">G_CALLBACK</span>(action_sort_item), <span class="pl-c1">GINT_TO_POINTER</span>(<span class="pl-c1">0</span>) }
};</pre></div>
<p>and adding them in a loop</p>
<div class="highlight highlight-source-c"><pre><span class="pl-k">for</span> (i = <span class="pl-c1">0</span>; i < G_N_ELEMENTS(menu_items); i++)
{
GtkWidget *item;
<span class="pl-k">if</span> (! menu_items[i].<span class="pl-smi">label</span>) <span class="pl-c">/* separator */</span>
item = <span class="pl-c1">gtk_separator_menu_item_new</span>();
<span class="pl-k">else</span>
{
item = <span class="pl-c1">gtk_menu_item_new_with_mnemonic</span>(<span class="pl-c1">_</span>(menu_items[i].<span class="pl-smi">label</span>));
<span class="pl-c1">g_signal_connect</span>(item, <span class="pl-s"><span class="pl-pds">"</span>activate<span class="pl-pds">"</span></span>, menu_items[i].<span class="pl-smi">cb_activate</span>, menu_items[i].<span class="pl-smi">cb_data</span>);
<span class="pl-c1">ui_add_document_sensitive</span>(item);
}
<span class="pl-c1">gtk_widget_show</span>(item);
<span class="pl-c1">gtk_menu_shell_append</span>(<span class="pl-c1">GTK_MENU_SHELL</span>(submenu), item);
}</pre></div>
<p style="font-size:small;-webkit-text-size-adjust:none;color:#666;">—<br>Reply to this email directly or <a href="https://github.com/geany/geany-plugins/pull/324/files#r49946757">view it on GitHub</a>.<img alt="" height="1" src="https://github.com/notifications/beacon/ABDrJwH1KI7ej6xojlrkJA6KLtB1qiwWks5pa5iIgaJpZM4HBhj7.gif" width="1" /></p>
<div itemscope itemtype="http://schema.org/EmailMessage">
<div itemprop="action" itemscope itemtype="http://schema.org/ViewAction">
<link itemprop="url" href="https://github.com/geany/geany-plugins/pull/324/files#r49946757"></link>
<meta itemprop="name" content="View Pull Request"></meta>
</div>
<meta itemprop="description" content="View this Pull Request on GitHub"></meta>
</div>