← Back to team overview

xpad-hackers team mailing list archive

Expanding Options

 

O_o

Hello everyone,

I'm not used to introducing myself. I'm unused to the practice so I don't think I'll waste your time now doing a poor job of it.

I needed a configuration that "Xpad" doesn't normally support to suppress warnings from my environment. I fixed that with a poorly punned hack, but I found that quite a few people were requesting some similar features so I made a legitimate go of following the style and organization of the existing code.

I apologize now if I've overstepped; I'm simply used to posting short patches on a lot mailing lists; I intend no offence.

Before I discuss the patch, I'd like to ask about "XLib"/"GDK" dependencies. I started to work on allowing opacity to be configured, but I didn't see any overt dependencies on the platform specific libraries. I wanted to get some thoughts on conditional dependencies before I put any effort in that direction because I don't know how to even begin to approach "pseudo-transparency" with "gtk" alone.

The patch below adds several new options:

1): Implemented a "daemon mode" style option for running "Xpad" in the background without requiring at least one note or the tray icon.

2): Duplicated, for good and evil, the CLI argument handling for the pad options for setting or toggling visibility so that such operation can be done without mouse input.

3): Added an option to eliminate the context menu on pads.

4): Extended the tray icon options to allow configuration of the left and right mouse buttons.

Soma

