diff options
Diffstat (limited to 'applets/notification_area/fixedtip.c')
-rw-r--r-- | applets/notification_area/fixedtip.c | 281 |
1 files changed, 0 insertions, 281 deletions
diff --git a/applets/notification_area/fixedtip.c b/applets/notification_area/fixedtip.c deleted file mode 100644 index 6356de9b..00000000 --- a/applets/notification_area/fixedtip.c +++ /dev/null @@ -1,281 +0,0 @@ -/* Marco fixed tooltip routine */ - -/* - * Copyright (C) 2001 Havoc Pennington - * Copyright (C) 2003-2006 Vincent Untz - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -#include "fixedtip.h" - -/* Signals */ -enum -{ - CLICKED, - LAST_SIGNAL -}; - -static guint fixedtip_signals[LAST_SIGNAL] = { 0 }; - -struct _NaFixedTipPrivate -{ - GtkWidget *parent; - GtkWidget *label; - GtkOrientation orientation; -}; - -G_DEFINE_TYPE (NaFixedTip, na_fixed_tip, GTK_TYPE_WINDOW) - -static gboolean -button_press_handler (GtkWidget *fixedtip, - GdkEventButton *event, - gpointer data) -{ - if (event->button == 1 && event->type == GDK_BUTTON_PRESS) - g_signal_emit (fixedtip, fixedtip_signals[CLICKED], 0); - - return FALSE; -} - -static gboolean -na_fixed_tip_draw (GtkWidget *widget, cairo_t *cr) -{ - GtkStyleContext *context; - GtkStateFlags state; - int width, height; - - width = gtk_widget_get_allocated_width (widget); - height = gtk_widget_get_allocated_height (widget); - - state = gtk_widget_get_state_flags (widget); - context = gtk_widget_get_style_context (widget); - gtk_style_context_save (context); - gtk_style_context_add_class (context, GTK_STYLE_CLASS_TOOLTIP); - gtk_style_context_set_state (context, state); - - cairo_save (cr); - gtk_render_background (context, cr, - 0., 0., - (gdouble)width, - (gdouble)height); - cairo_restore (cr); - - gtk_style_context_restore (context); - - return FALSE; -} - -static void -na_fixed_tip_class_init (NaFixedTipClass *class) -{ - GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); - widget_class->draw = na_fixed_tip_draw; - - fixedtip_signals[CLICKED] = - g_signal_new ("clicked", - G_OBJECT_CLASS_TYPE (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NaFixedTipClass, clicked), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - g_type_class_add_private (class, sizeof (NaFixedTipPrivate)); -} - -/* Did you already see this code? Yes, it's gtk_tooltips_ force_window() ;-) */ -static void -na_fixed_tip_init (NaFixedTip *fixedtip) -{ - GtkWidget *label; - - fixedtip->priv = G_TYPE_INSTANCE_GET_PRIVATE (fixedtip, NA_TYPE_FIXED_TIP, - NaFixedTipPrivate); - - gtk_window_set_type_hint (GTK_WINDOW (fixedtip), - GDK_WINDOW_TYPE_HINT_TOOLTIP); - - gtk_widget_set_app_paintable (GTK_WIDGET (fixedtip), TRUE); - gtk_window_set_resizable (GTK_WINDOW (fixedtip), FALSE); - gtk_widget_set_name (GTK_WIDGET (fixedtip), "gtk-tooltips"); - gtk_container_set_border_width (GTK_CONTAINER (fixedtip), 4); - - label = gtk_label_new (NULL); - gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); -#if GTK_CHECK_VERSION (3, 16, 0) - gtk_label_set_xalign (GTK_LABEL (label), 0.5); - gtk_label_set_yalign (GTK_LABEL (label), 0.5); -#else - gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5); -#endif - gtk_widget_show (label); - gtk_container_add (GTK_CONTAINER (fixedtip), label); - fixedtip->priv->label = label; - - gtk_widget_add_events (GTK_WIDGET (fixedtip), GDK_BUTTON_PRESS_MASK); - - g_signal_connect (fixedtip, "button_press_event", - G_CALLBACK (button_press_handler), NULL); - - fixedtip->priv->orientation = GTK_ORIENTATION_HORIZONTAL; -} - -static void -na_fixed_tip_position (NaFixedTip *fixedtip) -{ - GdkScreen *screen; - GdkWindow *parent_window; - GtkRequisition req; - int root_x; - int root_y; - int parent_width; - int parent_height; - int screen_width; - int screen_height; - - screen = gtk_widget_get_screen (fixedtip->priv->parent); - parent_window = gtk_widget_get_window (fixedtip->priv->parent); - - gtk_window_set_screen (GTK_WINDOW (fixedtip), screen); - - gtk_widget_get_preferred_size (GTK_WIDGET (fixedtip), &req, NULL); - - gdk_window_get_origin (parent_window, &root_x, &root_y); - parent_width = gdk_window_get_width(parent_window); - parent_height = gdk_window_get_height(parent_window); - - screen_width = gdk_screen_get_width (screen); - screen_height = gdk_screen_get_height (screen); - - /* pad between panel and message window */ -#define PAD 5 - - if (fixedtip->priv->orientation == GTK_ORIENTATION_VERTICAL) - { - if (root_x <= screen_width / 2) - root_x += parent_width + PAD; - else - root_x -= req.width + PAD; - } - else - { - if (root_y <= screen_height / 2) - root_y += parent_height + PAD; - else - root_y -= req.height + PAD; - } - - /* Push onscreen */ - if ((root_x + req.width) > screen_width) - root_x = screen_width - req.width; - - if ((root_y + req.height) > screen_height) - root_y = screen_height - req.height; - - gtk_window_move (GTK_WINDOW (fixedtip), root_x, root_y); -} - -static void -na_fixed_tip_parent_size_allocated (GtkWidget *parent, - GtkAllocation *allocation, - NaFixedTip *fixedtip) -{ - na_fixed_tip_position (fixedtip); -} - -static void -na_fixed_tip_parent_screen_changed (GtkWidget *parent, - GdkScreen *new_screen, - NaFixedTip *fixedtip) -{ - na_fixed_tip_position (fixedtip); -} - -GtkWidget * -na_fixed_tip_new (GtkWidget *parent, - GtkOrientation orientation) -{ - NaFixedTip *fixedtip; - - g_return_val_if_fail (parent != NULL, NULL); - - fixedtip = g_object_new (NA_TYPE_FIXED_TIP, - "type", GTK_WINDOW_POPUP, - NULL); - - fixedtip->priv->parent = parent; - -#if 0 - //FIXME: would be nice to be able to get the toplevel for the tip, but this - //doesn't work - GtkWidget *toplevel; - - toplevel = gtk_widget_get_toplevel (parent); - /* - if (toplevel && gtk_widget_is_toplevel (toplevel) && GTK_IS_WINDOW (toplevel)) - gtk_window_set_transient_for (GTK_WINDOW (fixedtip), GTK_WINDOW (toplevel)); - */ -#endif - - fixedtip->priv->orientation = orientation; - - //FIXME: would be nice to move the tip when the notification area moves - g_signal_connect_object (parent, "size-allocate", - G_CALLBACK (na_fixed_tip_parent_size_allocated), - fixedtip, 0); - g_signal_connect_object (parent, "screen-changed", - G_CALLBACK (na_fixed_tip_parent_screen_changed), - fixedtip, 0); - - na_fixed_tip_position (fixedtip); - - return GTK_WIDGET (fixedtip); -} - -void -na_fixed_tip_set_markup (GtkWidget *widget, - const char *markup_text) -{ - NaFixedTip *fixedtip; - - g_return_if_fail (NA_IS_FIXED_TIP (widget)); - - fixedtip = NA_FIXED_TIP (widget); - - gtk_label_set_markup (GTK_LABEL (fixedtip->priv->label), - markup_text); - - na_fixed_tip_position (fixedtip); -} - -void -na_fixed_tip_set_orientation (GtkWidget *widget, - GtkOrientation orientation) -{ - NaFixedTip *fixedtip; - - g_return_if_fail (NA_IS_FIXED_TIP (widget)); - - fixedtip = NA_FIXED_TIP (widget); - - if (orientation == fixedtip->priv->orientation) - return; - - fixedtip->priv->orientation = orientation; - - na_fixed_tip_position (fixedtip); -} |