Browse Source

Wmfs: Add screen specification in wmfs -s -> screen -s <num> "string"

Martin Duquesnoy 14 years ago
parent
commit
b483262088
8 changed files with 86 additions and 29 deletions
  1. 4 5
      src/event.c
  2. 12 3
      src/ewmh.c
  3. 4 3
      src/infobar.c
  4. 3 2
      src/screen.c
  5. 23 1
      src/structs.h
  6. 35 9
      src/wmfs.c
  7. 2 3
      src/wmfs.h
  8. 3 3
      wmfs.1

+ 4 - 5
src/event.c

@@ -190,14 +190,13 @@ clientmessageevent(XClientMessageEvent *ev)
           if((c = client_gb_win(ev->window)))
                tag_transfert(c, ev->data.l[0]);
 
-     /* Manage _WMFS_STATUSTEXT */
-     if(mess_t == wmfs_statustext && ev->data.l[4] == True)
+     /* Manage _WMFS_STATUSTEXT_x */
+     if(mess_t >= wmfs_statustext && ev->data.l[4] == True)
      {
-          if(XGetWindowProperty(dpy, ROOT, net_atom[wmfs_statustext], 0, 4096,
+          if(XGetWindowProperty(dpy, ROOT, net_atom[mess_t], 0, 4096,
                                 False, net_atom[utf8_string], &rt, &rf, &ir, &il, &ret) == Success)
           {
-               for(i = 0; i < screen_count(); ++i)
-                    infobar_draw_statustext(i, (char*)ret);
+               infobar_draw_statustext(mess_t - wmfs_statustext, (char*)ret);
                XFree(ret);
           }
      }

+ 12 - 3
src/ewmh.c

@@ -42,11 +42,13 @@
 void
 ewmh_init_hints(void)
 {
-     int i = 1, showing_desk = 0;
+     int i = 1, j, showing_desk = 0;
      char root_name[] = "WMFS "WMFS_VERSION;
-     char class[] = "wmfs";
+     char class[] = "wmfs", st[64];
      long pid = (long)getpid();
 
+     net_atom = emalloc(net_last + screen_count() + 1, sizeof(Atom));
+
      /* EWMH hints */
      net_atom[net_supported]                  = ATOM("_NET_SUPPORTED");
      net_atom[net_client_list]                = ATOM("_NET_CLIENT_LIST");
@@ -78,7 +80,6 @@ ewmh_init_hints(void)
      /* WMFS hints */
      net_atom[wmfs_running]                   = ATOM("_WMFS_RUNNING");
      net_atom[wmfs_update_hints]              = ATOM("_WMFS_UPDATE_HINTS");
-     net_atom[wmfs_statustext]                = ATOM("_WMFS_STATUSTEXT");
      net_atom[wmfs_set_screen]                = ATOM("_WMFS_SET_SCREEN");
      net_atom[wmfs_screen_count]              = ATOM("_WMFS_SCREEN_COUNT");
      net_atom[wmfs_current_tag]               = ATOM("_WMFS_CURRENT_TAG");
@@ -90,6 +91,14 @@ ewmh_init_hints(void)
      net_atom[wmfs_function]                  = ATOM("_WMFS_FUNCTION");
      net_atom[wmfs_cmd]                       = ATOM("_WMFS_CMD");
 
+     /* Multi atom _WMFS_STATUSTEXT_<screennum> */
+     for(j = 0; j < screen_count(); ++j)
+     {
+          sprintf(st, "_WMFS_STATUSTEXT_%d", j);
+          net_atom[wmfs_statustext + j] = ATOM(st);
+     }
+
+
      XChangeProperty(dpy, ROOT, net_atom[net_supported], XA_ATOM, 32,
                      PropModeReplace, (uchar*)net_atom, net_last);
 

+ 4 - 3
src/infobar.c

@@ -97,7 +97,8 @@ infobar_init(void)
           barwin_refresh(infobar[sc].bar);
 
           /* Default statustext is set here */
-          statustext = _strdup(WMFS_VERSION);
+          for(i = 0; i < screen_count(); ++i)
+               infobar[i].statustext = _strdup(WMFS_VERSION);
           infobar_draw(sc);
      }
 
@@ -113,7 +114,7 @@ infobar_draw(int sc)
      infobar_draw_taglist(sc);
      infobar_draw_layout(sc);
      barwin_refresh_color(infobar[sc].bar);
-     infobar_draw_statustext(sc, statustext);
+     infobar_draw_statustext(sc, infobar[sc].statustext);
 
      return;
 }
@@ -180,7 +181,7 @@ infobar_draw_statustext(int sc, char *str)
           return;
 
      barwin_refresh_color(infobar[sc].bar);
-     statustext = _strdup(str);
+     infobar[sc].statustext = _strdup(str);
      strwc = _strdup(str);
 
      /* Count how many color block there is and make a string without color block (\#....\)*/

+ 3 - 2
src/screen.c

@@ -48,8 +48,9 @@ screen_count(void)
 #endif /* HAVE_XINERAMA */
 
      /* Set _WMFS_SCREEN_COUNT */
-     XChangeProperty(dpy, ROOT, net_atom[wmfs_screen_count], XA_CARDINAL, 32,
-                     PropModeReplace, (uchar*)&n, 1);
+     if(net_atom)
+          XChangeProperty(dpy, ROOT, net_atom[wmfs_screen_count], XA_CARDINAL, 32,
+                    PropModeReplace, (uchar*)&n, 1);
 
      return n;
 }