[Code]
diff -ruN original/src/xpad-app.c patch.01/src/xpad-app.c
--- original/src/xpad-app.c	2014-06-25 04:25:53.000000000 -0500
+++ patch.01/src/xpad-app.c	2014-07-05 11:53:11.815472000 -0500
@@ -402,7 +402,9 @@
 static gboolean
 xpad_app_quit_if_no_pads (XpadPadGroup *group)
 {
-	if (!xpad_tray_is_open ())
+	gboolean daemon_enabled;
+	g_object_get (settings, "daemon-enabled", &daemon_enabled, NULL);
+	if (!xpad_tray_is_open () && !daemon_enabled)
 	{
 		gint num_pads = xpad_pad_group_num_visible_pads (group);
 		if (num_pads == 0)
@@ -420,9 +422,12 @@
 static gboolean
 xpad_app_first_idle_check (XpadPadGroup *group)
 {
+	gboolean daemon_enabled;
+	g_object_get (settings, "daemon-enabled", &daemon_enabled, NULL);
 	/* We do this check at the first idle rather than immediately during
 	   start because we want to give the tray time to become embedded. */
 	if (!xpad_tray_is_open () &&
+	    !daemon_enabled &&
 	    xpad_pad_group_num_visible_pads (group) == 0)
 	{
 		if (pads_loaded_on_start > 0)
@@ -906,7 +911,20 @@
 		/* Don't quit.  Bad options passed to the main xpad program by other
 		   iterations shouldn't close the main one. */
 	}
-	
+
+	if (have_gtk && pad_group)
+	{
+		if (option_toggle)
+			xpad_pad_group_toggle_hide (pad_group);
+		else
+		{
+			if (option_show)
+				xpad_pad_group_show_all (pad_group);
+			if (option_hide)
+				xpad_pad_group_close_all (pad_group);
+		}
+	}
+
 	g_option_context_free (context);
 	
 	return(option_new || option_quit || option_smid || option_files ||
diff -ruN original/src/xpad-pad.c patch.01/src/xpad-pad.c
--- original/src/xpad-pad.c	2014-06-25 04:25:53.000000000 -0500
+++ patch.01/src/xpad-pad.c	2014-06-30 18:34:44.283225000 -0500
@@ -1847,7 +1847,14 @@
 {
 	GtkTextBuffer *buffer;
 	GtkWidget *menu;
-	
+	gboolean has_menu;
+	g_object_get (pad->priv->settings, "has-menu", &has_menu, NULL);
+
+	if (!has_menu)
+	{
+		return;
+	}
+
 	buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (pad->priv->textview));
 	
 	if (gtk_text_buffer_get_selection_bounds (buffer, NULL, NULL))
diff -ruN original/src/xpad-preferences.c patch.01/src/xpad-preferences.c
--- original/src/xpad-preferences.c	2014-06-25 04:25:53.000000000 -0500
+++ patch.01/src/xpad-preferences.c	2014-07-05 12:21:13.322103000 -0500
@@ -45,6 +45,9 @@
 	GtkWidget *autostart_display_pads;
 	GtkWidget *tray_enabled;
 	GtkWidget *tray_click_configuration;
+	GtkWidget *tray_menu_configuration;
+	GtkWidget *daemon_enabled;
+	GtkWidget *menucheck;
 	GtkWidget *editcheck;
 	GtkWidget *confirmcheck;

@@ -61,6 +64,9 @@
 	gulong autostart_display_pads_handler;	
 	gulong tray_enabled_handler;
 	gulong tray_click_handler;
+	gulong tray_menu_handler;
+	gulong daemon_enabled_handler;
+	gulong menucheck_handler;
 	gulong editcheck_handler;
 	gulong confirmcheck_handler;

@@ -75,6 +81,9 @@
 	gulong notify_autostart_display_pads_handler;
 	gulong notify_tray_enabled_handler;
 	gulong notify_tray_click_handler;
+	gulong notify_tray_menu_handler;
+	gulong notify_daemon_enabled_handler;
+	gulong notify_menu_handler;
 	gulong notify_edit_handler;
 	gulong notify_confirm_handler;
 };
@@ -100,6 +109,9 @@
static void change_autostart_display_pads (GtkComboBox *box, XpadPreferences *pref); static void change_tray_enabled (GtkToggleButton *button, XpadPreferences *pref);
 static void change_tray_click (GtkComboBox *box, XpadPreferences *pref);
+static void change_menu_click (GtkComboBox *box, XpadPreferences *pref);
+static void change_daemon_enabled (GtkToggleButton *button, XpadPreferences *pref); +static void change_menu_check (GtkToggleButton *button, XpadPreferences *pref); static void change_edit_check (GtkToggleButton *button, XpadPreferences *pref); static void change_confirm_check (GtkToggleButton *button, XpadPreferences *pref);

@@ -114,6 +126,9 @@
 static void notify_autostart_display_pads (XpadPreferences *pref);
 static void notify_tray_enabled (XpadPreferences *pref);
 static void notify_tray_click (XpadPreferences *pref);
+static void notify_menu_click (XpadPreferences *pref);
+static void notify_daemon_enabled (XpadPreferences *pref);
+static void notify_menu (XpadPreferences *pref);
 static void notify_edit (XpadPreferences *pref);
 static void notify_confirm (XpadPreferences *pref);

@@ -175,16 +190,19 @@
GtkSizeGroup *size_group_labels = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
 	GtkRequisition req;
GdkRGBA theme_text_color = {0, 0, 0, 0}, theme_background_color = {0, 0, 0, 0};
-	guint tray_click_configuration, autostart_delay, autostart_display_pads;
- gboolean confirm_destroy, edit_lock, autostart_xpad, autostart_wait_systray, autostart_new_pad, autostart_sticky; + guint tray_click_configuration, tray_menu_configuration, autostart_delay, autostart_display_pads; + gboolean daemon_enabled, confirm_destroy, edit_lock, has_menu, autostart_xpad, autostart_wait_systray, autostart_new_pad, autostart_sticky;

 	g_object_get (pref->priv->settings,
 			"fontname", &fontname,
 			"text-color", &text_color,
 			"back-color", &back_color,
+			"daemon-enabled", &daemon_enabled,
 			"confirm-destroy", &confirm_destroy,
 			"edit-lock", &edit_lock,
+			"has-menu", &has_menu,
 			"tray-click-configuration", &tray_click_configuration,
+			"tray-menu-configuration", &tray_menu_configuration,
 			"autostart-xpad", &autostart_xpad,
 			"autostart-wait-systray", &autostart_wait_systray,
 			"autostart-new-pad", &autostart_new_pad,
@@ -394,6 +412,8 @@
label = gtk_label_new_with_mnemonic(_("Tray left mouse click behaviour"));
 	pref->priv->tray_click_configuration = gtk_combo_box_text_new();
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (pref->priv->tray_click_configuration), _("Do Nothing") ); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (pref->priv->tray_click_configuration), _("Show All") ); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (pref->priv->tray_click_configuration), _("Hide All") ); gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (pref->priv->tray_click_configuration), _("Toggle Show All") ); gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (pref->priv->tray_click_configuration), _("List of Pads") ); gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (pref->priv->tray_click_configuration), _("New Pad") );
@@ -403,6 +423,21 @@
gtk_box_pack_start(hbox, pref->priv->tray_click_configuration, TRUE, TRUE, 0);
 	gtk_box_pack_start(tray_vbox, GTK_WIDGET (hbox), TRUE, TRUE, 0);

