[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-panel-devel
Subject: D10461: GMenu-DBusMenu-Proxy
From: Konstantin <noreply () phabricator ! kde ! org>
Date: 2018-02-14 15:23:19
Message-ID: 20180214152319.1.17007866A728A214 () phabricator ! kde ! org
[Download RAW message or body]
rilian added a comment.
If you need help, I will provide it for you, because for me there is 2 features \
which should be in KDE for me:
1. Global Menu (for all protocols)
2. QGtkStyle (with GTK3 themes)
> Okay. Problem is that for example LibreOffice doesn't have a menu right away, so \
I can't realy tell "no menu because it's still loading" or "no menu because it \
doesn't have one" and then fallback to app menu. I could perhaps check if the app has \
an appmenu at all before trying to fallback but not really fond of adding even more \
complexity to it.
I too because MenuModel can be empty on start, and I cannot differ than user turned \
menu off or just application do not have a menu? About searching of appmenu and \
fallback to it - LibreOffice have both appmenu and menubar, so, we will lose \
LibreOffice menu.
> What kind of different actions? So far I have only had redundancy in the app \
menu, I'll try to look into this, merging two separate menus into one somehow, also \
getting the app name for the app menu..
It can be actions (GActions, I mean) than exists only in appmenu, but not in \
menubar. User may want this.
> How am I supposed to know which action belongs where?
But all menuitems have "action" attribute)
Or if you about a QAction (which, I think, should called QMenuItem), this is \
several ways to do this:
1. Look for each section, name it by some action-name regex (as you did with icons) \
and then show it as menubar. 2. Or just do it with each menuitem, but it is way more \
complicated. I suggest a section-way.
> That was just for the icon mapping, I can probably remove this, since the actions \
in unity are just their localized labels plus unity. prefix, there's nothing I can \
map them to (like I would be able to window.open to document-open icon)
I think you do not need mapping, because we have a bunch of this code:
C
static GtkImage *gtk_menu_item_get_nth_image(GtkMenuItem *menu_item, guint index)
{
UnityGtkSearch search;
g_return_val_if_fail(GTK_IS_MENU_ITEM(menu_item), NULL);
search.type = GTK_TYPE_IMAGE;
search.index = index;
search.object = NULL;
g_object_get_nth_object(G_OBJECT(menu_item), &search);
return search.object != NULL ? GTK_IMAGE(search.object) : NULL;
}
static GIcon *gtk_image_get_icon(GtkImage *image)
{
GIcon *icon = NULL;
g_return_val_if_fail(GTK_IS_IMAGE(image), NULL);
switch (gtk_image_get_storage_type(image))
{
case GTK_IMAGE_GICON:
{
gtk_image_get_gicon(image, &icon, NULL);
if (icon != NULL)
g_object_ref(icon);
}
break;
case GTK_IMAGE_ICON_NAME:
{
const char *name = NULL;
gtk_image_get_icon_name(image, &name, NULL);
if (name != NULL)
icon = G_ICON(g_themed_icon_new_with_default_fallbacks(name));
}
break;
case GTK_IMAGE_PIXBUF:
{
GdkPixbuf *pixbuf = gtk_image_get_pixbuf(image);
if (pixbuf != NULL)
icon = g_object_ref(pixbuf);
}
break;
case GTK_IMAGE_ANIMATION:
{
GdkPixbufAnimation *animation = gtk_image_get_animation(image);
if (animation != NULL)
{
GdkPixbuf *pixbuf = gdk_pixbuf_animation_get_static_image(animation);
if (pixbuf != NULL)
icon = g_object_ref(pixbuf);
}
}
break;
case GTK_IMAGE_STOCK:
#if GTK_MAJOR_VERSION == 2
{
char *stock = NULL;
GtkIconSize size = GTK_ICON_SIZE_INVALID;
gtk_image_get_stock(image, &stock, &size);
if (stock != NULL)
{
GdkPixbuf *pixbuf =
gtk_widget_render_icon(GTK_WIDGET(image), stock, size, NULL);
if (pixbuf != NULL)
icon = G_ICON(pixbuf);
}
}
#elif GTK_MAJOR_VERSION == 3
{
GtkStyleContext *context = gtk_widget_get_style_context(GTK_WIDGET(image));
if (context != NULL)
{
char *stock = NULL;
GtkIconSize size = GTK_ICON_SIZE_INVALID;
gtk_image_get_stock(image, &stock, &size);
if (stock != NULL)
{
GtkIconSet *set = gtk_style_context_lookup_icon_set(context, stock);
if (set != NULL)
{
GdkPixbuf *pixbuf =
gtk_icon_set_render_icon_pixbuf(set, context, size);
if (pixbuf != NULL)
icon = G_ICON(pixbuf);
}
}
}
}
#endif
break;
case GTK_IMAGE_ICON_SET:
#if GTK_MAJOR_VERSION == 2
{
GtkIconSet *set = NULL;
GtkIconSize size = GTK_ICON_SIZE_INVALID;
gtk_image_get_icon_set(image, &set, &size);
if (set != NULL)
{
GtkStyle *style = gtk_widget_get_style(GTK_WIDGET(image));
GtkTextDirection direction = gtk_widget_get_direction(GTK_WIDGET(image));
GtkStateType state = gtk_widget_get_state(GTK_WIDGET(image));
GdkPixbuf *pixbuf = gtk_icon_set_render_icon(set,
style,
direction,
state,
size,
\
GTK_WIDGET(image),
NULL);
if (pixbuf != NULL)
icon = G_ICON(pixbuf);
}
}
#elif GTK_MAJOR_VERSION == 3
{
GtkStyleContext *context = gtk_widget_get_style_context(GTK_WIDGET(image));
if (context != NULL)
{
GtkIconSet *set = NULL;
GtkIconSize size = GTK_ICON_SIZE_INVALID;
gtk_image_get_icon_set(image, &set, &size);
if (set != NULL)
{
GdkPixbuf *pixbuf =
gtk_icon_set_render_icon_pixbuf(set, context, size);
if (pixbuf != NULL)
icon = G_ICON(pixbuf);
}
}
}
#endif
break;
#if GTK_MAJOR_VERSION == 2
case GTK_IMAGE_IMAGE:
{
GdkImage *gdk_image = NULL;
gtk_image_get_image(image, &gdk_image, NULL);
if (gdk_image != NULL)
{
GdkColormap *colourmap = gtk_widget_get_colormap(GTK_WIDGET(image));
GdkPixbuf *pixbuf = gdk_pixbuf_get_from_image(NULL,
gdk_image,
colourmap,
0,
0,
0,
0,
\
gdk_image->width,
\
gdk_image->height);
if (pixbuf != NULL)
icon = G_ICON(pixbuf);
}
}
break;
case GTK_IMAGE_PIXMAP:
{
GdkPixmap *pixmap = NULL;
gtk_image_get_pixmap(image, &pixmap, NULL);
if (pixmap != NULL)
{
GdkPixbuf *pixbuf;
GdkColormap *colourmap;
gint width = 0;
gint height = 0;
gdk_pixmap_get_size(pixmap, &width, &height);
colourmap = gtk_widget_get_colormap(GTK_WIDGET(image));
pixbuf = gdk_pixbuf_get_from_drawable(NULL,
pixmap,
colourmap,
0,
0,
0,
0,
width,
height);
if (pixbuf != NULL)
icon = G_ICON(pixbuf);
}
}
break;
#endif
default:
break;
}
return icon;
}
If any icon can be found, appmenu-gtk-module will export this.
And I will temporary disable exporting an empty menubar to MenuModel in \
appmenu-gtk-module.
REPOSITORY
R120 Plasma Workspace
REVISION DETAIL
https://phabricator.kde.org/D10461
To: broulik, #plasma
Cc: rk, rilian, mtallur, ngraham, plasma-devel, ZrenBot, progwolff, lesliezhai, \
ali-mohamed, jensreuterberg, abetts, sebas, apol, mart
[Attachment #3 (unknown)]
<table><tr><td style="">rilian added a comment.
</td><a style="text-decoration: none; padding: 4px 8px; margin: 0 8px 8px; float: \
right; color: #464C5C; font-weight: bold; border-radius: 3px; background-color: \
#F7F7F9; background-image: linear-gradient(to bottom,#fff,#f1f0f1); display: \
inline-block; border: 1px solid rgba(71,87,120,.2);" \
href="https://phabricator.kde.org/D10461" rel="noreferrer">View \
Revision</a></tr></table><br /><div><div><p>If you need help, I will provide it for \
you, because for me there is 2 features which should be in KDE for me:</p>
<ol class="remarkup-list">
<li class="remarkup-list-item">Global Menu (for all protocols)</li>
<li class="remarkup-list-item">QGtkStyle (with GTK3 themes)</li>
</ol>
<blockquote style="border-left: 3px solid #a7b5bf; color: #464c5c; font-style: \
italic; margin: 4px 0 12px 0; padding: 4px 12px; background-color: #f8f9fc;"><p>Okay. \
Problem is that for example LibreOffice doesn't have a menu right away, so I \
can't realy tell "no menu because it's still loading" or "no \
menu because it doesn't have one" and then fallback to app menu. I could \
perhaps check if the app has an appmenu at all before trying to fallback but not \
really fond of adding even more complexity to it.</p></blockquote>
<p>I too because MenuModel can be empty on start, and I cannot differ than user \
turned menu off or just application do not have a menu?<br /> About searching of \
appmenu and fallback to it - LibreOffice have both appmenu and menubar, so, we will \
lose LibreOffice menu.</p>
<blockquote style="border-left: 3px solid #a7b5bf; color: #464c5c; font-style: \
italic; margin: 4px 0 12px 0; padding: 4px 12px; background-color: #f8f9fc;"><p>What \
kind of different actions? So far I have only had redundancy in the app menu, \
I'll try to look into this, merging two separate menus into one somehow, also \
getting the app name for the app menu..</p></blockquote>
<p>It can be actions (GActions, I mean) than exists only in appmenu, but not in \
menubar. User may want this.</p>
<blockquote style="border-left: 3px solid #a7b5bf; color: #464c5c; font-style: \
italic; margin: 4px 0 12px 0; padding: 4px 12px; background-color: #f8f9fc;"><p>How \
am I supposed to know which action belongs where?</p></blockquote>
<p>But all menuitems have "action" attribute)<br />
Or if you about a QAction (which, I think, should called QMenuItem), this is several \
ways to do this:</p>
<ol class="remarkup-list">
<li class="remarkup-list-item">Look for each section, name it by some action-name \
regex (as you did with icons) and then show it as menubar.</li> <li \
class="remarkup-list-item">Or just do it with each menuitem, but it is way more \
complicated. I suggest a section-way.</li> </ol>
<blockquote style="border-left: 3px solid #a7b5bf; color: #464c5c; font-style: \
italic; margin: 4px 0 12px 0; padding: 4px 12px; background-color: #f8f9fc;"><p>That \
was just for the icon mapping, I can probably remove this, since the actions in unity \
are just their localized labels plus unity. prefix, there's nothing I can map \
them to (like I would be able to window.open to document-open icon)</p></blockquote>
<p>I think you do not need mapping, because we have a bunch of this code:</p>
<div class="remarkup-code-block" style="margin: 12px 0;" data-code-lang="text" \
data-sigil="remarkup-code-block"><pre class="remarkup-code" style="font: 11px/15px \
"Menlo", "Consolas", "Monaco", monospace; padding: \
12px; margin: 0; background: rgba(71, 87, 120, 0.08);">C static GtkImage \
*gtk_menu_item_get_nth_image(GtkMenuItem *menu_item, guint index) {
UnityGtkSearch search;
g_return_val_if_fail(GTK_IS_MENU_ITEM(menu_item), NULL);
search.type = GTK_TYPE_IMAGE;
search.index = index;
search.object = NULL;
g_object_get_nth_object(G_OBJECT(menu_item), &search);
return search.object != NULL ? GTK_IMAGE(search.object) : NULL;
}
static GIcon *gtk_image_get_icon(GtkImage *image)
{
GIcon *icon = NULL;
g_return_val_if_fail(GTK_IS_IMAGE(image), NULL);
switch (gtk_image_get_storage_type(image))
{
case GTK_IMAGE_GICON:
{
gtk_image_get_gicon(image, &icon, NULL);
if (icon != NULL)
g_object_ref(icon);
}
break;
case GTK_IMAGE_ICON_NAME:
{
const char *name = NULL;
gtk_image_get_icon_name(image, &name, NULL);
if (name != NULL)
icon = G_ICON(g_themed_icon_new_with_default_fallbacks(name));
}
break;
case GTK_IMAGE_PIXBUF:
{
GdkPixbuf *pixbuf = gtk_image_get_pixbuf(image);
if (pixbuf != NULL)
icon = g_object_ref(pixbuf);
}
break;
case GTK_IMAGE_ANIMATION:
{
GdkPixbufAnimation *animation = gtk_image_get_animation(image);
if (animation != NULL)
{
GdkPixbuf *pixbuf = gdk_pixbuf_animation_get_static_image(animation);
if (pixbuf != NULL)
icon = g_object_ref(pixbuf);
}
}
break;
case GTK_IMAGE_STOCK:
#if GTK_MAJOR_VERSION == 2
{
char *stock = NULL;
GtkIconSize size = GTK_ICON_SIZE_INVALID;
gtk_image_get_stock(image, &stock, &size);
if (stock != NULL)
{
GdkPixbuf *pixbuf =
gtk_widget_render_icon(GTK_WIDGET(image), stock, size, NULL);
if (pixbuf != NULL)
icon = G_ICON(pixbuf);
}
}
#elif GTK_MAJOR_VERSION == 3
{
GtkStyleContext *context = gtk_widget_get_style_context(GTK_WIDGET(image));
if (context != NULL)
{
char *stock = NULL;
GtkIconSize size = GTK_ICON_SIZE_INVALID;
gtk_image_get_stock(image, &stock, &size);
if (stock != NULL)
{
GtkIconSet *set = gtk_style_context_lookup_icon_set(context, stock);
if (set != NULL)
{
GdkPixbuf *pixbuf =
gtk_icon_set_render_icon_pixbuf(set, context, size);
if (pixbuf != NULL)
icon = G_ICON(pixbuf);
}
}
}
}
#endif
break;
case GTK_IMAGE_ICON_SET:
#if GTK_MAJOR_VERSION == 2
{
GtkIconSet *set = NULL;
GtkIconSize size = GTK_ICON_SIZE_INVALID;
gtk_image_get_icon_set(image, &set, &size);
if (set != NULL)
{
GtkStyle *style = gtk_widget_get_style(GTK_WIDGET(image));
GtkTextDirection direction = gtk_widget_get_direction(GTK_WIDGET(image));
GtkStateType state = gtk_widget_get_state(GTK_WIDGET(image));
GdkPixbuf *pixbuf = gtk_icon_set_render_icon(set,
style,
direction,
state,
size,
\
GTK_WIDGET(image),
NULL);
if (pixbuf != NULL)
icon = G_ICON(pixbuf);
}
}
#elif GTK_MAJOR_VERSION == 3
{
GtkStyleContext *context = gtk_widget_get_style_context(GTK_WIDGET(image));
if (context != NULL)
{
GtkIconSet *set = NULL;
GtkIconSize size = GTK_ICON_SIZE_INVALID;
gtk_image_get_icon_set(image, &set, &size);
if (set != NULL)
{
GdkPixbuf *pixbuf =
gtk_icon_set_render_icon_pixbuf(set, context, size);
if (pixbuf != NULL)
icon = G_ICON(pixbuf);
}
}
}
#endif
break;
#if GTK_MAJOR_VERSION == 2
case GTK_IMAGE_IMAGE:
{
GdkImage *gdk_image = NULL;
gtk_image_get_image(image, &gdk_image, NULL);
if (gdk_image != NULL)
{
GdkColormap *colourmap = gtk_widget_get_colormap(GTK_WIDGET(image));
GdkPixbuf *pixbuf = gdk_pixbuf_get_from_image(NULL,
gdk_image,
colourmap,
0,
0,
0,
0,
\
gdk_image->width,
\
gdk_image->height);
if (pixbuf != NULL)
icon = G_ICON(pixbuf);
}
}
break;
case GTK_IMAGE_PIXMAP:
{
GdkPixmap *pixmap = NULL;
gtk_image_get_pixmap(image, &pixmap, NULL);
if (pixmap != NULL)
{
GdkPixbuf *pixbuf;
GdkColormap *colourmap;
gint width = 0;
gint height = 0;
gdk_pixmap_get_size(pixmap, &width, &height);
colourmap = gtk_widget_get_colormap(GTK_WIDGET(image));
pixbuf = gdk_pixbuf_get_from_drawable(NULL,
pixmap,
colourmap,
0,
0,
0,
0,
width,
height);
if (pixbuf != NULL)
icon = G_ICON(pixbuf);
}
}
break;
#endif
default:
break;
}
return icon;
}</pre></div>
<p>If any icon can be found, appmenu-gtk-module will export this.<br />
And I will temporary disable exporting an empty menubar to MenuModel in \
appmenu-gtk-module.</p></div></div><br \
/><div><strong>REPOSITORY</strong><div><div>R120 Plasma \
Workspace</div></div></div><br /><div><strong>REVISION DETAIL</strong><div><a \
href="https://phabricator.kde.org/D10461" \
rel="noreferrer">https://phabricator.kde.org/D10461</a></div></div><br \
/><div><strong>To: </strong>broulik, Plasma<br /><strong>Cc: </strong>rk, rilian, \
mtallur, ngraham, plasma-devel, ZrenBot, progwolff, lesliezhai, ali-mohamed, \
jensreuterberg, abetts, sebas, apol, mart<br /></div>
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic