[Xfce4-commits] <xfce4-panel:andrzejr/deskbar-github> pager: added starting_corner properties to the pagers to orientate them properly in vertical modes.
Andrzej
noreply at xfce.org
Mon Dec 12 11:40:44 CET 2011
Updating branch refs/heads/andrzejr/deskbar-github
to f5ef7226cdcaef7065a06477738f8662c10a0df5 (commit)
from 22fc12a21d322975a7c37554f0b2e9c4de3248c0 (commit)
commit f5ef7226cdcaef7065a06477738f8662c10a0df5
Author: Andrzej <ndrwrdck at gmail.com>
Date: Tue Nov 29 15:07:09 2011 +0900
pager: added starting_corner properties to the pagers to orientate them properly in vertical modes.
plugins/pager/pager-buttons.c | 142 +++++++++++++++++++++++++++++++--------
plugins/pager/pager-buttons.h | 2 +
plugins/pager/pager-wnck.c | 148 +++++++++++++++++++++++-----------------
plugins/pager/pager-wnck.h | 6 +-
plugins/pager/pager.c | 46 ++++++++++++-
plugins/pager/pager.h | 11 +++
6 files changed, 258 insertions(+), 97 deletions(-)
diff --git a/plugins/pager/pager-buttons.c b/plugins/pager/pager-buttons.c
index 4d773f0..e201647 100644
--- a/plugins/pager/pager-buttons.c
+++ b/plugins/pager/pager-buttons.c
@@ -25,6 +25,7 @@
#include <libxfce4panel/libxfce4panel.h>
#include <common/panel-private.h>
+#include "pager.h"
#include "pager-buttons.h"
@@ -76,6 +77,7 @@ struct _PagerButtons
gint rows;
GtkOrientation orientation;
+ PagerLayoutCorner starting_corner;
};
enum
@@ -83,7 +85,8 @@ enum
PROP_0,
PROP_SCREEN,
PROP_ROWS,
- PROP_ORIENTATION
+ PROP_ORIENTATION,
+ PROP_STARTING_CORNER
};
enum
@@ -131,6 +134,14 @@ pager_buttons_class_init (PagerButtonsClass *klass)
GTK_TYPE_ORIENTATION,
GTK_ORIENTATION_HORIZONTAL,
EXO_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class,
+ PROP_ORIENTATION,
+ g_param_spec_enum ("starting-corner",
+ NULL, NULL,
+ XFCE_TYPE_PAGER_LAYOUT_CORNER,
+ PAGER_LAYOUT_CORNER_TOPLEFT,
+ EXO_PARAM_READWRITE));
}
@@ -141,6 +152,7 @@ pager_buttons_init (PagerButtons *pager)
pager->rows = 1;
pager->wnck_screen = NULL;
pager->orientation = GTK_ORIENTATION_HORIZONTAL;
+ pager->starting_corner = PAGER_LAYOUT_CORNER_TOPLEFT;
pager->buttons = NULL;
pager->rebuild_id = 0;
@@ -170,6 +182,10 @@ pager_buttons_get_property (GObject *object,
g_value_set_enum (value, pager->orientation);
break;
+ case PROP_STARTING_CORNER:
+ g_value_set_enum (value, pager->starting_corner);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -212,6 +228,10 @@ pager_buttons_set_property (GObject *object,
pager_buttons_set_orientation (pager, g_value_get_enum (value));
break;
+ case PROP_STARTING_CORNER:
+ pager_buttons_set_starting_corner (pager, g_value_get_enum (value));
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -269,6 +289,58 @@ pager_buttons_button_press_event (GtkWidget *button,
}
+static void
+pager_buttons_assign_position (PagerButtons *pager, gint n, gint rows, gint cols, gint *row, gint *col)
+{
+ *row = *col = 0;
+ if (pager->orientation == GTK_ORIENTATION_HORIZONTAL)
+ switch (pager->starting_corner)
+ {
+ case PAGER_LAYOUT_CORNER_TOPLEFT:
+ *col = n / cols;
+ *row = n % cols;
+ break;
+
+ case PAGER_LAYOUT_CORNER_TOPRIGHT:
+ *col = n / cols;
+ *row = (cols - 1) - n % cols;
+ break;
+
+ case PAGER_LAYOUT_CORNER_BOTTOMLEFT:
+ *col = (rows - 1) - n / cols;
+ *row = n % cols;
+ break;
+
+ case PAGER_LAYOUT_CORNER_BOTTOMRIGHT:
+ *col = (rows - 1) - n / cols;
+ *row = (cols - 1) - n % cols;
+ break;
+ }
+ else
+ switch (pager->starting_corner)
+ {
+ case PAGER_LAYOUT_CORNER_TOPLEFT:
+ *col = n % cols;
+ *row = n / cols;
+ break;
+
+ case PAGER_LAYOUT_CORNER_TOPRIGHT:
+ *col = n % cols;
+ *row = (rows - 1) - n / cols;
+ break;
+
+ case PAGER_LAYOUT_CORNER_BOTTOMLEFT:
+ *col = (cols - 1) - n % cols;
+ *row = n / cols;
+ break;
+
+ case PAGER_LAYOUT_CORNER_BOTTOMRIGHT:
+ *col = (cols - 1) - n % cols;
+ *row = (rows - 1) - n / cols;
+ break;
+ }
+}
+
static gboolean
pager_buttons_rebuild_idle (gpointer user_data)
@@ -351,10 +423,10 @@ pager_buttons_rebuild_idle (gpointer user_data)
cols++;
}
- if (pager->orientation != GTK_ORIENTATION_HORIZONTAL)
- SWAP_INTEGER (rows, cols);
-
- gtk_table_resize (GTK_TABLE (pager), rows, cols);
+ if (pager->orientation == GTK_ORIENTATION_HORIZONTAL)
+ gtk_table_resize (GTK_TABLE (pager), rows, cols);
+ else
+ gtk_table_resize (GTK_TABLE (pager), cols, rows);
panel_plugin = gtk_widget_get_ancestor (GTK_WIDGET (pager), XFCE_TYPE_PANEL_PLUGIN);
@@ -387,26 +459,26 @@ pager_buttons_rebuild_idle (gpointer user_data)
g_snprintf (text, sizeof (text), "%d", n + 1);
label = gtk_label_new (text);
- gtk_label_set_angle (GTK_LABEL (label),
- pager->orientation == GTK_ORIENTATION_HORIZONTAL ? 0 : 270);
+ if (pager->orientation == GTK_ORIENTATION_HORIZONTAL)
+ gtk_label_set_angle (GTK_LABEL (label), 0);
+ else if (pager->starting_corner == PAGER_LAYOUT_CORNER_TOPLEFT ||
+ pager->starting_corner == PAGER_LAYOUT_CORNER_BOTTOMLEFT)
+ gtk_label_set_angle (GTK_LABEL (label), 90);
+ else
+ gtk_label_set_angle (GTK_LABEL (label), 270);
gtk_container_add (GTK_CONTAINER (button), label);
gtk_widget_show (label);
- if (pager->orientation == GTK_ORIENTATION_HORIZONTAL)
- {
- row = n % cols;
- col = n / cols;
- }
- else
- {
- col = n % rows;
- row = n / rows;
- }
+ pager->buttons = g_slist_prepend (pager->buttons, button);
+
+ row = col = 0;
+ pager_buttons_assign_position (pager, n, rows, cols, &row, &col);
gtk_table_attach (GTK_TABLE (pager), button,
row, row + 1, col, col + 1,
GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND,
0, 0);
+
}
}
else
@@ -429,23 +501,20 @@ pager_buttons_rebuild_idle (gpointer user_data)
g_signal_connect_object (G_OBJECT (workspace), "name-changed",
G_CALLBACK (pager_buttons_workspace_button_label), label, 0);
pager_buttons_workspace_button_label (workspace, label);
- gtk_label_set_angle (GTK_LABEL (label),
- pager->orientation == GTK_ORIENTATION_HORIZONTAL ? 0 : 270);
+ if (pager->orientation == GTK_ORIENTATION_HORIZONTAL)
+ gtk_label_set_angle (GTK_LABEL (label), 0);
+ else if (pager->starting_corner == PAGER_LAYOUT_CORNER_TOPLEFT ||
+ pager->starting_corner == PAGER_LAYOUT_CORNER_BOTTOMLEFT)
+ gtk_label_set_angle (GTK_LABEL (label), 90);
+ else
+ gtk_label_set_angle (GTK_LABEL (label), 270);
gtk_container_add (GTK_CONTAINER (button), label);
gtk_widget_show (label);
pager->buttons = g_slist_prepend (pager->buttons, button);
- if (pager->orientation == GTK_ORIENTATION_HORIZONTAL)
- {
- row = n % cols;
- col = n / cols;
- }
- else
- {
- col = n % rows;
- row = n / rows;
- }
+ row = col = 0;
+ pager_buttons_assign_position (pager, n, rows, cols, &row, &col);
gtk_table_attach (GTK_TABLE (pager), button,
row, row + 1, col, col + 1,
@@ -663,3 +732,18 @@ pager_buttons_set_n_rows (PagerButtons *pager,
pager->rows = rows;
pager_buttons_queue_rebuild (pager);
}
+
+
+void
+pager_buttons_set_starting_corner (PagerButtons *pager,
+ PagerLayoutCorner starting_corner)
+{
+ g_return_if_fail (XFCE_IS_PAGER_BUTTONS (pager));
+
+ if (pager->starting_corner == starting_corner)
+ return;
+
+ pager->starting_corner = starting_corner;
+ pager_buttons_queue_rebuild (pager);
+}
+
diff --git a/plugins/pager/pager-buttons.h b/plugins/pager/pager-buttons.h
index b8014f5..39b176a 100644
--- a/plugins/pager/pager-buttons.h
+++ b/plugins/pager/pager-buttons.h
@@ -45,6 +45,8 @@ void pager_buttons_set_orientation (PagerButtons *pager,
void pager_buttons_set_n_rows (PagerButtons *pager,
gint rows);
+void pager_buttons_set_starting_corner (PagerButtons *pager,
+ PagerLayoutCorner starting_corner);
G_END_DECLS
diff --git a/plugins/pager/pager-wnck.c b/plugins/pager/pager-wnck.c
index b5daa33..ef67f83 100644
--- a/plugins/pager/pager-wnck.c
+++ b/plugins/pager/pager-wnck.c
@@ -70,6 +70,7 @@ struct _PagerWnckPrivate
int n_rows; /* really columns for vertical orientation */
PagerWnckDisplayMode display_mode;
PagerLayoutPolicy layout_policy;
+ PagerLayoutCorner starting_corner;
gboolean show_all_workspaces;
GtkShadowType shadow_type;
@@ -228,6 +229,7 @@ pager_wnck_init (PagerWnck *pager)
pager->priv->orientation = GTK_ORIENTATION_HORIZONTAL;
pager->priv->layout_policy = PAGER_LAYOUT_POLICY_WIDTH_FOR_HEIGHT;
+ pager->priv->starting_corner = PAGER_LAYOUT_CORNER_TOPLEFT;
pager->priv->workspace_size = 48;
for (i = 0; i < N_SCREEN_CONNECTIONS; i++)
@@ -716,8 +718,33 @@ pager_wnck_get_workspace_rect (PagerWnck *pager,
rect->width = (hsize - (pager->priv->n_rows - 1)) / pager->priv->n_rows;
rect->height = (vsize - (spaces_per_row - 1)) / spaces_per_row;
- col = space / spaces_per_row;
- row = space % spaces_per_row;
+ switch (pager->priv->starting_corner)
+ {
+ case PAGER_LAYOUT_CORNER_TOPLEFT:
+ col = space / spaces_per_row;
+ row = space % spaces_per_row;
+ break;
+
+ case PAGER_LAYOUT_CORNER_TOPRIGHT:
+ col = (pager->priv->n_rows - 1) - space / spaces_per_row;
+ row = space % spaces_per_row;
+ break;
+
+ case PAGER_LAYOUT_CORNER_BOTTOMLEFT:
+ col = space / spaces_per_row;
+ row = (spaces_per_row - 1) - space % spaces_per_row;
+ break;
+
+ case PAGER_LAYOUT_CORNER_BOTTOMRIGHT:
+ col = (pager->priv->n_rows - 1) - space / spaces_per_row;
+ row = (spaces_per_row - 1) - space % spaces_per_row;
+ break;
+
+ default:
+ row = 0;
+ col = 0;
+ break;
+ }
if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL)
col = pager->priv->n_rows - col - 1;
@@ -736,8 +763,33 @@ pager_wnck_get_workspace_rect (PagerWnck *pager,
rect->width = (hsize - (spaces_per_row - 1)) / spaces_per_row;
rect->height = (vsize - (pager->priv->n_rows - 1)) / pager->priv->n_rows;
- col = space % spaces_per_row;
- row = space / spaces_per_row;
+ switch (pager->priv->starting_corner)
+ {
+ case PAGER_LAYOUT_CORNER_TOPLEFT:
+ row = space / spaces_per_row;
+ col = space % spaces_per_row;
+ break;
+
+ case PAGER_LAYOUT_CORNER_TOPRIGHT:
+ row = space / spaces_per_row;
+ col = (spaces_per_row - 1) - space % spaces_per_row;
+ break;
+
+ case PAGER_LAYOUT_CORNER_BOTTOMLEFT:
+ row = (pager->priv->n_rows - 1) - space / spaces_per_row;
+ col = space % spaces_per_row;
+ break;
+
+ case PAGER_LAYOUT_CORNER_BOTTOMRIGHT:
+ row = (pager->priv->n_rows - 1) - space / spaces_per_row;
+ col = (spaces_per_row - 1) - space % spaces_per_row;
+ break;
+
+ default:
+ row = 0;
+ col = 0;
+ break;
+ }
if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL)
col = spaces_per_row - col - 1;
@@ -2057,16 +2109,8 @@ pager_wnck_set_layout_hint (PagerWnck *pager)
if (!pager->priv->show_all_workspaces)
return FALSE;
- if (pager->priv->orientation == GTK_ORIENTATION_HORIZONTAL)
- {
- layout_rows = pager->priv->n_rows;
- layout_cols = 0;
- }
- else
- {
- layout_rows = 0;
- layout_cols = pager->priv->n_rows;
- }
+ layout_rows = pager->priv->n_rows;
+ layout_cols = 0;
pager->priv->layout_manager_token =
wnck_screen_try_set_workspace_layout (pager->priv->screen,
@@ -2077,62 +2121,20 @@ pager_wnck_set_layout_hint (PagerWnck *pager)
return (pager->priv->layout_manager_token != PAGER_WNCK_NO_MANAGER_TOKEN);
}
-/**
- * pager_wnck_set_orientation:
- * @pager: a #PagerWnck.
- * @orientation: orientation to use for the layout of #WnckWorkspace on the
- * #WnckScreen @pager is watching.
- *
- * Tries to change the orientation of the layout of #WnckWorkspace on the
- * #WnckScreen @pager is watching. Since no more than one application should
- * set this property of a #WnckScreen at a time, setting the layout is not
- * guaranteed to work.
- *
- * If @orientation is %GTK_ORIENTATION_HORIZONTAL, the #WnckWorkspace will be
- * laid out in rows, with the first #WnckWorkspace in the top left corner.
- *
- * If @orientation is %GTK_ORIENTATION_VERTICAL, the #WnckWorkspace will be
- * laid out in columns, with the first #WnckWorkspace in the top left corner.
- *
- * For example, if the layout contains one row, but the orientation of the
- * layout is vertical, the #PagerWnck will display a column of #WnckWorkspace.
- *
- * If @pager has not been added to a widget hierarchy, the call will fail
- * because @pager can't know the screen on which to modify the orientation.
- *
- * Return value: %TRUE if the layout of #WnckWorkspace has been successfully
- * changed or did not need to be changed, %FALSE otherwise.
- */
-gboolean
+void
pager_wnck_set_orientation (PagerWnck *pager,
GtkOrientation orientation)
{
- GtkOrientation old_orientation;
- gboolean old_orientation_is_valid;
-
- g_return_val_if_fail (XFCE_IS_PAGER_WNCK (pager), FALSE);
+ g_return_if_fail (XFCE_IS_PAGER_WNCK (pager));
if (pager->priv->orientation == orientation)
- return TRUE;
-
- old_orientation = pager->priv->orientation;
- old_orientation_is_valid = pager->priv->screen != NULL;
+ return;
pager->priv->orientation = orientation;
-
- if (pager_wnck_set_layout_hint (pager))
- {
- gtk_widget_queue_resize (GTK_WIDGET (pager));
- return TRUE;
- }
- else
- {
- if (old_orientation_is_valid)
- pager->priv->orientation = old_orientation;
- return FALSE;
- }
}
+/* Setting the number of rows of the workspace layout */
+/* will be removed once the switch is moved to the workspace settings. */
gboolean
pager_wnck_set_n_rows (PagerWnck *pager,
int n_rows)
@@ -2187,8 +2189,28 @@ pager_wnck_set_display_mode (PagerWnck *pager,
}
/**
- * wnck_pager_set_layout_policy:
- * @pager: a #WnckPager.
+ * pager_wnck_set_starting_corner:
+ * @pager: a #PagerWnck.
+ * @starting_corner: location of a starting corner.
+ *
+ * Sets the starting corner of the @pager to @starting_corner.
+ */
+void
+pager_wnck_set_starting_corner (PagerWnck *pager,
+ PagerLayoutCorner starting_corner)
+{
+ g_return_if_fail (XFCE_IS_PAGER_WNCK (pager));
+
+ if (pager->priv->starting_corner == starting_corner)
+ return;
+
+ pager->priv->starting_corner = starting_corner;
+ gtk_widget_queue_resize (GTK_WIDGET (pager));
+}
+
+/**
+ * pager_wnck_set_layout_policy:
+ * @pager: a #PagerWnck.
* @policy: a layout policy.
*
* Sets the layout policy for @pager to @policy.
diff --git a/plugins/pager/pager-wnck.h b/plugins/pager/pager-wnck.h
index 3124a1c..2f5401c 100644
--- a/plugins/pager/pager-wnck.h
+++ b/plugins/pager/pager-wnck.h
@@ -84,12 +84,14 @@ void pager_wnck_register_type (XfcePanelTypeModule *type_module);
GtkWidget* pager_wnck_new (WnckScreen *screen);
-gboolean pager_wnck_set_orientation (PagerWnck *pager,
- GtkOrientation orientation);
+void pager_wnck_set_orientation (PagerWnck *pager,
+ GtkOrientation orientation);
gboolean pager_wnck_set_n_rows (PagerWnck *pager,
int n_rows);
void pager_wnck_set_display_mode (PagerWnck *pager,
PagerWnckDisplayMode mode);
+void pager_wnck_set_starting_corner (PagerWnck *pager,
+ PagerLayoutCorner starting_corner);
void pager_wnck_set_layout_policy (PagerWnck *pager,
PagerLayoutPolicy layout_policy);
void pager_wnck_set_show_all (PagerWnck *pager,
diff --git a/plugins/pager/pager.c b/plugins/pager/pager.c
index f13a8d7..e820826 100644
--- a/plugins/pager/pager.c
+++ b/plugins/pager/pager.c
@@ -68,7 +68,27 @@ static void pager_plugin_screen_layout_changed (PagerPlugin *pl
static void pager_plugin_size_request (GtkWidget *widget,
GtkRequisition *requisition);
-
+GType
+pager_layout_corner_get_type (void)
+{
+ static GType layout_corner_type = 0;
+
+ if (!layout_corner_type) {
+ static GEnumValue corner_types[] = {
+ { PAGER_LAYOUT_CORNER_TOPLEFT, "First workspace in top-left corner", "top-left" },
+ { PAGER_LAYOUT_CORNER_TOPRIGHT, "First workspace in top-right corner", "top-right" },
+ { PAGER_LAYOUT_CORNER_BOTTOMLEFT, "First workspace in bottom-left corner", "bottom-left" },
+ { PAGER_LAYOUT_CORNER_BOTTOMRIGHT, "First workspace in bottom-right corner", "bottom-right" },
+ { 0, NULL, NULL },
+ };
+
+ layout_corner_type =
+ g_enum_register_static ("PagerLayoutCorner",
+ corner_types);
+ }
+
+ return layout_corner_type;
+}
struct _PagerPluginClass
{
@@ -310,12 +330,20 @@ pager_plugin_screen_layout_changed (PagerPlugin *plugin)
else
pager_wnck_set_layout_policy (XFCE_PAGER_WNCK (plugin->pager), PAGER_LAYOUT_POLICY_HEIGHT_FOR_WIDTH);
pager_wnck_set_orientation (XFCE_PAGER_WNCK (plugin->pager), plugin_orientation);
+ if (plugin_orientation == GTK_ORIENTATION_HORIZONTAL)
+ pager_wnck_set_starting_corner (XFCE_PAGER_WNCK (plugin->pager), PAGER_LAYOUT_CORNER_TOPLEFT);
+ else
+ pager_wnck_set_starting_corner (XFCE_PAGER_WNCK (plugin->pager), PAGER_LAYOUT_CORNER_BOTTOMLEFT);
}
else
{
plugin->pager = pager_buttons_new (plugin->wnck_screen);
pager_buttons_set_n_rows (XFCE_PAGER_BUTTONS (plugin->pager), plugin->rows);
pager_buttons_set_orientation (XFCE_PAGER_BUTTONS (plugin->pager), plugin_orientation);
+ if (plugin_orientation == GTK_ORIENTATION_HORIZONTAL)
+ pager_buttons_set_starting_corner (XFCE_PAGER_BUTTONS (plugin->pager), PAGER_LAYOUT_CORNER_TOPLEFT);
+ else
+ pager_buttons_set_starting_corner (XFCE_PAGER_BUTTONS (plugin->pager), PAGER_LAYOUT_CORNER_BOTTOMLEFT);
}
gtk_container_add (GTK_CONTAINER (plugin), plugin->pager);
@@ -438,9 +466,21 @@ pager_plugin_orientation_changed (XfcePanelPlugin *panel_plugin,
orientation = GTK_ORIENTATION_HORIZONTAL;
if (plugin->miniature_view)
- pager_wnck_set_orientation (XFCE_PAGER_WNCK (plugin->pager), orientation);
+ {
+ pager_wnck_set_orientation (XFCE_PAGER_WNCK (plugin->pager), orientation);
+ if (orientation == GTK_ORIENTATION_HORIZONTAL)
+ pager_wnck_set_starting_corner (XFCE_PAGER_WNCK (plugin->pager), PAGER_LAYOUT_CORNER_TOPLEFT);
+ else
+ pager_wnck_set_starting_corner (XFCE_PAGER_WNCK (plugin->pager), PAGER_LAYOUT_CORNER_BOTTOMLEFT);
+ }
else
- pager_buttons_set_orientation (XFCE_PAGER_BUTTONS (plugin->pager), orientation);
+ {
+ pager_buttons_set_orientation (XFCE_PAGER_BUTTONS (plugin->pager), orientation);
+ if (orientation == GTK_ORIENTATION_HORIZONTAL)
+ pager_buttons_set_starting_corner (XFCE_PAGER_BUTTONS (plugin->pager), PAGER_LAYOUT_CORNER_TOPLEFT);
+ else
+ pager_buttons_set_starting_corner (XFCE_PAGER_BUTTONS (plugin->pager), PAGER_LAYOUT_CORNER_BOTTOMLEFT);
+ }
}
diff --git a/plugins/pager/pager.h b/plugins/pager/pager.h
index 0a16287..96dd2a8 100644
--- a/plugins/pager/pager.h
+++ b/plugins/pager/pager.h
@@ -43,6 +43,17 @@ typedef enum {
PAGER_LAYOUT_POLICY_HEIGHT_FOR_WIDTH
} PagerLayoutPolicy;
+typedef enum
+{
+ PAGER_LAYOUT_CORNER_TOPLEFT,
+ PAGER_LAYOUT_CORNER_TOPRIGHT,
+ PAGER_LAYOUT_CORNER_BOTTOMRIGHT,
+ PAGER_LAYOUT_CORNER_BOTTOMLEFT
+} PagerLayoutCorner;
+
+#define XFCE_TYPE_PAGER_LAYOUT_CORNER (pager_layout_corner_get_type ())
+
+GType pager_layout_corner_get_type (void);
G_END_DECLS
More information about the Xfce4-commits
mailing list