+ label = gtk_label_new_with_mnemonic(_("Tray right mouse click behaviour"));
+	pref->priv->tray_menu_configuration = gtk_combo_box_text_new();
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (pref->priv->tray_menu_configuration), _("Do Nothing") ); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (pref->priv->tray_menu_configuration), _("Show All") ); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (pref->priv->tray_menu_configuration), _("Hide All") ); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (pref->priv->tray_menu_configuration), _("Toggle Show All") ); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (pref->priv->tray_menu_configuration), _("List of Pads") ); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (pref->priv->tray_menu_configuration), _("New Pad") ); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (pref->priv->tray_menu_configuration), _("Show Menu") ); + gtk_combo_box_set_active (GTK_COMBO_BOX (pref->priv->tray_menu_configuration), tray_menu_configuration);
+	hbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12));
+	gtk_box_pack_start(hbox, label, FALSE, FALSE, 0);
+ gtk_box_pack_start(hbox, pref->priv->tray_menu_configuration, TRUE, TRUE, 0);
+	gtk_box_pack_start(tray_vbox, GTK_WIDGET (hbox), TRUE, TRUE, 0);
+
 	/* Other options */
 	label = create_label (_("Other"));

@@ -421,12 +456,18 @@
 		"child", alignment,
 		NULL));

+ pref->priv->daemon_enabled = gtk_check_button_new_with_mnemonic (_("_Enable daemon mode")); + pref->priv->menucheck = gtk_check_button_new_with_mnemonic (_("_Enable pad menu")); pref->priv->editcheck = gtk_check_button_new_with_mnemonic (_("_Make pads read-only")); pref->priv->confirmcheck = gtk_check_button_new_with_mnemonic (_("_Confirm pad deletion"));

+ gtk_box_pack_start (other_vbox, pref->priv->daemon_enabled, FALSE, FALSE, 0);
+	gtk_box_pack_start (other_vbox, pref->priv->menucheck, FALSE, FALSE, 0);
 	gtk_box_pack_start (other_vbox, pref->priv->editcheck, FALSE, FALSE, 0);
gtk_box_pack_start (other_vbox, pref->priv->confirmcheck, FALSE, FALSE, 0);
 	
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->daemon_enabled), daemon_enabled); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->menucheck), has_menu); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->editcheck), edit_lock); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->confirmcheck), confirm_destroy);

@@ -452,6 +493,10 @@

pref->priv->tray_enabled_handler = g_signal_connect (pref->priv->tray_enabled, "toggled", G_CALLBACK (change_tray_enabled), pref); pref->priv->tray_click_handler = g_signal_connect(pref->priv->tray_click_configuration, "changed", G_CALLBACK(change_tray_click), pref); + pref->priv->tray_menu_handler = g_signal_connect(pref->priv->tray_menu_configuration, "changed", G_CALLBACK(change_menu_click), pref);
+
+ pref->priv->daemon_enabled_handler = g_signal_connect (pref->priv->daemon_enabled, "toggled", G_CALLBACK (change_daemon_enabled), pref); + pref->priv->menucheck_handler = g_signal_connect (pref->priv->menucheck, "toggled", G_CALLBACK (change_menu_check), pref); pref->priv->editcheck_handler = g_signal_connect (pref->priv->editcheck, "toggled", G_CALLBACK (change_edit_check), pref); pref->priv->confirmcheck_handler = g_signal_connect (pref->priv->confirmcheck, "toggled", G_CALLBACK (change_confirm_check), pref);