+ 23 - 1
src/structs.h

@@ -49,6 +49,28 @@
 #define HintFlag  (1 << 7)
 #define FSSFlag   (1 << 8)
 
+/* XEMBED messages */
+#define XEMBED_MAPPED                 (1 << 0)
+#define XEMBED_EMBEDDED_NOTIFY        0
+#define XEMBED_WINDOW_ACTIVATE        1
+#define XEMBED_WINDOW_DEACTIVATE      2
+#define XEMBED_REQUEST_FOCUS          3
+#define XEMBED_FOCUS_IN               4
+#define XEMBED_FOCUS_OUT              5
+#define XEMBED_FOCUS_NEXT             6
+#define XEMBED_FOCUS_PREV             7
+/* 8-9 were used for XEMBED_GRAB_KEY/XEMBED_UNGRAB_KEY */
+#define XEMBED_MODALITY_ON            10
+#define XEMBED_MODALITY_OFF           11
+#define XEMBED_REGISTER_ACCELERATOR   12
+#define XEMBED_UNREGISTER_ACCELERATOR 13
+#define XEMBED_ACTIVATE_ACCELERATOR   14
+
+/* Details for  XEMBED_FOCUS_IN: */
+#define XEMBED_FOCUS_CURRENT		0
+#define XEMBED_FOCUS_FIRST 		1
+#define XEMBED_FOCUS_LAST		2
+
 /* Typedef */
 typedef const char*    uicb_t;
 typedef unsigned int   uint;
@@ -203,7 +225,7 @@ typedef struct
      BarWindow *tags[MAXTAG];
      XRectangle geo;
      int position;
-     char statustext[1024];
+     char *statustext;
 } InfoBar;
 
 /* Layout Structure */

+ 35 - 9
src/wmfs.c

@@ -107,6 +107,7 @@ quit(void)
      IFREE(keys);
      IFREE(func_list);
      IFREE(layout_list);
+     IFREE(net_atom);
 
      /* Clean conf alloced thing */
      IFREE(menulayout.item);
@@ -313,16 +314,38 @@ exec_uicb_function(char *func, char *cmd)
  *\param str Statustext string
 */
 void
-set_statustext(char *str)
+set_statustext(int s, char *str)
 {
+     int i;
      long data[5];
+     char atom_name[64];
 
      data[4] = True;
 
-     XChangeProperty(dpy, ROOT, ATOM("_WMFS_STATUSTEXT"), ATOM("UTF8_STRING"),
-                     8, PropModeReplace, (uchar*)str, strlen(str));
+     if(!str)
+          return;
+
+     if(s == -1)
+     {
+          for(i = 0; i < screen_count(); ++i)
+          {
+               sprintf(atom_name, "_WMFS_STATUSTEXT_%d", i);
+
+               XChangeProperty(dpy, ROOT, ATOM(atom_name), ATOM("UTF8_STRING"),
+                         8, PropModeReplace, (uchar*)str, strlen(str));
 
-     send_client_event(data, "_WMFS_STATUSTEXT");
+               send_client_event(data, atom_name);
+          }
+     }
+     else
+     {
+          sprintf(atom_name, "_WMFS_STATUSTEXT_%d", s);
+
+          XChangeProperty(dpy, ROOT, ATOM(atom_name), ATOM("UTF8_STRING"),
+                         8, PropModeReplace, (uchar*)str, strlen(str));
+
+          send_client_event(data, atom_name);
+     }
 
      return;
 }
