[Xfce4-commits] <xfce4-panel:nick/gtk3> Tasklist: ported to Gtk3.
Andrzej
noreply at xfce.org
Thu Apr 11 02:22:01 CEST 2013
Updating branch refs/heads/nick/gtk3
to 8427a172866d2b6aeb8ab7e1c5d8fbd2c2092068 (commit)
from 300618b61fcc5ac9040c1d38636654d3d1bccdd5 (commit)
commit 8427a172866d2b6aeb8ab7e1c5d8fbd2c2092068
Author: Andrzej <ndrwrdck at gmail.com>
Date: Thu Apr 11 01:20:20 2013 +0100
Tasklist: ported to Gtk3.
Size requisition/allocation should be reworked for efficiency
(currently _size_request() is called twice) and to make use of
new features (minimum size).
gtk_widget_get_snapshot() no longer available - feature disabled (in DnD).
plugins/tasklist/tasklist-widget.c | 155 +++++++++++++++++++++++------------
plugins/tasklist/tasklist.c | 55 ++++++++-----
2 files changed, 135 insertions(+), 75 deletions(-)
diff --git a/plugins/tasklist/tasklist-widget.c b/plugins/tasklist/tasklist-widget.c
index 8f433fa..4b089ed 100644
--- a/plugins/tasklist/tasklist-widget.c
+++ b/plugins/tasklist/tasklist-widget.c
@@ -262,6 +262,12 @@ static void xfce_tasklist_set_property (GObjec
static void xfce_tasklist_finalize (GObject *object);
static void xfce_tasklist_size_request (GtkWidget *widget,
GtkRequisition *requisition);
+static void xfce_tasklist_get_preferred_width (GtkWidget *widget,
+ gint *minimum_width,
+ gint *natural_width);
+static void xfce_tasklist_get_preferred_height (GtkWidget *widget,
+ gint *minimum_height,
+ gint *natural_height);
static void xfce_tasklist_size_allocate (GtkWidget *widget,
GtkAllocation *allocation);
static void xfce_tasklist_style_set (GtkWidget *widget,
@@ -371,7 +377,8 @@ xfce_tasklist_class_init (XfceTasklistClass *klass)
gobject_class->finalize = xfce_tasklist_finalize;
gtkwidget_class = GTK_WIDGET_CLASS (klass);
- gtkwidget_class->size_request = xfce_tasklist_size_request;
+ gtkwidget_class->get_preferred_width = xfce_tasklist_get_preferred_width;
+ gtkwidget_class->get_preferred_height = xfce_tasklist_get_preferred_height;
gtkwidget_class->size_allocate = xfce_tasklist_size_allocate;
gtkwidget_class->style_set = xfce_tasklist_style_set;
gtkwidget_class->realize = xfce_tasklist_realize;
@@ -751,6 +758,42 @@ xfce_tasklist_finalize (GObject *object)
static void
+xfce_tasklist_get_preferred_width (GtkWidget *widget,
+ gint *minimum_width,
+ gint *natural_width)
+{
+ GtkRequisition requisition;
+
+ xfce_tasklist_size_request (widget, &requisition);
+
+ if (minimum_width != NULL)
+ *minimum_width = requisition.width;
+
+ if (natural_width != NULL)
+ *natural_width = requisition.width;
+}
+
+
+
+static void
+xfce_tasklist_get_preferred_height (GtkWidget *widget,
+ gint *minimum_height,
+ gint *natural_height)
+{
+ GtkRequisition requisition;
+
+ xfce_tasklist_size_request (widget, &requisition);
+
+ if (minimum_height != NULL)
+ *minimum_height = requisition.height;
+
+ if (natural_height != NULL)
+ *natural_height = requisition.height;
+}
+
+
+
+static void
xfce_tasklist_size_request (GtkWidget *widget,
GtkRequisition *requisition)
{
@@ -767,9 +810,9 @@ xfce_tasklist_size_request (GtkWidget *widget,
{
child = li->data;
- if (GTK_WIDGET_VISIBLE (child->button))
+ if (gtk_widget_get_visible (child->button))
{
- gtk_widget_size_request (child->button, &child_req);
+ gtk_widget_get_preferred_size (child->button, NULL, &child_req);
/* child_height = MAX (child_height, child_req.height); */
child_height = MAX (child_height, tasklist->size / tasklist->nrows);
@@ -910,7 +953,7 @@ xfce_tasklist_size_layout (XfceTasklist *tasklist,
for (li = tasklist->windows; li != NULL; li = li->next)
{
child = li->data;
- if (GTK_WIDGET_VISIBLE (child->button))
+ if (gtk_widget_get_visible (child->button))
{
windows_scored = g_slist_insert_sorted (windows_scored, child,
xfce_tasklist_size_sort_window);
@@ -996,10 +1039,10 @@ xfce_tasklist_size_allocate (GtkWidget *widget,
gint arrow_position;
GtkRequisition child_req;
- panel_return_if_fail (GTK_WIDGET_VISIBLE (tasklist->arrow_button));
+ panel_return_if_fail (gtk_widget_get_visible (tasklist->arrow_button));
/* set widget allocation */
- widget->allocation = *allocation;
+ gtk_widget_set_allocation (widget, allocation);
/* swap integers with vertical orientation */
if (!xfce_tasklist_horizontal (tasklist))
@@ -1051,7 +1094,7 @@ xfce_tasklist_size_allocate (GtkWidget *widget,
child = li->data;
/* skip hidden buttons */
- if (!GTK_WIDGET_VISIBLE (child->button))
+ if (!gtk_widget_get_visible (child->button))
continue;
if (G_LIKELY (child->type == CHILD_TYPE_WINDOW
@@ -1107,7 +1150,7 @@ xfce_tasklist_size_allocate (GtkWidget *widget,
}
else
{
- gtk_widget_get_child_requisition (child->button, &child_req);
+ gtk_widget_get_preferred_size (child->button, NULL, &child_req);
/* move the button offscreen */
child_alloc.y = child_alloc.x = -9999;
@@ -1218,7 +1261,7 @@ xfce_tasklist_scroll_event (GtkWidget *widget,
{
child = li->data;
- if (GTK_WIDGET_VISIBLE (child->button)
+ if (gtk_widget_get_visible (child->button)
&& gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (child->button)))
break;
}
@@ -1234,7 +1277,7 @@ xfce_tasklist_scroll_event (GtkWidget *widget,
{
child = lnew->data;
if (child->window != NULL
- && GTK_WIDGET_VISIBLE (child->button))
+ && gtk_widget_get_visible (child->button))
break;
}
break;
@@ -1245,7 +1288,7 @@ xfce_tasklist_scroll_event (GtkWidget *widget,
{
child = lnew->data;
if (child->window != NULL
- && GTK_WIDGET_VISIBLE (child->button))
+ && gtk_widget_get_visible (child->button))
break;
}
break;
@@ -1257,6 +1300,10 @@ xfce_tasklist_scroll_event (GtkWidget *widget,
case GDK_SCROLL_RIGHT:
/* TODO */
break;
+
+ case GDK_SCROLL_SMOOTH:
+ /* TODO */
+ break;
}
if (lnew != NULL)
@@ -1284,7 +1331,7 @@ xfce_tasklist_remove (GtkContainer *container,
{
tasklist->windows = g_list_delete_link (tasklist->windows, li);
- was_visible = GTK_WIDGET_VISIBLE (widget);
+ was_visible = gtk_widget_get_visible (widget);
gtk_widget_unparent (child->button);
@@ -1535,7 +1582,7 @@ xfce_tasklist_active_window_changed (WnckScreen *screen,
/* skip hidden buttons */
/* TODO the visible check probably breaks with grouping */
- if (!GTK_WIDGET_VISIBLE (child->button)
+ if (!gtk_widget_get_visible (child->button)
|| !(child->window == previous_window
|| child->window == active_window
|| !tasklist->all_workspaces))
@@ -1813,7 +1860,7 @@ xfce_tasklist_update_icon_geometries (gpointer data)
XfceTasklist *tasklist = XFCE_TASKLIST (data);
GList *li;
XfceTasklistChild *child, *child2;
- GtkAllocation *alloc;
+ GtkAllocation alloc;
GSList *lp;
gint root_x, root_y;
GtkWidget *toplevel;
@@ -1829,31 +1876,31 @@ xfce_tasklist_update_icon_geometries (gpointer data)
switch (child->type)
{
case CHILD_TYPE_WINDOW:
- alloc = &child->button->allocation;
+ gtk_widget_get_allocation (child->button, &alloc);
panel_return_val_if_fail (WNCK_IS_WINDOW (child->window), FALSE);
- wnck_window_set_icon_geometry (child->window, alloc->x + root_x,
- alloc->y + root_y, alloc->width,
- alloc->height);
+ wnck_window_set_icon_geometry (child->window, alloc.x + root_x,
+ alloc.y + root_y, alloc.width,
+ alloc.height);
break;
case CHILD_TYPE_GROUP:
- alloc = &child->button->allocation;
+ gtk_widget_get_allocation (child->button, &alloc);
for (lp = child->windows; lp != NULL; lp = lp->next)
{
child2 = lp->data;
panel_return_val_if_fail (WNCK_IS_WINDOW (child2->window), FALSE);
- wnck_window_set_icon_geometry (child2->window, alloc->x + root_x,
- alloc->y + root_y, alloc->width,
- alloc->height);
+ wnck_window_set_icon_geometry (child2->window, alloc.x + root_x,
+ alloc.y + root_y, alloc.width,
+ alloc.height);
}
break;
case CHILD_TYPE_OVERFLOW_MENU:
- alloc = &tasklist->arrow_button->allocation;
+ gtk_widget_get_allocation (tasklist->arrow_button, &alloc);
panel_return_val_if_fail (WNCK_IS_WINDOW (child->window), FALSE);
- wnck_window_set_icon_geometry (child->window, alloc->x + root_x,
- alloc->y + root_y, alloc->width,
- alloc->height);
+ wnck_window_set_icon_geometry (child->window, alloc.x + root_x,
+ alloc.y + root_y, alloc.width,
+ alloc.height);
break;
case CHILD_TYPE_GROUP_MENU:
@@ -1885,8 +1932,6 @@ xfce_tasklist_update_monitor_geometry_idle (gpointer data)
panel_return_val_if_fail (XFCE_IS_TASKLIST (tasklist), FALSE);
- GDK_THREADS_ENTER ();
-
if (!tasklist->all_monitors)
{
screen = gtk_widget_get_screen (GTK_WIDGET (tasklist));
@@ -1915,8 +1960,6 @@ xfce_tasklist_update_monitor_geometry_idle (gpointer data)
xfce_tasklist_active_workspace_changed (tasklist->screen,
NULL, tasklist);
- GDK_THREADS_LEAVE ();
-
return FALSE;
}
@@ -1938,8 +1981,6 @@ xfce_tasklist_child_drag_motion_timeout (gpointer data)
panel_return_val_if_fail (XFCE_IS_TASKLIST (child->tasklist), FALSE);
panel_return_val_if_fail (WNCK_IS_SCREEN (child->tasklist->screen), FALSE);
- GDK_THREADS_ENTER ();
-
if (child->type == CHILD_TYPE_WINDOW)
{
xfce_tasklist_button_activate (child, child->motion_timestamp);
@@ -1949,8 +1990,6 @@ xfce_tasklist_child_drag_motion_timeout (gpointer data)
/* TODO popup menu */
}
- GDK_THREADS_LEAVE ();
-
return FALSE;
}
@@ -1988,9 +2027,9 @@ xfce_tasklist_child_drag_motion (XfceTasklistChild *child,
if (child->motion_timeout_id == 0
&& !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (child->button)))
{
- child->motion_timeout_id = g_timeout_add_full (G_PRIORITY_LOW, DRAG_ACTIVATE_TIMEOUT,
- xfce_tasklist_child_drag_motion_timeout, child,
- xfce_tasklist_child_drag_motion_timeout_destroyed);
+ child->motion_timeout_id = gdk_threads_add_timeout_full (G_PRIORITY_LOW, DRAG_ACTIVATE_TIMEOUT,
+ xfce_tasklist_child_drag_motion_timeout, child,
+ xfce_tasklist_child_drag_motion_timeout_destroyed);
}
/* keep emitting the signal */
@@ -2704,16 +2743,20 @@ xfce_tasklist_button_button_release_event (GtkWidget *button,
GdkEventButton *event,
XfceTasklistChild *child)
{
+ GtkAllocation allocation;
+
panel_return_val_if_fail (XFCE_IS_TASKLIST (child->tasklist), FALSE);
panel_return_val_if_fail (child->type != CHILD_TYPE_GROUP, FALSE);
+ gtk_widget_get_allocation (button, &allocation);
+
/* only respond to in-button events */
if (event->type == GDK_BUTTON_RELEASE
&& !xfce_taskbar_is_locked (child->tasklist)
&& event->button == 1
&& !(event->x == 0 && event->y == 0) /* 0,0 = outside the widget in Gtk */
- && event->x >= 0 && event->x < button->allocation.width
- && event->y >= 0 && event->y < button->allocation.height)
+ && event->x >= 0 && event->x < allocation.width
+ && event->y >= 0 && event->y < allocation.height)
{
xfce_tasklist_button_activate (child, event->time);
}
@@ -2952,10 +2995,12 @@ xfce_tasklist_button_drag_begin (GtkWidget *button,
XfceTasklistChild *child)
{
GdkPixbuf *pixbuf;
- GdkPixmap *pixmap;
+ /* GdkPixmap *pixmap; */
panel_return_if_fail (WNCK_IS_WINDOW (child->window));
+ /* not available in Gtk3 */
+#if 0
if (child->tasklist->show_labels)
{
pixmap = gtk_widget_get_snapshot (button, NULL);
@@ -2969,6 +3014,7 @@ xfce_tasklist_button_drag_begin (GtkWidget *button,
return;
}
}
+#endif
pixbuf = wnck_window_get_icon (child->window);
if (G_LIKELY (pixbuf != NULL))
@@ -2991,17 +3037,20 @@ xfce_tasklist_button_drag_data_received (GtkWidget *button,
gulong xid;
XfceTasklistChild *child;
XfceTasklist *tasklist = XFCE_TASKLIST (child2->tasklist);
+ GtkAllocation allocation;
panel_return_if_fail (XFCE_IS_TASKLIST (tasklist));
if (tasklist->sort_order != XFCE_TASKLIST_SORT_ORDER_DND)
return;
+ gtk_widget_get_allocation (button, &allocation);
+
sibling = g_list_find (tasklist->windows, child2);
panel_return_if_fail (sibling != NULL);
- if ((!xfce_tasklist_vertical (tasklist) && x >= button->allocation.width / 2)
- || (xfce_tasklist_vertical (tasklist) && y >= button->allocation.height / 2))
+ if ((!xfce_tasklist_vertical (tasklist) && x >= allocation.width / 2)
+ || (xfce_tasklist_vertical (tasklist) && y >= allocation.height / 2))
sibling = g_list_next (sibling);
xid = *((gulong *) gtk_selection_data_get_data (selection_data));
@@ -3111,7 +3160,7 @@ xfce_tasklist_group_button_menu_minimize_all (XfceTasklistChild *group_child)
for (li = group_child->windows; li != NULL; li = li->next)
{
child = li->data;
- if (GTK_WIDGET_VISIBLE (child->button)
+ if (gtk_widget_get_visible (child->button)
&& child->type == CHILD_TYPE_GROUP_MENU)
{
panel_return_if_fail (WNCK_IS_WINDOW (child->window));
@@ -3134,7 +3183,7 @@ xfce_tasklist_group_button_menu_unminimize_all (XfceTasklistChild *group_child)
for (li = group_child->windows; li != NULL; li = li->next)
{
child = li->data;
- if (GTK_WIDGET_VISIBLE (child->button)
+ if (gtk_widget_get_visible (child->button)
&& child->type == CHILD_TYPE_GROUP_MENU)
{
panel_return_if_fail (WNCK_IS_WINDOW (child->window));
@@ -3157,7 +3206,7 @@ xfce_tasklist_group_button_menu_maximize_all (XfceTasklistChild *group_child)
for (li = group_child->windows; li != NULL; li = li->next)
{
child = li->data;
- if (GTK_WIDGET_VISIBLE (child->button)
+ if (gtk_widget_get_visible (child->button)
&& child->type == CHILD_TYPE_GROUP_MENU)
{
panel_return_if_fail (WNCK_IS_WINDOW (child->window));
@@ -3180,7 +3229,7 @@ xfce_tasklist_group_button_menu_unmaximize_all (XfceTasklistChild *group_child)
for (li = group_child->windows; li != NULL; li = li->next)
{
child = li->data;
- if (GTK_WIDGET_VISIBLE (child->button)
+ if (gtk_widget_get_visible (child->button)
&& child->type == CHILD_TYPE_GROUP_MENU)
{
panel_return_if_fail (WNCK_IS_WINDOW (child->window));
@@ -3202,7 +3251,7 @@ xfce_tasklist_group_button_menu_close_all (XfceTasklistChild *group_child)
for (li = group_child->windows; li != NULL; li = li->next)
{
child = li->data;
- if (GTK_WIDGET_VISIBLE (child->button)
+ if (gtk_widget_get_visible (child->button)
&& child->type == CHILD_TYPE_GROUP_MENU)
{
panel_return_if_fail (WNCK_IS_WINDOW (child->window));
@@ -3231,7 +3280,7 @@ xfce_tasklist_group_button_menu (XfceTasklistChild *group_child,
for (li = group_child->windows; li != NULL; li = li->next)
{
child = li->data;
- if (GTK_WIDGET_VISIBLE (child->button)
+ if (gtk_widget_get_visible (child->button)
&& child->type == CHILD_TYPE_GROUP_MENU)
{
mi = xfce_tasklist_button_proxy_menu_item (child, !action_menu_entries);
@@ -3385,7 +3434,7 @@ xfce_tasklist_group_button_name_changed (WnckClassGroup *class_group,
for (li = group_child->windows, n_windows = 0; li != NULL; li = li->next)
{
child = li->data;
- if (GTK_WIDGET_VISIBLE (child->button)
+ if (gtk_widget_get_visible (child->button)
&& child->type == CHILD_TYPE_GROUP_MENU)
n_windows++;
}
@@ -3495,7 +3544,7 @@ xfce_tasklist_group_button_child_visible_changed (XfceTasklistChild *group_child
for (li = group_child->windows; li != NULL; li = li->next)
{
child = li->data;
- if (GTK_WIDGET_VISIBLE (child->button))
+ if (gtk_widget_get_visible (child->button))
visible_counter++;
}
@@ -3515,7 +3564,7 @@ xfce_tasklist_group_button_child_visible_changed (XfceTasklistChild *group_child
for (li = group_child->windows; li != NULL; li = li->next)
{
child = li->data;
- if (GTK_WIDGET_VISIBLE (child->button))
+ if (gtk_widget_get_visible (child->button))
child->type = type;
}
@@ -3923,8 +3972,8 @@ xfce_tasklist_update_monitor_geometry (XfceTasklist *tasklist)
{
if (tasklist->update_monitor_geometry_id == 0)
{
- tasklist->update_monitor_geometry_id = g_idle_add_full (G_PRIORITY_LOW, xfce_tasklist_update_monitor_geometry_idle,
- tasklist, xfce_tasklist_update_monitor_geometry_idle_destroy);
+ tasklist->update_monitor_geometry_id = gdk_threads_add_idle_full (G_PRIORITY_LOW, xfce_tasklist_update_monitor_geometry_idle,
+ tasklist, xfce_tasklist_update_monitor_geometry_idle_destroy);
}
}
diff --git a/plugins/tasklist/tasklist.c b/plugins/tasklist/tasklist.c
index b1e59b7..e6e222e 100644
--- a/plugins/tasklist/tasklist.c
+++ b/plugins/tasklist/tasklist.c
@@ -29,6 +29,11 @@
#include "tasklist-widget.h"
#include "tasklist-dialog_ui.h"
+
+#define HANDLE_OFFSET (0.15)
+#define HANDLE_SIZE (4)
+
+
/* TODO move to header */
GType tasklist_plugin_get_type (void) G_GNUC_CONST;
void tasklist_plugin_register_type (XfcePanelTypeModule *type_module);
@@ -68,8 +73,8 @@ static void tasklist_plugin_nrows_changed (XfcePanelPlugin *pan
static void tasklist_plugin_screen_position_changed (XfcePanelPlugin *panel_plugin,
XfceScreenPosition position);
static void tasklist_plugin_configure_plugin (XfcePanelPlugin *panel_plugin);
-static gboolean tasklist_plugin_handle_expose_event (GtkWidget *widget,
- GdkEventExpose *event,
+static gboolean tasklist_plugin_handle_draw (GtkWidget *widget,
+ cairo_t *cr,
TasklistPlugin *plugin);
@@ -110,8 +115,8 @@ tasklist_plugin_init (TasklistPlugin *plugin)
plugin->handle = gtk_alignment_new (0.00, 0.00, 0.00, 0.00);
gtk_box_pack_start (GTK_BOX (box), plugin->handle, FALSE, FALSE, 0);
- g_signal_connect (G_OBJECT (plugin->handle), "expose-event",
- G_CALLBACK (tasklist_plugin_handle_expose_event), plugin);
+ g_signal_connect (G_OBJECT (plugin->handle), "draw",
+ G_CALLBACK (tasklist_plugin_handle_draw), plugin);
gtk_widget_set_size_request (plugin->handle, 8, 8);
gtk_widget_show (plugin->handle);
@@ -277,34 +282,40 @@ tasklist_plugin_configure_plugin (XfcePanelPlugin *panel_plugin)
static gboolean
-tasklist_plugin_handle_expose_event (GtkWidget *widget,
- GdkEventExpose *event,
- TasklistPlugin *plugin)
+tasklist_plugin_handle_draw (GtkWidget *widget,
+ cairo_t *cr,
+ TasklistPlugin *plugin)
{
- GtkOrientation orientation;
+ GtkAllocation allocation;
+ GtkStyleContext *ctx;
panel_return_val_if_fail (XFCE_IS_TASKLIST_PLUGIN (plugin), FALSE);
panel_return_val_if_fail (plugin->handle == widget, FALSE);
- if (!GTK_WIDGET_DRAWABLE (widget))
+ if (!gtk_widget_is_drawable (widget))
return FALSE;
- /* get the orientation */
+ gtk_widget_get_allocation (widget, &allocation);
+ ctx = gtk_widget_get_style_context (widget);
+
+ /* get the orientation and render the handle */
if (xfce_panel_plugin_get_orientation (XFCE_PANEL_PLUGIN (plugin)) ==
GTK_ORIENTATION_HORIZONTAL)
- orientation = GTK_ORIENTATION_VERTICAL;
+ {
+ gtk_render_handle (ctx, cr,
+ (gdouble) (allocation.width - HANDLE_SIZE) / 2.0,
+ (gdouble) allocation.height * HANDLE_OFFSET,
+ (gdouble) HANDLE_SIZE,
+ (gdouble) allocation.height * (1.0 - 2.0 * HANDLE_OFFSET));
+ }
else
- orientation = GTK_ORIENTATION_HORIZONTAL;
-
- /* paint the handle */
- gtk_paint_handle (widget->style, widget->window,
- GTK_WIDGET_STATE (widget), GTK_SHADOW_NONE,
- &(event->area), widget, "handlebox",
- widget->allocation.x,
- widget->allocation.y,
- widget->allocation.width,
- widget->allocation.height,
- orientation);
+ {
+ gtk_render_handle (ctx, cr,
+ (gdouble) allocation.width * HANDLE_OFFSET,
+ (gdouble) (allocation.height - HANDLE_SIZE) / 2.0,
+ (gdouble) allocation.width * (1.0 - 2.0 * HANDLE_OFFSET),
+ (gdouble) HANDLE_SIZE);
+ }
return TRUE;
}
More information about the Xfce4-commits
mailing list