@@ -465,10 +510,13 @@
pref->priv->notify_autostart_new_pad_handler = g_signal_connect_swapped (pref->priv->settings, "notify::autostart-new-pad", G_CALLBACK (notify_autostart_new_pad), pref); pref->priv->notify_autostart_sticky_handler = g_signal_connect_swapped (pref->priv->settings, "notify::autostart-sticky", G_CALLBACK (notify_autostart_sticky), pref); pref->priv->notify_autostart_display_pads_handler = g_signal_connect_swapped (pref->priv->settings, "notify::autostart-display-pads", G_CALLBACK (notify_autostart_display_pads), pref); + pref->priv->notify_daemon_enabled_handler = g_signal_connect_swapped (pref->priv->settings, "notify::daemon-enabled", G_CALLBACK (notify_menu), pref); + pref->priv->notify_menu_handler = g_signal_connect_swapped (pref->priv->settings, "notify::has-menu", G_CALLBACK (notify_menu), pref); pref->priv->notify_edit_handler = g_signal_connect_swapped (pref->priv->settings, "notify::edit-lock", G_CALLBACK (notify_edit), pref); pref->priv->notify_confirm_handler = g_signal_connect_swapped (pref->priv->settings, "notify::confirm-destroy", G_CALLBACK (notify_confirm), pref); pref->priv->notify_tray_enabled_handler = g_signal_connect_swapped (pref->priv->settings, "notify::tray-enabled", G_CALLBACK (notify_tray_enabled), pref); pref->priv->notify_tray_click_handler = g_signal_connect_swapped (pref->priv->settings, "notify::tray-click-configuration", G_CALLBACK(notify_tray_click), pref); + pref->priv->notify_tray_menu_handler = g_signal_connect_swapped (pref->priv->settings, "notify::tray-menu-configuration", G_CALLBACK(notify_menu_click), pref);
 	
 	g_object_unref (size_group_labels);

@@ -714,6 +762,30 @@
 }

 static void
+change_menu_click (GtkComboBox *box, XpadPreferences *pref)
+{
+ g_signal_handler_block(pref->priv->settings, pref->priv->notify_tray_menu_handler); + g_object_set (pref->priv->settings, "tray-menu-configuration", (guint) gtk_combo_box_get_active (box), NULL); + g_signal_handler_unblock (pref->priv->settings, pref->priv->notify_tray_menu_handler);
+}
+
+static void
+change_daemon_enabled (GtkToggleButton *button, XpadPreferences *pref)
+{
+ g_signal_handler_block (pref->priv->settings, pref->priv->notify_daemon_enabled_handler); + g_object_set (pref->priv->settings, "daemon-enabled", gtk_toggle_button_get_active (button), NULL); + g_signal_handler_unblock (pref->priv->settings, pref->priv->notify_daemon_enabled_handler);
+}
+
+static void
+change_menu_check (GtkToggleButton *button, XpadPreferences *pref)
+{
+ g_signal_handler_block (pref->priv->settings, pref->priv->notify_menu_handler); + g_object_set (pref->priv->settings, "has-menu", gtk_toggle_button_get_active (button), NULL); + g_signal_handler_unblock (pref->priv->settings, pref->priv->notify_menu_handler);
+}
+
+static void
 change_edit_check (GtkToggleButton *button, XpadPreferences *pref)
 {
g_signal_handler_block (pref->priv->settings, pref->priv->notify_edit_handler);
@@ -892,6 +964,36 @@
g_signal_handler_unblock (pref->priv->tray_click_configuration, pref->priv->tray_click_handler);
 }