@@ -348,6 +371,7 @@ int
 main(int argc, char **argv)
 {
      int i;
+     char *ol = "csgV";
 
      argv_global  = _strdup(argv[0]);
      sprintf(conf.confpath, "%s/"DEF_CONF, getenv("HOME"));
@@ -356,8 +380,7 @@ main(int argc, char **argv)
      {
 
           /* For options who need WMFS running */
-          if((i == 'c' || i == 's' || i == 'g' || i == 'V')
-             && !(dpy = XOpenDisplay(NULL)))
+          if(strchr(ol, i) && !(dpy = XOpenDisplay(NULL)))
           {
                fprintf(stderr, "WMFS: cannot open X server.\n");
                exit(EXIT_FAILURE);
@@ -367,11 +390,11 @@ main(int argc, char **argv)
           {
           case 'h':
           default:
-               printf("usage: %s [-ihv] [-C <file>] [-c <uicb function> <cmd> ] [-g <argument>] [-s <string>] [-V <viwmfs cmd]\n"
+               printf("usage: %s [-ihv] [-C <file>] [-c <uicb function> <cmd> ] [-g <argument>] [-s <screen_num> <string>] [-V <viwmfs cmd]\n"
                       "   -C <file>                 Load a configuration file\n"
                       "   -c <uicb_function> <cmd>  Execute an uicb function to control WMFS\n"
                       "   -g <argument>             Show information about wmfs status\n"
-                      "   -s <string>               Set the bar(s) statustext\n"
+                      "   -s <screen_num> <string>  Set the bar(s) statustext\n"
                       "   -V <viwmfs cmd>           Manage WMFS with vi-like command\n"
                       "   -h                        Show this page\n"
                       "   -i                        Show informations\n"
@@ -404,7 +427,10 @@ main(int argc, char **argv)
                break;
 
           case 's':
-               set_statustext(optarg);
+               if(argc > 3)
+                    set_statustext(atoi(optarg), argv[3]);
+               else
+                    set_statustext(-1, optarg);
                XCloseDisplay(dpy);
                exit(EXIT_SUCCESS);
                break;

+ 2 - 3
src/wmfs.h

@@ -327,7 +327,7 @@ void mainloop(void);
 void scan(void);
 Bool check_wmfs_running(void);
 void exec_uicb_function(char *func, char *cmd);
-void set_statustext(char *str);
+void set_statustext(int s, char *str);
 void handle_signal(int signum);
 void uicb_quit(uicb_t);
 void uicb_reload(uicb_t);
@@ -341,7 +341,6 @@ int selscreen;
 Conf conf;
 Key *keys;
 Bool exiting;
-char *statustext;
 XRectangle *sgeo;
 XRectangle *spgeo;
 Cursor cursor[CurLast];
@@ -352,7 +351,7 @@ int xrandr_event;
 XftFont *font;
 
 /* Atoms list */
-Atom net_atom[net_last];
+Atom *net_atom;
 
 /* InfoBar/Tags */
 InfoBar *infobar;

+ 3 - 3
wmfs.1

@@ -13,7 +13,7 @@
 .SH "NAME"
 wmfs \- Window Manager From Scratch
 .SH "SYNOPSIS"
-\fBwmfs\fR [\fB\-ihv\fR] [\fB\-C <file>\fR] [\fB\-c <uicb_function> <cmd>\fR] [\fB\-g <argument>\fR] [\fB\-s <string>\fR]  [\fB\-V <viwmfs cmd>\fR]
+\fBwmfs\fR [\fB\-ihv\fR] [\fB\-C <file>\fR] [\fB\-c <uicb_function> <cmd>\fR] [\fB\-g <argument>\fR] [\fB\-s <screen_num> <string>\fR]  [\fB\-V <viwmfs cmd>\fR]
 .sp
 .SH "DESCRIPTION"
 \fBWMFS\fR is a basic, lightweight and dynamic tiling windows manager for X\&.
@@ -35,9 +35,9 @@ Execute an uicb function to control WMFS\&.
 Show information about wmfs status\&.
 .RE
 .PP
-\fB\-s <string>\fR
+\fB\-s <screen_num> <string>\fR
 .RS 4
-Set the bar(s) statustext\&.
+Set the bar(s) statustext. If the screen number is not specified, the string will be show on all screens bars\&.
 .RE
 .PP
 \fB\-V <viwmfs cmd>\fR