+static void
+notify_menu_click (XpadPreferences *pref)
+{
+	guint value;
+ g_object_get (pref->priv->settings, "tray-menu-configuration", &value, NULL); + g_signal_handler_block (pref->priv->tray_menu_configuration, pref->priv->tray_menu_handler); + gtk_combo_box_set_active (GTK_COMBO_BOX (pref->priv->tray_menu_configuration), value); + g_signal_handler_unblock (pref->priv->tray_menu_configuration, pref->priv->tray_menu_handler);
+}
+
+static void
+daemon_enabled (XpadPreferences *pref)
+{
+	gboolean value;
+	g_object_get (pref->priv->settings, "daemon-enabled", &value, NULL);
+ g_signal_handler_block (pref->priv->daemon_enabled, pref->priv->daemon_enabled_handler); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->daemon_enabled), value); + g_signal_handler_unblock (pref->priv->daemon_enabled, pref->priv->daemon_enabled_handler);
+}
+
+static void
+notify_menu (XpadPreferences *pref)
+{
+	gboolean value;
+	g_object_get (pref->priv->settings, "has-menu", &value, NULL);
+ g_signal_handler_block (pref->priv->menucheck, pref->priv->menucheck_handler); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->menucheck), value); + g_signal_handler_unblock (pref->priv->menucheck, pref->priv->menucheck_handler);
+}
+
 static void
 notify_edit (XpadPreferences *pref)
 {
diff -ruN original/src/xpad-settings.c patch.01/src/xpad-settings.c
--- original/src/xpad-settings.c	2014-06-25 04:25:53.000000000 -0500
+++ patch.01/src/xpad-settings.c	2014-07-05 11:34:10.162163000 -0500
@@ -35,10 +35,13 @@
 	gboolean confirm_destroy;
 	gboolean edit_lock;
 	gboolean tray_enabled;
+	gboolean daemon_enabled;
 	guint tray_click_configuration;
+	guint tray_menu_configuration;
 	gboolean has_toolbar;
 	gboolean autohide_toolbar;
 	gboolean has_scrollbar;
+	gboolean menu_disable;
 	GdkRGBA *text;
 	GdkRGBA *back;
 	const gchar *fontname;
@@ -69,10 +72,13 @@
   PROP_CONFIRM_DESTROY,
   PROP_EDIT_LOCK,
   PROP_TRAY_ENABLED,
+  PROP_DAEMON_ENABLED,
   PROP_TRAY_CLICK_CONFIGURATION,
+  PROP_TRAY_MENU_CONFIGURATION,
   PROP_HAS_TOOLBAR,
   PROP_AUTOHIDE_TOOLBAR,
   PROP_HAS_SCROLLBAR,
+  PROP_MENU_DISABLE,
   PROP_TEXT_COLOR,
   PROP_BACK_COLOR,
   PROP_FONTNAME,
@@ -115,10 +121,13 @@
obj_prop[PROP_CONFIRM_DESTROY] = g_param_spec_boolean ("confirm-destroy", "Confirm destroy", "Ask for delete confirmation", TRUE, G_PARAM_READWRITE); obj_prop[PROP_EDIT_LOCK] = g_param_spec_boolean ("edit-lock", "Edit lock", "Toggle read-only mode", FALSE, G_PARAM_READWRITE); obj_prop[PROP_TRAY_ENABLED] = g_param_spec_boolean ("tray-enabled", "Enable tray icon", "Enable or disable the systray icon", TRUE, G_PARAM_READWRITE); - obj_prop[PROP_TRAY_CLICK_CONFIGURATION] = g_param_spec_uint ("tray-click-configuration", "Tray click configuration", "Configure tray left click", 0, G_MAXUINT, 0, G_PARAM_READWRITE); + obj_prop[PROP_DAEMON_ENABLED] = g_param_spec_boolean ("daemon-enabled", "Enable daemon mode", "Enable or disable daemon mode", FALSE, G_PARAM_READWRITE); + obj_prop[PROP_TRAY_CLICK_CONFIGURATION] = g_param_spec_uint ("tray-click-configuration", "Tray click configuration", "Configure tray left click", 0, G_MAXUINT, 5, G_PARAM_READWRITE); + obj_prop[PROP_TRAY_MENU_CONFIGURATION] = g_param_spec_uint ("tray-menu-configuration", "Tray menu configuration", "Configure tray right click", 0, G_MAXUINT, 6, G_PARAM_READWRITE); obj_prop[PROP_HAS_TOOLBAR] = g_param_spec_boolean ("has-toolbar", "Has toolbar", "Whether pads have toolbars", TRUE, G_PARAM_READWRITE); obj_prop[PROP_AUTOHIDE_TOOLBAR] = g_param_spec_boolean ("autohide-toolbar", "Autohide toolbar", "Hide toolbars when not used", TRUE, G_PARAM_READWRITE); obj_prop[PROP_HAS_SCROLLBAR] = g_param_spec_boolean ("has-scrollbar", "Has scrollbar", "Whether pads have scrollbars", TRUE, G_PARAM_READWRITE); + obj_prop[PROP_MENU_DISABLE] = g_param_spec_boolean ("has-menu", "Has menu", "Whether pads have context menus", TRUE, G_PARAM_READWRITE); obj_prop[PROP_FONTNAME] = g_param_spec_string ("fontname", "Font name", "Default name of pad font", NULL, G_PARAM_READWRITE); obj_prop[PROP_TEXT_COLOR] = g_param_spec_boxed ("text-color", "Text color", "Default color of pad text", GDK_TYPE_RGBA, G_PARAM_READWRITE); obj_prop[PROP_BACK_COLOR] = g_param_spec_boxed ("back-color", "Back color", "Default color of pad background", GDK_TYPE_RGBA, G_PARAM_READWRITE);
@@ -154,10 +163,13 @@
 	settings->priv->confirm_destroy = TRUE;
 	settings->priv->edit_lock = FALSE;
 	settings->priv->tray_enabled = TRUE;
-	settings->priv->tray_click_configuration = 1;
+	settings->priv->daemon_enabled = FALSE;
+	settings->priv->tray_click_configuration = 5;
+	settings->priv->tray_menu_configuration = 6;
 	settings->priv->has_toolbar = TRUE;
 	settings->priv->autohide_toolbar = TRUE;
 	settings->priv->has_scrollbar = TRUE;
+	settings->priv->menu_disable = TRUE;
 	settings->priv->fontname = NULL;
/* A pleasant light yellow background color, similar to commercial sticky notes, with black text. */
 	settings->priv->text = gdk_rgba_copy(&(GdkRGBA) {0, 0, 0, 1});
@@ -289,9 +301,17 @@
 		settings->priv->tray_enabled = g_value_get_boolean (value);
 		break;

+	case PROP_DAEMON_ENABLED:
+		settings->priv->daemon_enabled = g_value_get_boolean (value);
+		break;
+
 	case PROP_TRAY_CLICK_CONFIGURATION:
 		settings->priv->tray_click_configuration = g_value_get_uint(value);
 		break;
+
+	case PROP_TRAY_MENU_CONFIGURATION:
+		settings->priv->tray_menu_configuration = g_value_get_uint(value);
+		break;
 		
 	case PROP_HAS_TOOLBAR:
 		settings->priv->has_toolbar = g_value_get_boolean (value);
@@ -304,6 +324,10 @@
 	case PROP_HAS_SCROLLBAR:
 		settings->priv->has_scrollbar = g_value_get_boolean (value);
 		break;
+
+	case PROP_MENU_DISABLE:
+		settings->priv->menu_disable = g_value_get_boolean (value);
+		break;
 	
 	case PROP_TEXT_COLOR:
 		if (settings->priv->text)
@@ -423,10 +447,18 @@
 		g_value_set_boolean (value, settings->priv->tray_enabled);
 		break;

+	case PROP_DAEMON_ENABLED:
+		g_value_set_boolean (value, settings->priv->daemon_enabled);
+		break;
+
 	case PROP_TRAY_CLICK_CONFIGURATION:
 		g_value_set_uint (value, settings->priv->tray_click_configuration);
 		break;

+	case PROP_TRAY_MENU_CONFIGURATION:
+		g_value_set_uint (value, settings->priv->tray_menu_configuration);
+		break;
+
 	case PROP_HAS_TOOLBAR:
 		g_value_set_boolean (value, settings->priv->has_toolbar);
 		break;
@@ -438,6 +470,10 @@
 	case PROP_HAS_SCROLLBAR:
 		g_value_set_boolean (value, settings->priv->has_scrollbar);
 		break;
+
+	case PROP_MENU_DISABLE:
+		g_value_set_boolean (value, settings->priv->menu_disable);
+		break;
 	
 	case PROP_TEXT_COLOR:
 		if (settings->priv->text)
@@ -514,7 +550,9 @@
 		"b|edit_lock", &settings->priv->edit_lock,
 		"b|sticky_on_start", &settings->priv->autostart_sticky,
 		"b|tray_enabled", &settings->priv->tray_enabled,
+		"b|daemon_enabled", &settings->priv->daemon_enabled,
 		"u|tray_click_configuration", &settings->priv->tray_click_configuration,
+		"u|tray_menu_configuration", &settings->priv->tray_menu_configuration,
 		"s|back", &background_color_string,
 		"b|use_back", &use_back,
 		"s|text", &text_color_string,
@@ -523,6 +561,7 @@
 		"b|toolbar", &settings->priv->has_toolbar,
 		"b|auto_hide_toolbar", &settings->priv->autohide_toolbar,
 		"b|scrollbar", &settings->priv->has_scrollbar,
+		"b|pad_menu", &settings->priv->menu_disable,
 		"s|buttons", &buttons,
 		"b|autostart_wait_systray", &settings->priv->autostart_wait_systray,
 		"u|autostart_delay", &settings->priv->autostart_delay,		
@@ -625,7 +664,9 @@
 		"b|edit_lock", settings->priv->edit_lock,
 		"b|sticky_on_start", settings->priv->autostart_sticky,
 		"b|tray_enabled", settings->priv->tray_enabled,
+		"b|daemon_enabled", settings->priv->daemon_enabled,
 		"u|tray_click_configuration", settings->priv->tray_click_configuration,
+		"u|tray_menu_configuration", settings->priv->tray_menu_configuration,
"s|back", settings->priv->back ? gdk_rgba_to_string (settings->priv->back) : "NULL",
 		"b|use_back", settings->priv->back ? TRUE : FALSE,
"s|text", settings->priv->text ? gdk_rgba_to_string (settings->priv->text) : "NULL",
@@ -634,6 +675,7 @@
 		"b|toolbar", settings->priv->has_toolbar,
 		"b|auto_hide_toolbar", settings->priv->autohide_toolbar,
 		"b|scrollbar", settings->priv->has_scrollbar,
+		"b|pad_menu", settings->priv->menu_disable,
 		"s|buttons", buttons,
 		"b|autostart_wait_systray", settings->priv->autostart_wait_systray,
 		"u|autostart_delay", settings->priv->autostart_delay,		
diff -ruN original/src/xpad-tray.c patch.01/src/xpad-tray.c
--- original/src/xpad-tray.c	2014-06-25 04:25:53.000000000 -0500
+++ patch.01/src/xpad-tray.c	2014-07-05 10:55:01.202213000 -0500
@@ -34,9 +34,12 @@
 enum
 {
 	DO_NOTHING,
+	SHOW_ALL,
+	HIDE_ALL,
 	TOGGLE_SHOW_ALL,
 	LIST_OF_PADS,
-	NEW_PAD
+	NEW_PAD,
+	SHOW_MENU
 };

 static void xpad_tray_open (XpadSettings *settings);
@@ -124,50 +127,74 @@
 	gboolean no_pads = FALSE;
 	XpadPadGroup *group;

+	guint tray_menu_configuration;
+ g_object_get (settings, "tray-menu-configuration", &tray_menu_configuration, NULL);
+
 	group = xpad_app_get_pad_group ();
-	
-	menu = gtk_menu_new ();
-	if (!xpad_pad_group_num_pads (group))
-		no_pads = TRUE;
-	
-	item = gtk_menu_item_new_with_mnemonic (_("_New"));
- g_signal_connect_swapped (item, "activate", G_CALLBACK (menu_spawn), settings);
-	gtk_container_add (GTK_CONTAINER (menu), item);
-	
-	item = gtk_separator_menu_item_new ();
-	gtk_container_add (GTK_CONTAINER (menu), item);
-
-	item = gtk_menu_item_new_with_mnemonic (_("_Show All"));
- g_signal_connect_swapped (item, "activate", G_CALLBACK (xpad_pad_group_show_all), group);
-	gtk_container_add (GTK_CONTAINER (menu), item);
-	if (no_pads)
-		gtk_widget_set_sensitive (item, FALSE);
-	
-	item = gtk_menu_item_new_with_mnemonic (_("_Close All"));
- g_signal_connect_swapped (item, "activate", G_CALLBACK (xpad_pad_group_close_all), group);
-	gtk_container_add (GTK_CONTAINER (menu), item);
-	if (no_pads)
-		gtk_widget_set_sensitive (item, FALSE);
-	
-	item = gtk_separator_menu_item_new ();
-	gtk_container_add (GTK_CONTAINER (menu), item);
-	
-	xpad_pad_append_pad_titles_to_menu (menu);
-
-	item = gtk_separator_menu_item_new ();
-	gtk_container_add (GTK_CONTAINER (menu), item);
-	
-	item = gtk_menu_item_new_with_mnemonic (_("_Preferences"));	
- g_signal_connect_swapped (item, "activate", G_CALLBACK (xpad_preferences_open), settings);
-	gtk_container_add (GTK_CONTAINER (menu), item);
-	
-	item = gtk_menu_item_new_with_mnemonic (_("_Quit"));	
-	g_signal_connect (item, "activate", G_CALLBACK (xpad_app_quit), NULL);
-	gtk_container_add (GTK_CONTAINER (menu), item);
-	
-	gtk_widget_show_all (menu);

- gtk_menu_popup (GTK_MENU (menu), NULL, NULL, gtk_status_icon_position_menu, icon, button, time);
+
+	switch (tray_menu_configuration)
+	{
+		case SHOW_ALL:
+			xpad_pad_group_show_all (group);
+			break;
+		case HIDE_ALL:
+			xpad_pad_group_close_all (group);
+			break;			
+		case TOGGLE_SHOW_ALL:
+			xpad_pad_group_toggle_hide (group);
+			break;
+		case LIST_OF_PADS:
+			xpad_tray_show_windows_list (icon);
+			break;
+		case NEW_PAD:
+			menu_spawn (settings);
+			break;
+		case SHOW_MENU:
+			menu = gtk_menu_new ();
+			if (!xpad_pad_group_num_pads (group))
+				no_pads = TRUE;
+			
+			item = gtk_menu_item_new_with_mnemonic (_("_New"));
+ g_signal_connect_swapped (item, "activate", G_CALLBACK (menu_spawn), settings);
+			gtk_container_add (GTK_CONTAINER (menu), item);
+			
+			item = gtk_separator_menu_item_new ();
+			gtk_container_add (GTK_CONTAINER (menu), item);
+
+			item = gtk_menu_item_new_with_mnemonic (_("_Show All"));
+ g_signal_connect_swapped (item, "activate", G_CALLBACK (xpad_pad_group_show_all), group);
+			gtk_container_add (GTK_CONTAINER (menu), item);
+			if (no_pads)
+				gtk_widget_set_sensitive (item, FALSE);
+			
+			item = gtk_menu_item_new_with_mnemonic (_("_Close All"));
+ g_signal_connect_swapped (item, "activate", G_CALLBACK (xpad_pad_group_close_all), group);
+			gtk_container_add (GTK_CONTAINER (menu), item);
+			if (no_pads)
+				gtk_widget_set_sensitive (item, FALSE);
+			
+			item = gtk_separator_menu_item_new ();
+			gtk_container_add (GTK_CONTAINER (menu), item);
+			
+			xpad_pad_append_pad_titles_to_menu (menu);
+
+			item = gtk_separator_menu_item_new ();
+			gtk_container_add (GTK_CONTAINER (menu), item);
+			
+			item = gtk_menu_item_new_with_mnemonic (_("_Preferences"));	
+ g_signal_connect_swapped (item, "activate", G_CALLBACK (xpad_preferences_open), settings);
+			gtk_container_add (GTK_CONTAINER (menu), item);
+			
+			item = gtk_menu_item_new_with_mnemonic (_("_Quit"));	
+			g_signal_connect (item, "activate", G_CALLBACK (xpad_app_quit), NULL);
+			gtk_container_add (GTK_CONTAINER (menu), item);
+			
+			gtk_widget_show_all (menu);
+
+ gtk_menu_popup (GTK_MENU (menu), NULL, NULL, gtk_status_icon_position_menu, icon, button, time);
+			break;
+	}
 }

static void xpad_tray_activate_cb (GtkStatusIcon *icon, XpadSettings *settings) {
@@ -178,6 +205,12 @@

 	switch (tray_click_configuration)
 	{
+		case SHOW_ALL:
+			xpad_pad_group_show_all (group);
+			break;
+		case HIDE_ALL:
+			xpad_pad_group_close_all (group);
+			break;			
 		case TOGGLE_SHOW_ALL:
 			xpad_pad_group_toggle_hide (group);
 			break;
[/Code]


Follow ups